将linux功能分配给一个java进程

时间:2015-10-08 20:13:48

标签: java c linux execv linux-capabilities

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

在做了一些研究之后,我认为我必须编写一个c包装程序并为该程序提供上述功能,java进程将在execv中继承。 另一项研究表明,可以通过systemd分配功能。

我不知道如何使用systemd功能选项以及它是否可行。

有人可以指导我走哪条路以及如何做到这一点?感谢

1 个答案:

答案 0 :(得分: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。