带有cap_net_bind_service的脚本无法侦听端口80

时间:2016-07-12 06:14:02

标签: linux linux-capabilities

我正在尝试给脚本cap_net_bind_service Linux capability。但是使用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无效,并且无法弄清楚如何调试它。

2 个答案:

答案 0 :(得分:2)

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

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

我遇到了类似的问题,除了我试图在Systemd下使用Python服务器。我发现我需要设置'Ambient'功能集。我想这就是继承的东西。以下是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

感谢您的提问。它给了我一个学习更多东西的机会。

干杯, 卡梅伦

答案 1 :(得分:0)

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

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