我正在尝试制作一个程序,该程序使用原始套接字正确运行,具有Linux功能的非root用户。该计划如下:
#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;
}
如果我编译它并以非root身份运行它,我会收到错误,如预期的那样:
[user@localhost ~]$ make socket
cc socket.c -o socket
[user@localhost ~]$ ./socket
socket() error: Operation not permitted
如果我添加cap_net_raw
功能,作为有效且允许的功能,它可以正常工作。
[user@localhost ~]$ sudo setcap cap_net_raw+ep socket
[sudo] password for user:
[user@localhost ~]$ ./socket
[user@localhost ~]$
现在,我想使用pam_cap.so
来制作它,以便只有特定用户可以使用cap_net_raw
而不是每个人运行此程序。我的/etc/security/capability.conf
是:
cap_net_raw user
我的/etc/pam.d/login
是(请注意,我也尝试了/etc/pam.d/sshd
,但这似乎也没有用):
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth substack system-auth
auth include postlogin
#Added this line to use pam_cap
auth required pam_cap.so
account required pam_nologin.so
account include system-auth
password include system-auth
# pam_selinux.so close should be the first session rule
session required pam_selinux.so close
session required pam_loginuid.so
session optional pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session required pam_selinux.so open
session required pam_namespace.so
session optional pam_keyinit.so force revoke
session include system-auth
session include postlogin
-session optional pam_ck_connector.so
我有一个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_net_raw
执行'套接字'程序?我认为当我登录时,我的用户会将其作为允许的功能获取,并允许“用户”使用cap_net_raw
运行“套接字”。
这就是我正在运行的:
[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)
答案 0 :(得分:1)
我发现我的文件功能错误了。为了使进程能够从pam_cap模块获得有效的功能,该文件也需要配置“继承”功能。因此,在文件上设置上限应为:
sudo setcap cap_net_raw+ip socket
但是,我仍然只能让程序从正常的tty登录成功,而不是ssh登录。