Die systemd-Unit-Datei, die mit dem nginx-common-Paket geliefert wird, führt den Master-Prozess als root aus, was mich nervös macht.
Ich gehe davon aus, dass der einzige Grund, warum es als root ausgeführt wird, darin besteht, Port 80 zu binden, aber root zu sein, ist dafür übertrieben, also führe ich es als normaler Benutzer aus und gebe ihm die CAP_NET_BIND_SERVICE
Fähigkeit.
Ich habe die Gerätedatei so angepasst, dass sie folgendermaßen aussieht:
[Service]
Type=forking
PIDFile=/var/run/nginx/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=/usr/sbin/nginx -s quit
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
Capabilities=cap_net_bind_service+=ep
user=www-data
Gibt es Nachteile bei diesem Ansatz? Erwartet Nginx aus einem anderen Grund Root? Gibt es eine bessere Möglichkeit, Nginx zu sperren? Ich weiß, dass einige Leute es gerne chrooten, aber das scheint eine Menge Ärger zu sein.
Antworten:
Der Master-Prozess muss als Root ausgeführt werden, da sonst Nginx nicht an Port 80 binden kann, da dies ein privilegierter Port ist.
http://www.w3.org/Daemon/User/Installation/PrivilegedPorts.html
Sie sollten stattdessen sicherstellen, dass die Worker-Prozesse einen anderen Benutzer verwenden. Dieser Benutzer kann in Ihrem angegeben werden
nginx.conf
.quelle
CAP_NET_BIND_SERVICE
Fähigkeit haben, müssen Sie nicht root sein, um einen privilegierten Port zu binden.