Descobrindo qual usuário o Apache está executando?

212

Desejo proteger um diretório de upload de arquivos no meu servidor, conforme descrito aqui de maneira bonita, mas tenho um problema antes de seguir estas instruções. Não sei qual usuário Apache está executando.

Encontrei uma sugestão de que você pode procurar no httpd.conf e haverá uma linha "Usuário", mas não existe essa linha no meu arquivo httpd.conf, então acho que o Apache está sendo executado como usuário padrão. Mas não consigo descobrir o que é isso.

Então, minha pergunta é (são):

  • como faço para descobrir qual é o usuário padrão
  • preciso alterar o usuário padrão
  • se a resposta for sim e eu altero o usuário padrão editando o httpd.conf, é provável que estrague tudo?

Obrigado!

eikonomega
fonte
12
por que essa pergunta foi rejeitada? Sim, foi atualizado porque foi respondido em outro lugar, mas não vejo necessidade de votar de forma negativa? É uma pergunta perfeitamente boa? Talvez nosso eleitor descendente queira adicionar um comentário construtivo sobre isso?
Bryan
2
Você pode postar essa atualização como resposta e aceitá-la, como você está atualmente na fila Não Respondida.
Fahad Sadah
7
+1 por ser repreendido no StackOverflow; alguns usuários parecem insistente em correr novos usuários
wruckie
Questão ligada não existe mais
pal4life
A próxima pergunta: o que fazer porque é um dos dois usuários, como roote www-data. Como você dá ao grupo Apache "certo" uma permissão para acessar algo?

Respostas:

228

ps aux | egrep '(apache|httpd)' normalmente mostra como o apache está sendo executado.

Normalmente, você não precisa alterar o usuário padrão, "ninguém" ou "apache" são normalmente bons usuários. Contanto que não seja "raiz";)

edit: comando mais preciso para capturar binários apache também

grufftech
fonte
42
Sim, ou será www-data no Ubuntu.
Gravyface #
10
... e Debian. :)
cubuspl42
7
Esse comando me mostra uma lista de coisas, a maioria delas, apachemas uma roottambém.
Utilizador
2
Eu tenho 3 processos ( /usr/sbin/apache2 -k start), um usuário é roote os outros dois www-data. Devo me preocupar?
zundi
3
@zundi, o serviço inicia como root para fazer coisas como ligar a portas reservadas (por exemplo, 80 e 443). Em seguida, ele inicia qualquer que seja o número configurado de processos, para executar o trabalho do servidor da web e quaisquer outras tarefas, como usuários definidos. Dessa forma, as solicitações estão sendo tratadas por processos não privilegiados. Você notará que o ID pai (PPID) é o mesmo para todos os outros processos. Essa ideia é o PID do processo em execução como root.
Kevin
41

Você pode tentar o seguinte comando:

ps -ef | egrep '(httpd|apache2|apache)' | grep -v `whoami` | grep -v root | head -n1 | awk '{print $1}'
nowthatsamatt
fonte
1
Adoro esta resposta, melhor (mais genérica) do que a resposta mais votada. Graças
PGR
14

Use apachectl -S, que mostrará algo usuário e grupo do Apache, algo como isto:

User: name="_www" id=70
Group: name="_www" id=70
Kyaw
fonte
Obrigado, no meu mac, vejo que o apache está sendo executado como '_www'.
Mercúrio
Essa é uma boa resposta, porque é o único comando que informa muito mais sobre o servidor da web em execução e o apresenta de maneira abrangente.
kontur 5/09
9

De acordo com o ubuntuforums.org , no Ubuntu o usuário padrão do apache2 é www-data.

Visto como verdade no Ubuntu 13.10 Saucy.


De Lars Noodén no fórum acima.

Para ter certeza do que [o usuário] está realmente definido, verifique os arquivos de configuração reais. O arquivo guarda-chuva apache2.confterá algo como o seguinte,

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

Essa é uma referência às variáveis ​​de ambiente definidas em /etc/apache2/envvars. mod_suexectambém permite que os scripts sejam executados como um usuário e grupo diferente.

Para encontrar hosts virtuais que possam usar usuários, grupos ou ambos alternativos, verifique as configurações.

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

Para distribuições baseadas no Red Hat, seria (normalmente seu usuário executando httpd é apache):

$ egrep "^User|^Group|^SuexecUserGroup" /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf
Kevin
fonte
8

Sei que este é um post antigo, mas ainda está listado como sem resposta, portanto, farei uma sugestão. Se você não conseguir encontrar qual usuário ou grupo o Apache está executando, talvez tente abrir o arquivo httpd.conf. Deve haver uma entrada para "Usuário" e "Grupo". Você não apenas pode ver qual usuário o Apache deve estar executando como também pode alterá-lo se sentir a necessidade.

kainosnous
fonte
7

Você pode incluir uma linha de código no seu script PHP:

echo exec('whoami');
JG Estiot
fonte
8
Cuidado aqui, isso mostra o usuário sob o qual o PHP é executado, não o usuário do Apache. Se usar mod_php, estes são os mesmos, mas se, como agora é muito comum, você estiver usando outra coisa (como php_fpm), eles podem ser facilmente diferentes.
benz001 31/07
5

Esse código - mais ou menos - lista alfabeticamente todos os usuários não raiz executando processos que contêm apache(ou cujo nome contém apache)

ps aux | grep -v root | grep apache | cut -d\  -f1 | sort | uniq
user163193
fonte
A lista provavelmente incluirá usuários que estão executando processos como 'grep apache', como você mesmo.
Mkfearnley
4
  • Para descobrir o usuário, você pode simplesmente usá- ps aux | grep apachelo enquanto estiver em execução.
  • Você não precisa, mas se o Apache estiver sendo executado como root, haverá problemas de segurança.
  • Terceiro, alterar o usuário do Apache alterará seus direitos de acessar alguns diretórios. Você precisa garantir que / var / www (ou onde quer que você tenha seus sites) esteja acessível ao novo usuário e grupo.
  • Nos sistemas que eu observei, o apache sempre foi instalado usando o apache: apache (ou similar) como usuário e grupo, portanto, ele provavelmente já deve estar definido assim.

NOTA: Essa é a mesma resposta que eu dei no Stackoverflow .

Kjir
fonte
2

Ou você pode verificar o arquivo de configuração apache e procurar o proprietário e o grupo.

AliGibbs
fonte
2

Como sugerido por Noyo aqui :

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

E depois:

echo $APACHE_USER
kenorb
fonte
1
Obter o usuário (linha de comando do ubuntu): echo $ APACHE_USER
Jadeye
1

Uma abordagem alternativa, pelo menos para as distribuições baseadas no Debian / Ubuntu, é usar o mesmo método que o Apache usa para definir seu usuário e grupo: source/etc/apache2/envvars !

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

Se você quiser ser extravagante, poderá suprimir erros se o arquivo não for encontrado e fornecer um valor padrão:

$ apacheuser = $ (
     fonte / falha / etc / apache2 / envvars 2> / dev / null &&
     eco "$ APACHE_RUN_GROUP" ||
     eco ninguém  
)
$ echo "$ apacheuser"
ninguém
MestreLion
fonte
1

Descobri que a maioria das soluções oferecidas aqui é específica do sistema ou da configuração (em particular, a maioria das soluções não funciona no MacOS) e algumas contam com o usuário que sabe onde estão os arquivos de configuração do Apache. .

Então, trapaceio um pouco e deixo o próprio Apache me dizer o que é o quê.

O comando simples apachectl -Sinforma o que você precisa saber sobre uma instância em execução do Apache, e seus resultados podem ser analisados ​​facilmente. Aqui está a minha solução, que eu uso na parte superior de alguns bashscripts para determinar uma variedade de coisas que posso precisar a qualquer momento ...

# 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=\" `" : ".*\"\(.*\)\".*")

Esses valores podem ser usados ​​como tais:

echo $HTTPD_ROOT_DIR // /etc/httpd
echo $HTTPD_DOC_DIR  // /var/www
echo $HTTPD_USER     // www-data
echo $HTTPD_GROUP    // www-data
Mike Fahy
fonte
0

Encontrei este comando nos documentos do CakePHP .

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

Agora HTTPDUSERmantém o nome de usuário do usuário que executa o servidor; echo $HTTPDUSERno meu caso, gera - www-datausando rlerdorf / php7dev .

Nabil Kadimi
fonte
0

Use lsof e passe a porta que o apache é escutado como argumento. Consulte a coluna USER para ver se o appache do usuário está sendo executado como.

# 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)
David Okwii
fonte
lsof pode ser lento quando você tem alguns manipuladores de arquivos abertos de 100k e / ou um servidor bastante ocupado.
Dennis Nolte