2

我运行了许多 java 进程,但我只想将 cap_net_raw linux 功能分配给一个 java 进程。目前,如果我执行此“setcap cap_net_raw=ep /usr/java/default/bin/java”,则此功能将分配给所有 java 进程。

在做了一些研究之后,我认为我将不得不编写 ac 包装程序并将上述功能赋予该程序,java 进程将在 execv 中继承。另一项研究表明,可以通过 systemd 分配能力。

我不确定如何使用 systemd 功能选项,以及它是否是一个可行的选项。

有人可以指导我走哪条路以及该怎么做吗?谢谢

4

1 回答 1

1

我写了一个包装器(使用另一篇stackoverflow文章)来实现这一点。

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

在我的一个应用程序的 systemctl 配置文件中添加了 capjava。

于 2015-10-09T19:57:09.220 回答