为什么Nginx以root身份启动进程?


39

我已经安装了nginx服务器。我刚刚检查了监听端口,并看到了以下内容:

$ sudo lsof -nP -i | grep LISTEN
sshd       614     root    3u  IPv4   7712      0t0  TCP *:22 (LISTEN)
nginx      822     root    7u  IPv4   8745      0t0  TCP *:80 (LISTEN)
nginx      827 www-data    7u  IPv4   8745      0t0  TCP *:80 (LISTEN)
nginx      828 www-data    7u  IPv4   8745      0t0  TCP *:80 (LISTEN)
nginx      829 www-data    7u  IPv4   8745      0t0  TCP *:80 (LISTEN)
nginx      830 www-data    7u  IPv4   8745      0t0  TCP *:80 (LISTEN)
.
.
.

我只是很感兴趣,为什么有四个Nginx进程以“ www-data”用户身份运行,而一个以“ root用户”身份运行?



你能问另一个问题吗?
Braiam 2014年

否,因为这与此帖子有关。请重做您的更改。
Erik

Answers:


49

您注意到的流程是主流程,即启动所有其他nginx流程的流程。此过程由启动Nginx的初始化脚本启动。该进程以root身份运行的原因仅仅是因为您以root身份启动了它!您可以以其他用户身份启动它,但必须确保该用户可以使用nginx所需的所有资源。通常至少是/ var / log / nginx和/ var / run /下的pid文件。

最重要的是; 只有root进程才能侦听1024以下的端口。Web服务器通常在端口80和/或443上运行。这意味着它需要以root身份启动。

总之,由root用户运行的主进程是完全正常的,并且在大多数情况下对于正常操作是必需的。

编辑:以root身份运行任何内容都会带来隐式的安全风险。通常,这种软件的开发人员对攻击媒介有很多了解,并非常小心地执行尽可能少的root用户。最后,您只需要相信该软件的质量即可。

如果您仍然感到不安,则可以使用另一种方式运行nginx并仍然使用1024以下的端口。您可以使用iptables将端口80上的所有传入流量重定向到另一个端口(例如8080),并使nginx侦听该端口。


但是安全性又如何呢?有人可以通过这个根进程来入侵服务器吗?
Erik

更新了我的答案。
arnefm 2014年

在其中做某事iptables可能是过大的。我会看到@slm的答案。
布拉奇利2014年

正如Joel提到的,在大多数地方,端口<1024都是可能的,并且重定向iptables可能会使事情变得混乱。
马特

17

大多数服务器(Apache,Nginx等)都有一个父进程,该进程由root拥有,然后使用不太受信任的用户将工作程序节点的副本分叉。在这种情况下为www-data

如果查看nginx的配置文件/etc/nginx/nginx.conf,您会注意到类似以下内容的行:

user nginx;
worker_processes 2; #change to the number of your CPUs/Cores
worker_rlimit_nofile 8192;

大多数服务器具有与此类似的选项,这些选项规定了哪个用户运行从属节点以及其中有多少个。

安全

经常公开具有根访问权限的服务是一种潜在的不安全因素。但是,您通常必须是root用户才能绑定范围为1-1024的端口,因此,如果您希望服务器监听80或443端口,则实际上您无能为力。

同样,如果服务编写得当且配置正确,则它本身不一定对您的安全状况有害。在Apache&Nginx之上运行的应用程序确实是缓冲区溢出或SQL Server注入攻击的真正原因,因为这些应用程序是暴露将错误数据注入服务器堆栈的入口点的服务。

Apache&Nginx本身通常不接受他们接受的GET / POST方法之外的任何输入。


5
“因此,如果您希望服务器在端口80或443上进行侦听,那么您实际上无能为力。” 文件功能实际上可以为可执行文件CAP_NET_BIND_SERVICE的所有用户提供服务,但只有在极度偏执的情况下,您才可能这样做。
布拉奇利2014年

6

这是应用程序打包的方式。在大多数* nix上,默认设置是非特权用户无法在<1024的端口上侦听,并且Web服务器使用80和443。

Linux 2.2 +,Solaris 10+和FreeBSD都允许非root用户在低于1024的端口上侦听,只是默认情况下不允许。大多数人已经接受使用,root因此仍在使用。

除了访问绑定到特权端口的权限外,您还需要确保运行nginx的用户有权访问其所需的所有文件。您可能不需要这样做,而只需对文件/目录设置正确的权限。您还需要检查启动脚本是否不会做出任何卑鄙的ulimit更改(例如mysql似乎总是如此)。

Linux功能

setcapgetcap让您更改或查看cap_net_bind_service可执行文件的功能。这对执行二进制文件的任何人都有效。

setcap cap_net_bind_service=+ep /usr/sbin/nginx

SELinux提供了在用户级别配置和控制功能的能力。

Freebsd系统设置

保留的端口设置是系统全局的

sysctl net.inet.ip.portrange.reservedhigh=0
sysctl net.inet.ip.portrange.reservedlow=0

Solaris特权

Solaris在用户级别提供对特权的细粒度控制。这些是apache的特权,但它们也可能也适用于nginx。

/usr/sbin/usermod -K defaultpriv=basic,proc_exec,proc_fork,net_privaddr nginx

2

我想补充大家的答案。尽管nginx以root身份启动,但实际上并没有以root身份运行。实际运行的用户(nginx,www-data等)通常是受限制的/ jailed登录(您不能使用它登录,只能访问某些文件)。与Windows相比,这是将Linux用于Web服务器的优点之一。此过程称为a fork您可以在此Wikipedia文章中找到更多详细信息),并且它也使用setuid和/或setgidWikipedia文章中对此也有说明))更改用户和/或组。在安全设置中,黑客将无法访问父进程并利用根帐户。这并不总是正确的,因为黑客可以利用某种漏洞利用来获得root访问权限(nginx 1.4.0及更低版本中存在一个漏洞,允许黑客获得root访问权限)。


1
>这是将Linux用于Web服务器而不是Windows的优点之一。抱歉,但我不赞成这种说法。Windows同样允许禁用交互式登录的服务帐户,并且还支持ACL。就是说,还有其他原因导致Apache httpd和Nginx不应在Windows环境下运行(首选IIS)而不会加剧情况,但这是本文的重点。
鲍勃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.