C 如何使用PAM功能模块向特定用户和可执行文件授予功能?
我正试图使一个使用原始套接字的程序以非root的身份正确运行,并具有Linux功能。计划如下:C 如何使用PAM功能模块向特定用户和可执行文件授予功能?,c,linux,sockets,pam,linux-capabilities,C,Linux,Sockets,Pam,Linux Capabilities,我正试图使一个使用原始套接字的程序以非root的身份正确运行,并具有Linux功能。计划如下: #include <netinet/ip.h> int main() { int sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP); if(sd < 0) { perror("socket() error"); return 1; } return 0; } 如果我添加cap\u net\u raw功能,作
#include <netinet/ip.h>
int main()
{
int sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);
if(sd < 0)
{
perror("socket() error");
return 1;
}
return 0;
}
如果我添加cap\u net\u raw
功能,作为一种有效且允许的功能,它会起作用
[user@localhost ~]$ sudo setcap cap_net_raw+ep socket
[sudo] password for user:
[user@localhost ~]$ ./socket
[user@localhost ~]$
现在,我想使用pam\u cap.so
使其成为只有特定用户才能使用cap\u net\u raw
运行此程序,而不是所有人。我的/etc/security/capability.conf
是:
cap_net_raw user
我的/etc/pam.d/login
是(注意,我也尝试了/etc/pam.d/sshd
,但似乎也不起作用):
我有一个ssh会话,之后我注销并重新登录,并执行以下命令:
[user@localhost ~]$ sudo setcap cap_net_raw+p socket
[sudo] password for user:
[user@localhost ~]$ getcap socket
socket = cap_net_raw+p
[user@localhost ~]$ ./socket
socket() error: Operation not permitted
[user@localhost ~]$
我的问题是:为什么我不能用cap\u net\u raw
执行“socket”程序?我认为当我登录时,我的用户将获得它作为允许的功能,并且它将允许“用户”使用cap\u net\u raw
运行“socket”
这就是我正在运行的:
[user@localhost ~]$ uname -a
Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[user@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
我发现我在文件上有错误的功能。为了使流程能够从pam_cap模块获得有效的功能,文件还需要配置“继承”功能。因此,在文件上设置上限应为:
sudo setcap cap_net_raw+ip socket
但是,我仍然只能通过正常的tty登录而不是ssh登录来成功地运行程序
[user@localhost ~]$ uname -a
Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
[user@localhost ~]$ cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)
sudo setcap cap_net_raw+ip socket