Выясните, под каким пользователем работает Apache?

212

Я хочу защитить каталог загрузки файлов на моем сервере, как красиво описано здесь, но у меня есть одна проблема, прежде чем я смогу следовать этим инструкциям. Я не знаю, как работает пользователь Apache.

Я нашел предложение, что вы можете посмотреть в httpd.conf, и там будет строка «Пользователь», но в моем файле httpd.conf такой строки нет, поэтому я предполагаю, что Apache работает как пользователь по умолчанию. Я не могу узнать, что это такое, хотя.

Итак, мой вопрос (есть):

  • как узнать, что пользователь по умолчанию
  • мне нужно изменить пользователя по умолчанию
  • если ответ «да», и я изменил пользователя по умолчанию, отредактировав httpd.conf, это может что-то испортить?

Спасибо!

eikonomega
источник
12
почему этот вопрос был опущен? Да, оно было обновлено, поскольку на него уже дан ответ, но я не вижу необходимости в понижении голосов? Это очень хороший вопрос? Возможно, наш голосующий вниз хотел бы добавить конструктивный комментарий по этому поводу?
Брайан
2
Возможно, вы захотите опубликовать это обновление как ответ и принять его, так как вы находитесь в очереди без ответа.
Фахад Сада
7
+1 за то, что им сообщили в StackOverflow; некоторые пользователи, кажется, настаивают на
побеге
Связанного вопроса больше не существует
pal4life
Следующий вопрос: что делать, потому что его один из двух пользователей, как rootи www-data. Как вы даете «правильной» группе Apache разрешение на доступ к чему-либо?

Ответы:

228

ps aux | egrep '(apache|httpd)' как правило, покажет, что работает Apache.

Обычно вам не нужно менять пользователя по умолчанию, «nobody» или «apache» обычно хорошие пользователи. Пока это не "корень";)

edit: более точная команда для перехвата двоичных файлов apache

grufftech
источник
42
Да, или это будут www-данные в Ubuntu.
gravyface
10
... и Debian. :)
cubuspl42
7
Эта команда показывает мне список вещей, большинство из которых apacheкроме 1 root.
Пользователь
2
У меня есть 3 процесса ( /usr/sbin/apache2 -k start), один пользователь, rootа два других www-data. Должен ли я быть обеспокоен?
zundi
3
@zundi, служба запускается с правами root для выполнения таких вещей, как привязка к зарезервированным портам (например, 80 и 443). Затем он запускается независимо от заданного количества процессов для выполнения работы веб-сервера и выполнения любых других задач в соответствии с заданными пользователями. Таким образом, запросы обрабатываются непривилегированными процессами. Вы заметите, что родительский идентификатор (PPID) одинаков для всех других процессов. Эта идея с PID для этого одного процесса, работающего от имени пользователя root.
Кевин
41

Вы можете попробовать следующую команду:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'
nowthatsamatt
источник
1
Мне нравится этот ответ, лучше (более общий), чем самый одобренный ответ. Спасибо
pgr
14

Используйте apachectl -S, что покажет что-то пользователя и группы Apache, что-то вроде этого:

User: name="_www" id=70
Group: name="_www" id=70
Чжо
источник
Спасибо, на моем Mac я вижу, что Apache работает как «_www».
Меркурий
Это хороший ответ, потому что это одна команда, которая расскажет вам намного больше о вашем работающем веб-сервере и представит его всесторонне.
Контур
9

Согласно Ubuntuforums.org , в Ubuntu пользователь по умолчанию для apache2 - это www-data.

Видно быть правдой на Ubuntu 13.10 Saucy.


От Ларса Нудена на вышеуказанном форуме.

Чтобы убедиться, что [пользователь] действительно установлен, проверьте фактические файлы конфигурации. Файл зонтика apache2.confбудет выглядеть примерно так:

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Это ссылка на переменные среды, установленные в /etc/apache2/envvars. mod_suexecтакже позволяет запускать скрипты от имени другого пользователя и группы.

Чтобы найти любые виртуальные хосты, которые могут использовать альтернативных пользователей, группы или обоих, проверьте конфигурации.

$ egrep "^User|^Group|^SuexecUserGroup" /etc/apache2/apache2.conf /etc/apache2/sites-available/*.conf

Для дистрибутивов на основе Red Hat это будет (как правило, его пользователь, работающий с httpd apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Kevin
источник
8

Я знаю, что это старый пост, но он все еще указан как оставшийся без ответа, поэтому я сделаю предложение. Если вы не можете определить, какой пользователь или группа Apache работает, возможно, попробуйте открыть файл httpd.conf. Там должна быть запись для "Пользователь" и "Группа". Вы можете не только увидеть, какой пользователь Apache должен работать, но и изменить его, если почувствуете необходимость в этом.

kainosnous
источник
7

Вы можете включить строку кода в ваш скрипт PHP:

echo exec('whoami');
Дж. Г. Эстиот
источник
8
Обратите внимание, это показывает пользователя, под которым работает PHP, а не пользователя Apache. Если вы используете mod_php, это то же самое, но если, как сейчас очень часто, вы используете что-то другое (например, php_fpm), они могут легко отличаться.
benz001
5

Этот код - более или менее - в алфавитном порядке перечисляет всех пользователей без полномочий root, которые запускают процессы, содержащие apache(или чье имя содержит apache)

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq
user163193
источник
В этот список, вероятно, войдут пользователи, которые запускают такие процессы, как «grep apache», например, «хорошо себя».
mwfearnley
4
  • Чтобы узнать пользователя, вы можете просто использовать ps aux | grep apacheего во время работы.
  • Вам не нужно, но если Apache работает от имени пользователя root, возникают проблемы с безопасностью.
  • В-третьих, изменение пользователя Apache изменит его права на доступ к некоторым каталогам. Вы должны убедиться, что / var / www (или там, где у вас есть ваши сайты) доступны для нового пользователя и группы.
  • В системах, на которые я смотрел, apache всегда устанавливался с использованием apache: apache (или аналогичного) в качестве пользователя и группы, поэтому, вероятно, он уже должен быть установлен таким образом.

ПРИМЕЧАНИЕ. Это тот же ответ, который я дал на Stackoverflow .

Kjir
источник
2

Или вы можете проверить конфигурационный файл apache и найти владельца и группу.

AliGibbs
источник
2

Как предложил Нойо здесь :

APACHE_USER=$(ps axho user,comm|grep -E "httpd|apache"|uniq|grep -v "root"|awk 'END {if ($1) print $1}')

А потом:

echo $APACHE_USER
kenorb
источник
1
Получить пользователя (командная строка Ubuntu): echo $ APACHE_USER
Jadeye
1

Альтернативный подход, по крайней мере для дистрибутивов на основе Debian / Ubuntu, заключается в использовании того же метода, который Apache использует для установки своих пользователей и групп: source/etc/apache2/envvars !

$ echo "$(source /etc/apache2/envvars && echo "$APACHE_RUN_GROUP")"
www-data

Если вы хотите получить фантазию, вы можете подавить ошибки, если файл не найден, и указать значение по умолчанию:

$ apacheuser = $ (
     source / fail / etc / apache2 / envvars 2> / dev / null &&
     echo "$ APACHE_RUN_GROUP" ||
     эхо никому  
)
$ echo "$ apacheuser"
никто
MestreLion
источник
1

Я обнаружил, что большинство предлагаемых здесь решений зависят от системы или конфигурации (в частности, большинство решений вообще не работают на MacOS), а некоторые полагаются на то, что пользователь знает, где находятся файлы конфигурации Apache. ,

Поэтому я немного обманываю и позволяю Apache саму сказать мне, что к чему.

Простая команда apachectl -Sрасскажет вам, что вам нужно знать о работающем экземпляре Apache, и его результаты могут быть проанализированы довольно легко. Вот мое решение, которое я использую в верхней части нескольких bashсценариев, чтобы определить множество вещей, которые могут мне понадобиться в любой момент времени ...

# Store the results so we don't have to keep calling apachetl...
astatus=`apachectl -S`

# Now grab whatever you want from the result... 
HTTPD_ROOT_DIR=$(expr "`echo "$astatus" | grep ServerRoot`" : ".*\"\(.*\)\".*")
HTTPD_DOC_DIR=$(expr "`echo "$astatus" | grep \"Main DocumentRoot\" `" : ".*\"\(.*\)\".*")
HTTPD_USER=$(expr "`echo "$astatus" | grep \"User:.*name=\" `" : ".*\"\(.*\)\".*")
HTTPD_GROUP=$(expr "`echo "$astatus" | grep \"Group:.*name=\" `" : ".*\"\(.*\)\".*")

Эти значения могут быть использованы как таковые:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data
Майк Фахи
источник
0

Я нашел эту команду в документации CakePHP .

HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\  -f1`

Теперь HTTPDUSERсодержит имя пользователя, который запускает сервер, echo $HTTPDUSERв моем случае выводит - www-datausing rlerdorf / php7dev .

Набиль Кадими
источник
0

Используйте lsof и передайте порт apache для прослушивания в качестве аргумента. См. Столбец USER для пользователя appache работает как.

# lsof -i :80
COMMAND     PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
httpd     21058   root    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     21111 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
httpd     24915 www-data    4u  IPv6  74730      0t0  TCP *:http (LISTEN)
Дэвид Окви
источник
lsof может работать медленно, если у вас есть несколько открытых файловых дескрипторов по 100 тыс. и / или довольно занятый сервер.
Деннис Нольте