【发布时间】:2019-03-30 16:06:36
【问题描述】:
我正在尝试启动一个具有网络权限的程序,以便它可以执行 iptables 而不是 root 用户。我需要CAP_NET_ADMIN 是可继承和允许的。似乎在启动可执行文件时清除了可继承标志,但无效或不允许:
Script started on Thu 25 Oct 2018 11:09:45 PM UTC
[ec2-user@ip-172-31-16-197 cap_question]$ cat caps.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/capability.h>
int main(int argc, char **argv) {
cap_t caps = cap_get_proc();
printf("Inside the executable [%s]\n", argv[0]);
char *cap_text = cap_to_text(caps, NULL);
printf("capabilities %s\n", cap_text);
cap_free(cap_text);
cap_free(caps);
}
[ec2-user@ip-172-31-16-197 cap_question]$ cc caps.c -o caps -lcap
[ec2-user@ip-172-31-16-197 cap_question]$ sudo setcap cap_net_admin=eip caps
[ec2-user@ip-172-31-16-197 cap_question]$ getcap caps
caps = cap_net_admin+eip
[ec2-user@ip-172-31-16-197 cap_question]$ ./caps
Inside the executable [./caps]
capabilities = cap_net_admin+ep
[ec2-user@ip-172-31-16-197 cap_question]$ exit
Script done on Thu 25 Oct 2018 11:10:25 PM UTC
如您所见,可执行文件为cap_net_admin=eip。但是当我实际运行它时,权限集是cap_net_admin=ep。我不明白为什么可执行文件在启动时会丢弃可继承。如果我去fork/exec iptables,它不会收到这些权限。
我已经多次阅读threads like these 和man capabilities,我能想到的最好解释是我的shell 没有cap_net_admin=i,所以子进程没有。如何根据需要设置可继承标志来启动进程?
【问题讨论】:
标签: c linux permissions file-permissions linux-capabilities