Назад | Перейти на главную страницу

Узнать, от имени какого пользователя работает Apache?

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

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

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

Спасибо!

ps aux | egrep '(apache|httpd)' обычно показывает, как работает apache.

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

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

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

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'

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

User: name="_www" id=70
Group: name="_www" id=70

Согласно 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

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

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

echo exec('whoami');

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

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

ПРИМЕЧАНИЕ. Это тот же ответ, что и я. Переполнение стека.

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

По предложению Нойо Вот:

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

А потом:

echo $APACHE_USER

Альтернативный подход, по крайней мере для дистрибутивов на основе Debian / Ubuntu, - это используйте тот же метод, который использует Apache для установки своего пользователя и группы: источник /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 nobody  
)
$ echo "$apacheuser"
nobody

Я обнаружил, что большинство предлагаемых здесь решений зависят от системы или конфигурации (в частности, большинство решений вообще не работают в 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

Я нашел эту команду в Документы 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-data -с помощью rlerdorf / php7dev.

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

# 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)

Вот что я использую прямо сейчас:

apachectl -t -D DUMP_RUN_CFG 2>/dev/null |
sed -n '/^User/s/.*name="\([^"]*\)".*/\1/p'