Execute um comando como outro usuário no Apache

Execute um comando como outro usuário no Apache

Eu tenho um aplicativo da web que executa um programa que precisa do X. Estou usando o xvfb para iniciá-lo; Quero executá-lo como outro usuário.

Eu provavelmente poderia fazer isso sudo -u username -p password my command. No entanto, não estou me sentindo muito bem em armazenar a senha dos usuários em texto simples.

Existe uma maneira "mais inteligente" de fazer isso?

Responder1

UsarsuEXECque permite que um script seja executado como proprietário do arquivo, em vez de como usuário do servidor web.

Responder2

A maneira como vi isso é conceder ao usuário do Apache o privilégio sudo apenas para aquele comando muito específico (apache2ctrl restart no nosso caso). Você não precisa usar senhas, se estiver armazenando-as em texto simples em algum lugar que o usuário do Apache possa ler, é melhor não ter uma.

A menos, é claro, que você precise executar vários comandos diferentes por meio do Sudo como usuário do Apache. Isso pode ficar estranho se você precisar adicionar privilégios sudo para cada um dos comandos.

Responder3

Se você precisar fazer isso fora do Apache a qualquer momento, aqui está uma solução mais geral.

Para permitir que um usuário execute repetidamente um comando específico como outro usuário, você pode criar um script de shell de propriedade desse usuário com o comandosetuidbit enabled que simplesmente executa o comando que você precisa. Certifique-se de tornar o script executável apenas por usuários confiáveis, definindo a propriedade do grupo para o grupo Apache (certifique-se de que nenhum outro usuário esteja neste grupo) e desabilitando a permissão de execução para todos os outros além do grupo Apache e seu usuário.

Um exemplo:

# Replace $MYCOMMAND, $USERNAME, $GROUPNAME, and $MYSCRIPTNAME below
# In this case $GROUPNAME should probably be apache
su
touch $MYSCRIPTNAME
chown $USERNAME:$GROUPNAME $MYSCRIPTNAME
chmod 4750 $MYSCRIPTNAME # setuid, read/execute for group, none for others
echo '#!/bin/sh' >> $MYSCRIPTNAME
echo "sudo -u $USERNAME $MYCOMMAND" >> $MYSCRIPTNAME

Responder4

Talvez seja um pouco tarde para responder agora, mas sinto que o NOPASSWDrecurso sudoprecisa ser mencionado.

Por exemplo, em /etc/sudoers(assumindo que o apache é o usuário que executa o servidor web):

User_Alias WWW = apache

WWW ALL =(username) NOPASSWD: my_command

E invocar sudo -u username my_command. Não há necessidade de armazenar a senha e você só permite que o servidor web seja executado my_commandcomo nome de usuário.

O usuário usernameainda pode manter sua senha.

informação relacionada