Use o suEXEC que permite que um script seja executado como o proprietário do arquivo, em vez do usuário do servidor web.
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 sudo -u username -p password my command
. No entanto, não estou me sentindo muito bem em armazenar a senha do usuário em texto simples.
Existe uma maneira "mais inteligente" de fazer isso?
Use o suEXEC que permite que um script seja executado como o proprietário do arquivo, em vez do usuário do servidor web.
A maneira que eu já vi isso é dar ao usuário do Apache um privilégio sudo apenas para aquele comando específico (reinicialização do apache2ctrl no nosso caso). Você não precisa usar senhas, se você está armazenando em texto puro em algum lugar que o usuário do Apache possa ler, então você pode não ter uma.
A menos que você precise executar vários comandos diferentes através do Sudo como o usuário do Apache. Isso pode ficar estranho se você tiver que adicionar privilégios sudo para cada um dos comandos.
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 daquele usuário com o setuid bit ativado 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
Um pouco tarde para responder agora, talvez, mas acho que o recurso NOPASSWD
de sudo
precisa ser mencionado.
Por exemplo, em /etc/sudoers
(assumindo que o apache é o usuário que está executando o servidor da web):
User_Alias WWW = apache
WWW ALL =(username) NOPASSWD: my_command
E invoque sudo -u username my_command
. Não é necessário armazenar a senha e você permite que o servidor da Web execute my_command
como nome de usuário.
O usuário username
ainda pode manter sua senha.
Tags sudo apache-2.2