Permitir ao usuário executar um comando com argumentos (que contém espaços)

14

Eu quero permitir que um usuário rode o grep (através do sudo) e faça uma busca por uma string específica em um arquivo específico. Eu não quero permitir que este usuário seja capaz de executar o grep em todos os arquivos. O usuário não tem acesso de leitura ao arquivo, daí a necessidade de usar o sudo. Eu estou tentando escrever uma verificação nagios que greps o arquivo de log de outro serviço na máquina.

No entanto, isso não funciona, o sudo continua pedindo uma senha.

Meu comando é: sudo grep "string I want (" /var/log/thefilename.log (sim, há um ( e alguns espaços na string que desejo grep)

/etc/sudoers.d/user-can-grep tem este conteúdo:

user ALL=(root) NOPASSWD: /bin/grep "string I want (" /var/log/thefilename.log

Este arquivo sudoers é de propriedade de root:root e tem permissões -r--r-----

O servidor é o Ubuntu Trust 14.04.3 LTS.

Como posso fazer isso funcionar?

    
por Rory 26.04.2016 / 11:45

4 respostas

12

Aparentemente, o sudo nivela o comando em uma string antes de compará-lo a uma especificação no arquivo sudoers. Então, no seu caso, você não precisa usar aspas ou qualquer outra forma de escape:

user ALL=(root) NOPASSWD: /bin/grep string I want ( /var/log/thefilename.log

Editar : Como @ user23013 aponta nos comentários, isso pode ser explorado para grep para "string que eu quero" em qualquer arquivo (e, por extensão, também para "string I" e " string ".) Por favor, faça uma consideração cuidadosa antes de usar a verificação de argumentos do sudo!

Observe também que as seguintes invocações são equivalentes, ou seja, você não poderá restringir os usuários a uma representação específica:

sudo grep "string I want (" /var/log/thefilename.log
sudo grep 'string I want (' /var/log/thefilename.log
sudo grep string\ I\ want\ \( /var/log/thefilename.log

Isso se deve ao fato de que aspas e escape são manipuladas pelo shell e nunca alcançam sudo .

    
por 26.04.2016 / 12:48
31
  1. Escreva um script (gravável apenas pelo usuário root)
  2. Nesse script, execute o grep que você precisa
  3. Na configuração de sudoers, permita somente acesso a esse script
  4. Configure qualquer ferramenta ou aconselhe o usuário a executar o script por meio do sudo

Muito mais fácil de depurar, mais fácil de bloquear acesso específico a um arquivo específico e muito mais difícil de explorar.

    
por 26.04.2016 / 11:49
2

Como você só precisa do root para acessar o arquivo, considere usar cat , tee ou algo semelhante e canalizar isso para grep ou qualquer programa que você precise executar. Por exemplo. sudo cat /file/path | grep … Desta forma, você restringe o root a onde você absolutamente precisa.

    
por 26.04.2016 / 19:09
0

sudo é ótimo, mas às vezes não é o melhor ajuste. Para isso eu gosto de usar super . super também permite permissões elevadas, no entanto, ele assume aliases de comando, o que é conveniente ao permitir linhas de comando complicadas, porque elas são usadas como linhas de comando simples.

seu super.tab seria parecido com:

grepcmd "grep 'string I want (' /var/log/thefilename.log" user

e seria invocado como super grepcmd .

    
por 26.04.2016 / 19:27

Tags