2016-07-12 4 views
1

Я пытаюсь дать сценарий cap_net_bind_service Linux capability. Однако использование setcap не работает.Сценарий с cap_net_bind_service не может прослушивать порт 80

$ 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 ([email protected]) (gcc version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)) #1 SMP Wed May 4 23:56:27 UTC 2016 

Я немного потерял в этот момент, попытались выключая firewalld никакого эффекта, и не могу понять, как отладить это.

+1

Я бы сказал, это питон, который хочет использовать привилегированный порт, а не оболочка-скрипт, который выполняет программу питона. –

+0

Вот и все. Нечетный, потому что я думал, что -i означает «унаследованный», поэтому любые дочерние процессы или исполнители сценария bash также будут иметь возможности. –

ответ

0

Возможности файла, применяемые к скриптам (исполняемые файлы с заголовками shebang), не будут иметь никакого эффекта. Вместо этого вам нужно применить возможности к двоичному интерпретатору, используемому для выполнения скрипта (обычно это команда, упомянутая в заголовке shebang).

В вашем случае просто примените возможности к исполняемому файлу python.

1

setcap (8) только устанавливает возможности для файлов. Когда дело доходит до переводчиков, я думаю, что вы находитесь в грубой поездке. возможности (7) - я читаю из RHEL 7.4 - списки возможностей «Thread», а также возможности «File». В наборах «Thread» существует понятие «Ambient», а также «Inheritable». Важным отличием является то, что «наследуемые возможности обычно не сохраняются в execve (2) при работе как пользователь без полномочий root», вы должны установить набор возможностей Ambient.

Примечание: RHEL 7 (7.4) имеет это обратное. Возможности «Ambient», по-видимому, появились в Linux 4.3, а RHEL 7 номинально является ядром серии 3.10.

Я ударил аналогичную проблему, как и вы, за исключением того, что я пытался использовать сервер Python под Systemd. Я обнаружил, что мне нужно установить настройку «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 

Спасибо за вопрос. Это дало мне возможность узнать немного больше.

Приветствия, Cameron