3

我正在尝试为脚本提供 cap_net_bind_service Linux 功能。但是使用 setcap 似乎不起作用。

$ cat listen.sh 
#!/bin/bash

python -m SimpleHTTPServer 80
$ getcap listen.sh 
listen.sh =
$ sudo setcap cap_net_bind_service=+eip ./listen.sh 
$ getcap listen.sh 
listen.sh = cap_net_bind_service+eip
$ ls -al listen.sh 
-rwxrwxr-x. 1 eric eric 43 Jul 11 23:01 listen.sh
$ ./listen.sh 
Traceback (most recent call last):
  File "/usr/lib64/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  ...
  File "/usr/lib64/python2.7/SocketServer.py", line 434, in server_bind
    self.socket.bind(self.server_address)
  File "/usr/lib64/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
socket.error: [Errno 13] Permission denied

使用 sudo 仍然可以正常工作。

$ sudo ./listen.sh 
Serving HTTP on 0.0.0.0 port 80 ...

这是在 Fedora 23 工作站上。

$ cat /proc/version 
Linux version 4.4.9-300.fc23.x86_64 (mockbuild@bkernel02.phx2.fedoraproject.org) (gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC) ) #1 SMP Wed May 4 23:56:27 UTC 2016

在这一点上我有点迷茫,尝试关闭firewalld无效,并且无法弄清楚如何调试它。

4

2 回答 2

3

setcap(8) 只设置文件的功能。谈到口译员,我认为你会遇到困难。能力(7)——我正在阅读 RHEL 7.4——列出“线程”能力集以及“文件”能力。在“线程”功能集中,有“环境”集和“可继承”的概念。重要的区别是“以非 root 用户身份运行时,通常不会在 execve(2) 中保留可继承的功能”,您应该设置 Ambient 功能集。

注意:RHEL 7 (7.4) 已向后移植。“环境”功能显然出现在 Linux 4.3 中,而 RHEL 7 名义上是 3.10 系列内核。

我遇到了和你类似的问题,除了我试图在 Systemd 下使用 Python 服务器。我发现我需要设置“环境”功能集。我想这就是继承的。这是一个示例 Systemd 单元文件:

[Unit]
Description=Docker Ident Service
After=network.target
Wants=docker.service

[Service]
Type=simple
ExecStart=/usr/local/sbin/docker-identd
Restart=on-failure
RestartSec=43s

User=docker-identd
Group=docker

CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true

Nice=12

StandardOutput=syslog
StandardError=syslog
SyslogFacility=daemon
SyslogIdentifier=docker-identd
SyslogLevel=info

[Install]
WantedBy=multi-user.target

谢谢你的问题。它给了我一个学习更多的机会。

如需进一步了解环境功能在实践中的工作原理,请查看Kubernetes 应配置环境功能集 #56374

干杯,卡梅伦

于 2017-11-02T00:43:48.347 回答
1

应用于脚本的文件功能(带有 shebang 标头的可执行文件)不会产生任何影响。相反,您需要将这些功能应用于用于执行脚本的二进制解释器(通常是 shebang 标头中提到的命令)。

在您的情况下,只需将功能应用于python可执行文件。

于 2017-04-12T07:08:07.797 回答