O script PHP precisa de permissão para executar um comando sudo com shell_exec ()

1

Eu tenho um script PHP que contém um shell_exec() e o comando que ele executa normalmente requer o sudo. Eu editei os sudoers com visudo para conter o seguinte:

www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/

Eu suspeito que ou deveria funcionar, mas eu fui com a abordagem de cinto e suspensórios para ter certeza.

Estou editando etc / sudoers com o vim, então depois de adicionar essas linhas, eu faço: xe tudo funciona. Meu script PHP faz o que é suposto ... por cerca de 10 a 15 minutos. Então o script pára de funcionar. Especificamente, o shell_exec() pára de funcionar.

Se eu voltar a sudo visudo , minhas novas linhas ainda estarão lá. Mas somente quando eu salvá-lo novamente o script começa a funcionar novamente.

Alguém pode me dizer por que isso pode estar acontecendo? Eu tenho dois palpites que não são muito bons:

  1. Existe algum período de carência que começa quando eu sudo visudo e é isso que permite que meu script funcione (mas apenas até que expire).
  2. Os novos dados em etc / sudoers estão hospedados no sudoers.tmp (o "arquivo de bloqueio") ... Nenhum destes se soma a mim.

EDITAR:

Acho que estou usando o nome de usuário incorreto ... Parece que para o MAMP, o usuário do apache é realmente meu usuário (não o www-data). Eu sei disso porque adicionei isso ao meu script PHP: echo = shell_exec("whoami"); Meu nome de usuário aparece: Emerson . Então isso significa que eu devo adicionar Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc ao meu arquivo sudoers?

EDITAR:

Eu tenho que trabalhar com isso no meu arquivo sudoers. Emerson ALL=(ALL) NOPASSWD: ALL Funciona, mas não acho que seja assim. Além de um monte de redundância, também é muito permissivo. Deixei todas as bobagens para que você possa ver o que eu tenho atualmente.

#

# Host alias specification

# User alias specification

# Cmnd alias specification

# Defaults specification
Defaults        env_reset
Defaults        env_keep += "BLOCKSIZE"
Defaults        env_keep += "COLORFGBG COLORTERM"
Defaults        env_keep += "__CF_USER_TEXT_ENCODING"
Defaults        env_keep += "CHARSET LANG LANGUAGE LC_ALL LC_COLLATE LC_CTYPE"
Defaults        env_keep += "LC_MESSAGES LC_MONETARY LC_NUMERIC LC_TIME"
Defaults        env_keep += "LINES COLUMNS"
Defaults        env_keep += "LSCOLORS"
Defaults        env_keep += "SSH_AUTH_SOCK"
Defaults        env_keep += "TZ"
Defaults        env_keep += "DISPLAY XAUTHORIZATION XAUTHORITY"
Defaults        env_keep += "EDITOR VISUAL"
Defaults        !requiretty

# Runas alias specification

# User privilege specification
root    ALL=(ALL) ALL
%admin  ALL=(ALL) ALL
Emerson ALL=(ALL) NOPASSWD: ALL

# Uncomment to allow people in group wheel to run all commands
# %wheel        ALL=(ALL) ALL

# Same thing without a password
 %wheel ALL=(ALL) NOPASSWD: ALL

# Samples
# %users  ALL=/sbin/mount /cdrom,/sbin/umount /cdrom
# %users  localhost=/sbin/shutdown -h now

#Allow PHP to compile .less files
www-data ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
%users ALL = NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
Emerson ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
apache ALL =(ALL) NOPASSWD: /var/root/node/npm/node_modules/less/bin/lessc
    
por emersonthis 11.12.2011 / 22:00

3 respostas

1

Nenhuma das coisas que você sugeriu é a questão aqui.

Você tem uma linha exigetty no seu arquivo sudoers? Isso explicaria porque funciona para você, mas não para o seu script PHP. Remover isso resolveria o problema.

O sudo pode ter sido configurado para armazenar em cache sua senha por 15 minutos, verifique se há uma linha como "Padrões timestamp_timeout = XXXX" no arquivo sudoers.

Uma palavra de conselho, considere limitar o sudo a apenas os arquivos necessários. E se um invasor conseguir soltar um arquivo malicioso em seu diretório node_modules / less /?

    
por 11.12.2011 / 22:16
0

Você deve desativar requiretty para o usuário da web

Aqui está a sintaxe do / etc / sudoers

Defaults:username !requiretty

Não edite o / etc / sudo com o vim usando o comando visudo

    
por 12.12.2011 / 02:34
0

Você tem que autorizar o usuário que deseja permitir privilégios elevados no arquivo sudoers. Se o seu servidor da Web estiver sendo executado como Emerson ,

Emerson ALL = NOPASSWD: /var/root/note/npm/node_modules/less/bin/lessc

deve corrigir seu problema.

    
por 12.12.2011 / 09:11

Tags