Por que os sudoers só permitem que eu defina NOPASSWD para ALL?

1

Minha situação é a seguinte: Eu estou tentando dar ao usuário www-data a habilidade de executar alguns scripts de shell, para que eu possa ter uma página no meu servidor web exibir informações do sistema (no PHP usando shell_exec () ). Para este fim, editei meu arquivo sudoers com a seguinte linha

www-data ALL=(ALL:ALL) NOPASSWD: /home/evermind/scripts/*

para dar ao Apache a capacidade de executar scripts nesse diretório sem precisar de uma senha para o suoo. Infelizmente, isso não funciona, nem (como uma verificação de integridade) especificando um script específico dentro desse diretório. O shell_exec falha ao executar o comando e apresenta o seguinte erro:

sudo: no tty present e nenhum programa askpass especificado

É aqui que as coisas ficam ... estranhas. Se eu substituir a especificação do caminho por "ALL", tudo funcionará perfeitamente. Por que é isso? Existe uma razão pela qual não posso especificar o NOPASSWD para arquivos ou diretórios individuais?

Por razões de segurança, estou extremamente hesitante em permitir o reinado gratuito de www-data sobre tudo, mesmo que o aplicativo da Web seja extremamente seguro e não exista uma maneira óbvia de alguém poder executar comandos arbitrários.

    
por jrp3 25.06.2014 / 02:38

3 respostas

2

Que tal adicionar apenas usando o caminho do diretório sem o caractere curinga?

www-data ALL=(ALL:ALL) NOPASSWD: /home/evermind/scripts/

De acordo com a página de manual sudoers :

A Cmnd_List is a list of one or more
commandnames, directories, and 
other aliases. ... A directory is a fully 
qualified path name ending in a '/'. 
When you specify a directory in a 
Cmnd_List, the user will be able to 
run any file within that directory (but 
not in any subdirectories therein).
    
por muru 25.06.2014 / 03:51
2

Ok, depois de me afastar do problema por um dia e voltar a ele, parece que resolvi mais ou menos o meu próprio problema.

Anteriormente, o comando do terminal que eu estava executando via shell_exec () era

sudo sh <path to my script>

Hoje, mais ou menos para tentar apenas alguma coisa , eu chmod'd meu script para torná-lo executável diretamente. Então, mudei a string shell_exec () para ser

sudo <path to my script>

E voilà, começou a funcionar. A lógica parece sugerir que o culpado era na verdade a declaração de utilidade sh, já que essa era a distinção chave nos comandos. Se alguém sabe o que o negócio com isso foi, no entanto, eu estaria realmente interessado em saber.

    
por jrp3 26.06.2014 / 21:31
0

Idealmente, se você estiver personalizando quais comandos podem ser executados via sudo , você deve fazer essas alterações em um arquivo separado em /etc/sudoers.d/ , em vez de editar o arquivo sudoers diretamente. Você também deve sempre usar visudo para editar o (s) arquivo (s). Você NUNCA deve conceder os comandos NOPASSWD on ALL .

Exemplo: sudo visudo -f /etc/sudoers.d/myWebScript

Insira sua permissão de concessão de linha: www-data ALL= NOPASSWD: /home/evermind/scripts/

A maneira como você ligava se quisesse restringir é especificamente para um diretório para sh que você usaria: www-data ALL= NOPASSWD: /bin/sh /home/evermind/scripts/

Não sei por que esses scripts exigiriam sudo access. Normalmente, você poderia usar apenas chmod o+x scriptname.sh e verificar se eles estavam em um diretório de propriedade do usuário www-data .

Em seguida, salve e saia e visudo avisará se você tiver erros de sintaxe.

Você pode executar sudo -l para ver as permissões concedidas a seu usuário, se qualquer um dos comandos NOPASSWD específicos do usuário aparecer ANTES de qualquer comando %groupyouarein ALL=(ALL) ALL na saída, será solicitada sua senha.

Se você estiver criando muitos desses arquivos sudoers.d, talvez queira criá-los com nomes por usuário, para que sejam mais fáceis de visualizar. Tenha em mente que a ordenação dos NOMES DE ARQUIVO e das REGRAS dentro do arquivo é muito importante, o ÚLTIMO carregado carrega, seja MAIS ou MENOS permissivo que as entradas anteriores.

  

Você pode controlar a ordenação de nomes de arquivos usando um prefixo de 00-99 ou aa / bb / cc, mas lembre-se de que, se tiver ALGUNS arquivos que não tenham prefixo numérico, eles serão carregados após o número arquivos, sobrescrevendo as configurações. Isso ocorre porque, dependendo das configurações de idioma, a "ordenação lexical" do shell usa os primeiros tipos de classificação e, em seguida, pode intercalar maiúsculas e minúsculas ao classificar em ordem "crescente".

Tente executar printf '%s\n' {{0..99},{A-Z},{a-z}} | sort e printf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sort para ver se o seu idioma atual imprime AaBbCc etc ou ABC then abc para determinar qual seria o melhor prefixo de letra "último" a usar.

    
por dragon788 22.05.2017 / 23:17