Назначение возможности linux одному процессу java
Я запускаю много Java-процессов, но я просто хочу назначить возможность linux cap_net_raw только одному Java-процессу. В настоящее время, если я сделаю это "setcap cap_net_raw = ep / usr / java / default / bin / java", то эта возможность будет назначена всем процессам java.
Проведя некоторые исследования, я решил, что мне нужно будет написать программу-обертку ac и предоставить вышеупомянутую возможность этой программе, и процесс java будет наследоваться в execv. Другое исследование говорит, что возможность может быть назначена через systemd.
Я не уверен, как использовать возможность systemd и является ли она приемлемой.
Может кто-нибудь подсказать мне, по какому пути и как именно это сделать? Спасибо
1 ответ
Я написал обертку (используя другую статью stackru) для достижения этой цели.
capjava.c:
#include <sys/capability.h>
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv[]) {
char *cmd;
char **argvp;
int ret = 0;
cap_t caps = cap_get_proc();
printf("Capabilities: %s\n", cap_to_text(caps, NULL));
cap_value_t newcaps[1] = { CAP_NET_RAW, };
cap_set_flag(caps, CAP_INHERITABLE, 1, newcaps, CAP_SET);
cap_set_proc(caps);
printf("\nNew Capabilities: %s\n", cap_to_text(caps, NULL));
cap_free(caps);
argvp = &argv[1];
cmd = argvp[0];
printf("cmd is %s\n", cmd);
ret = execv(cmd, argvp);
printf("\n return value of execv is %d\n", ret);
}
Теперь добавлены разрешения:
[root @ localhost ~] # setcap cap_net_raw = p / sbin / capjava [root @ localhost ~] # setcap cap_net_raw = ei / usr / java / latest / bin / java
добавил capjava в конфигурационный файл systemctl для одного из моих приложений.