Запуск Apache от имени другого пользователя

10

Когда я запускаю ps -efHкоманду, чтобы вывести список всех процессов, я вижу, что Apache работает как rootи, кажется, что подпроцессы выполняются как www-data. Вот выдержка:

root     30117     1  0 09:10 ?        00:00:00   /usr/sbin/apache2 -k start
www-data 30119 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start
www-data 30120 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start
www-data 30121 30117  0 09:10 ?        00:00:00     /usr/sbin/apache2 -k start

Могу ли я заставить Apache и все подпроцессы работать от имени другого пользователя apache2d:apache2d? Если так, то как? Я где-то читал, что настройки для этого можно найти, /etc/apache2/httpd.confно этот файл кажется пустым? Можно ли это сделать, изменив владельца и группу /etc/init.d/apache2скрипта, а затем установив для него флаг setuid?

Мриданг Агарвалла
источник

Ответы:

21

Apache должен изначально запускаться от имени root, чтобы привязаться к порту 80. Если вы не запускаете его как root изначально, вы не сможете привязать к порту 80. Если вы хотите привязать к какому-либо порту выше 1024, тогда да, вы можете. В противном случае не беспокойтесь о root. Это родительский процесс Apache и не обслуживает никаких запросов. Это порождает дочерние процессы и удаляет привилегии для обработки запросов.

Для того, чтобы изменить пользователь Apache установить Userи Groupпараметры в вашей Apache конфигурации.

bahamat
источник
Что ж, извините за отступление, но я заметил, что haproxy может работать как haproxy (не как root) и связывать порт tcp 80. Как это достигается? Любое просветление?
kiiwii
1
Это не так. Процессы могут связываться с портами до 1024, только если у них есть привилегия суперпользователя. Таким образом, haproxy либо запускается с правами root и отбрасывает привилегии (вероятно), либо setuid root (маловероятно).
багамат
Вам не нужно запускать его с правами root, вам просто нужно разрешить доступ вашего пользователя «apache» к запрещенным портам (т. Е. Ниже 1024). Этот ответ объясняет, как вы можете использовать «authbind» для этого: superuser.com/questions/710253/…
Animal451
4

@bahamat объясняет это довольно хорошо, но я добавлю немного больше деталей.

В ходе нормальной работы процесс apache, принадлежащий корню, не будет выполнять никаких реальных операций, кроме прослушивания порта 80 и пересылки входящих соединений его дочерним (безопасно непривилегированным, как www-dataпользователю).

Расположение главного файла конфигурации зависит от параметров времени компиляции и варьируется в зависимости от дистрибутива, но /etc/apache2/apache2.confявляется хорошим начальным предположением.

Кроме того, если вы настраиваете многопользовательскую систему веб-хостинга , возможно, вы захотите взглянуть на SuExec и fcgid, чтобы процесс apache каждого отдельного пользователя веб-хостинга выполнялся как указанный пользователь - так что, если один пользователь небрежно относится к своей безопасности, другой пользователи не будут затронуты.

Shadur
источник
3

По крайней мере, в Ubuntu настройки для этого есть /etc/apache2/envvars. Настройте их, затем перезапустите Apache, и все готово.

mlissner
источник
Спасибо, это помогло мне! Я устанавливаю Ubuntu Vagrant Box, и по какой-то причине /etc/apache2/httpd.conf не использовался для загрузки пользователя и группы. envars, кажется, делает свое дело!
Грег
2

Также ознакомьтесь с Apache2 ITK MPM .

Он разветвляет поток Apache с назначенным uid/ gid, это позволяет вам продолжать использовать mod_php. Не более chmod/ chownи т. Д.

Олли
источник
Проголосование за mpm_itkкоторое является значительным улучшением по сравнению с suexec / fcgid
Шадур
0

Mac OS X:

То, что сработало для меня, входит в конфигурационный файл apache:

/etc/apache2/httpd.conf

В этом файле я искал пользователя или группу

и наткнулся на:

User _www
Group _www

Я изменил его на то, что когда-либо понадобилось пользователю / группе (в моем случае, пользователю / группе, который является владельцем файлов моего веб-приложения, которые вы можете видеть. И это вы можете проверить с помощью простого 'ls -l'). команда)

Меркурий
источник