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

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

我已经安装了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 用户”运行?

答案1

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

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

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

编辑:以 root 身份运行任何内容都会带来隐含的安全风险。通常,此类软件的开发人员对攻击向量有很多了解,并且会非常小心地尽可能少地以 root 身份执行。最后,您只需相信该软件具有良好的质量即可。

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

答案2

大多数服务器(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 访问权限的服务经常被认为是一种潜在的不安全因素。然而,您通常必须是 root 才能绑定到 1-1024 范围内的端口,因此如果您希望服务器侦听端口 80 或 443,您实际上无能为力。

此外,如果服务编写良好且配置正确,它本身并不一定会对您的安全状况产生不利影响。在 Apache 和 Nginx 之上运行的应用程序实际上是缓冲区溢出或 SQL 服务器注入攻击的真正来源,因为这些应用程序是暴露要注入服务器堆栈的格式错误数据的入口点的服务。

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

答案3

这就是应用程序的打包方式。在大多数 *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

答案4

我想补充一下其他人的答案。虽然 nginx 是以 root 身份启动的,但它实际上并不是以 root 身份运行的。它实际运行的用户(nginx、www-data 等)通常是受限/监禁登录(您无法使用它登录,只能访问某些文件)。与 Windows 相比,这是使用 Linux 作为 Web 服务器的优点之一。这个过程称为fork您可以在这篇维基百科文章中找到更多详细信息)并且它还使用setuid和/或setgid(维基百科文章中也对此进行了解释) 更改用户和/或组。在安全设置中,黑客将无法访问父进程并利用根帐户。但这并不总是正确的,因为黑客可以利用某种漏洞来获得 root 访问权限(nginx 1.4.0 及以下版本中存在一个漏洞,允许黑客获得 root 访问权限)。

相关内容