Почему 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?

Erik
источник
связанные: serverfault.com/questions/310764/…
Дан
Можете ли вы задать другой вопрос вместо этого.
Брайам
Нет, потому что это связано с этим постом. Пожалуйста, повторите ваши изменения.
Эрик

Ответы:

49

Процесс, который вы заметили, является основным процессом, который запускает все остальные процессы nginx. Этот процесс запускается сценарием инициализации, который запускает nginx. Причина, по которой этот процесс выполняется от имени пользователя root, заключается в том, что вы просто запустили его как пользователь root! Вы можете запустить его как другой пользователь, но вам нужно будет убедиться, что все ресурсы, необходимые nginx, доступны для этого пользователя. Обычно это будет / var / log / nginx и pid-файл в / var / run /.

Самое главное; Только корневые процессы могут прослушивать порты ниже 1024. Веб-сервер обычно работает на порте 80 и / или 443. Это означает, что его нужно запускать с правами root.

В заключение, главный процесс, запускаемый пользователем root, является полностью нормальным и в большинстве случаев необходим для нормальной работы.

Изменить: Запуск чего-либо от имени пользователя root несет в себе скрытую угрозу безопасности. Обычно разработчики этого вида программного обеспечения много знают о векторах атак и очень стараются выполнить как можно меньше, чем root. В конце концов, вы просто должны верить, что программное обеспечение хорошего качества.

Если вы все еще чувствуете себя неловко, есть способ запустить nginx от имени другого пользователя и по-прежнему использовать порты ниже 1024. Вы можете использовать iptables для перенаправления всего входящего трафика через порт 80 на другой порт, например 8080, и прослушивать nginx на этом порту.

arnefm
источник
Но как насчет безопасности? Кто-нибудь может взломать сервер через этот корневой процесс?
Эрик
Обновил мой ответ.
arnefm
Делать что-то в iptablesэто, вероятно, излишне. Я бы увидел ответ @ slm.
Братчли
Порты <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-сервера, поскольку приложения - это сервисы, которые предоставляют точки входа для искаженных данных, которые будут внедрены в стек вашего сервера.

Apache & Nginx, как правило, не принимают никаких входных данных, кроме методов GET / POST, которые они принимают.

SLM
источник
5
«так что на самом деле вы ничего не можете сделать, если хотите, чтобы сервер прослушивал, скажем, порты 80 или 443.» Файловые возможности на самом деле могут дать всем пользователям исполняемый файл CAP_NET_BIND_SERVICE, но вы, вероятно, сделаете это только в том случае, если вы были исключительно параноиком.
Братчли
6

Это способ упаковки приложения. На большинстве * nix настройкой по умолчанию является непривилегированный пользователь, который не может прослушивать порт <1024, а веб-серверы используют 80 и 443.

Linux 2.2+, Solaris 10+ и FreeBSD позволяют пользователям без полномочий root прослушивать порты ниже 1024, но только по умолчанию. Большинство согласилось на использование, rootпоэтому оно остается в использовании.

Помимо доступа к привязке к привилегированному порту, вам нужно убедиться, что у пользователя, работающего с nginx, есть доступ ко всем нужным файлам. Вам, вероятно , не нужно заходить так далеко, но просто установите правильное разрешение для файлов / каталогов. Вы также должны убедиться, что загрузочные скрипты не делают ничего хитрого, как ulimitизменения (как всегда кажется mysql).

Возможности Linux

setcapи getcapпозволит вам изменить или просмотреть 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
Matt
источник
2

Я хотел бы добавить к каждому остальное ответы. Хотя nginx запускается от имени пользователя root, на самом деле он не работает от имени пользователя root. Пользователь (nginx, www-data и т. Д.), С которым он на самом деле работает, обычно является закрытым / закрытым логином (вы не можете войти с ним, доступны только определенные файлы). Это один из плюсов использования Linux для веб-серверов, в отличие от Windows. Этот процесс называется a fork( вы можете найти более подробную информацию в этой статье Википедии ), и он также использует setuidи / или setgid( что также объясняется в статье Википедии)) изменить пользователя и / или группу. В безопасной настройке хакер не сможет получить доступ к родительскому процессу и использовать корневую учетную запись. Это не всегда так, поскольку хакер может использовать какой-либо эксплойт для получения root-доступа (в nginx 1.4.0 и ниже была уязвимость, которая позволяла хакерам получить root-доступ).

ub3rst4r
источник
1
> Это один из плюсов использования Linux для веб-серверов в отличие от Windows. Извините, но я не покупаю этот аргумент. Windows также позволяет учетным записям служб с отключенным интерактивным входом в систему, а также поддерживает списки ACL. Тем не менее, есть и другие причины, по которым Apache httpd и Nginx не следует запускать в Windows (предпочтительнее IIS) без смягчающих обстоятельств, но это не относится к делу.
Боб