SUDO: condição de nome de usuário no arquivo sudoers

1

Estou tentando permitir que meu usuário (via sudo , lançado em um script) copie um arquivo da sua casa para um diretório da web.

O comando seria:

sudo cp /home/$LOGNAME/file_source /var/www/$LOGNAME_file_dest

Então eu adicionei a seguinte linha no meu arquivo sudoers:

%users ALL=(ALL)NOPASSWD:/bin/cp /home/$LOGNAME/file_source /var/www/$LOGNAME_file_dest

Isso não funciona, porque sudo me pede uma senha e não deveria. Eu acho que isso é um problema com a variável $LOGNAME que não é interpretada no arquivo sudoer ou algo assim.

Eu quase esqueci de mencionar que sou um maníaco pelo controle, isso tem que ser uma condição muito rígida, não é * ou qualquer outra coisa tolerada.

Alguém tem uma solução para tal problema ou devo ir pelo caminho doloroso e permitir que 1 por 1 usuário para cp seu arquivo para o diretório /var/www ?

    
por trox 29.05.2013 / 04:56

3 respostas

1

Joel Davis tem a resposta correta, muito obrigado a todos por sua gentil ajuda! "aplicação de script do POSIX ACL's" ou seja!

e: link

Exemplo: (Criar arquivos, uma vez escritos, eles são somente de leitura, mas PODEM ser deletados pelo proprietário, mas não por outros.)

setfacl --set u::rwxs,g::rwx /controlled
setfacl -d --set u::r-x,g::r-x,o::- /controlled

Isso é exatamente o que preciso fazer.

Muito obrigado a todos por sua ajuda, eu deveria ter feito essa pergunta de forma diferente.

    
por 30.05.2013 / 00:34
2

As variáveis do shell são interpretadas pelo seu shell e nunca são vistas pelo sudo ou qualquer outro programa lançado com elas. Ou seja, ao fazer foo=bar; echo "$foo" , echo nunca sabe que os dados que foram passados vieram de uma variável chamada "foo", porque o shell o expande antes mesmo de echo ser executado. Por esse motivo, não é possível fazer com que as variáveis do shell funcionem de maneira transparente em seu arquivo sudoers.

Além disso, como $LOGNAME pode ser qualquer coisa, o que você deseja fazer é essencialmente equivalente a usar uma estrela depois de /home no seu sudoers , independentemente de você usá-lo ou não. Eu não recomendaria fazer isso, porque você pode essencialmente copiar qualquer coisa para qualquer lugar como root, o que é um enorme risco de segurança (já que $LOGNAME pode conter .. ). Por fim, você diz que não quer usar * , mas a ação que você está querendo tomar é igualmente perigosa.

A melhor opção é permitir o acesso de leitura para o que estiver em /home/$LOGNAME/file_source e o acesso de gravação para esses usuários a /var/www . Você pode ter um grupo www-logs que tenha leitura de grupo e gravação de grupo para esses caminhos, respectivamente.

    
por 29.05.2013 / 05:13
0

Crie um script que realize a cópia após as verificações necessárias e conceda sudo acesso a isso.

Observe que os scripts de shell privilegiados são considerados uma prática ruim; você pode querer ir para e. g. Python ou Perl no lugar.

O ambiente criado por sudo já deve impedir que o usuário substitua os caminhos da biblioteca, etc, mas talvez você queira executar algumas etapas extras para desativá-lo, de forma que apenas um conjunto mínimo de caminhos de biblioteca do sistema seja permitido.

    
por 29.05.2013 / 08:05