5

我正在尝试使一个使用原始套接字的程序以具有 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 ~]$ 

我的问题是:为什么我不能用 'socket' 程序执行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) 
4

2 回答 2

1

我发现我在文件上有错误的功能。为了让进程能够从 pam_cap 模块获得有效的能力,该文件也需要配置“继承”能力。因此,在文件上设置上限应该是:

sudo setcap cap_net_raw+ip socket

但是,我仍然只能通过正常的 tty 登录而不是 ssh 登录使程序成功运行。

于 2016-04-26T19:15:36.160 回答
0

我在尝试使用 Google 跳转到pam_cap.so文档时遇到了这个问题。

用于setcap设置此二进制文件以供使用的pam_cap.so方法是:

sudo setcap cap_net_raw=ie socket

也就是说,i指示二进制文件将进程可继承的能力标志提升为进程允许的p能力,并且遗留 e指示内核在调用程序时提高其在进程的有效标志中的值。

e如果您想使用libcapscap_set_proc()函数从程序内部引发 Effective 标志,您可以跳过该部分。就像是:

    cap_t c = cap_get_proc();
    cap_fill(c, CAP_EFFECTIVE, CAP_PERMITTED);
    cap_set_proc(c);
    cap_free(c);

FWIW 我最近写了一篇关于在现代内核中继承功能的各种方法的文章。

于 2021-10-02T02:51:16.513 回答