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

17

Quero permitir que um usuário execute grep (através do sudo) e grep para uma sequência específica em um arquivo específico. Não quero permitir que esse usuário possa executar o grep em todos os arquivos. O usuário não tem acesso de leitura ao arquivo, portanto, o requisito para usar o sudo. Estou tentando escrever uma verificação nagios que recebe o arquivo de log de outro serviço na máquina.

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

Meu comando é: sudo grep "string I want (" /var/log/thefilename.log(sim, há um espaço bruto (e alguns espaços na sequência que eu quero 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 pertence root:roote tem permissões-r--r-----

O servidor possui o confiável Ubuntu 14.04.3 LTS.

Como posso fazer isso funcionar?

Rory
fonte
O nagios verifica explicitamente chamando / bin / grep ou / usr / bin / grep?
Jeff Schaller
Escreva um script de shell que faça isso e deixe que o script seja executado sudo.
user253751
@JeffSchaller FYI o script apenas chama grepe which grepme diz que está usando /bin/grep. AFAIK no arquivo sudo, é necessário especificar o caminho completo do binário, mesmo se você o chamar sem o caminho completo.
Rory

Respostas:

13

Aparentemente, o sudo nivela o comando em uma cadeia de caracteres antes de compará-lo com uma especificação no arquivo sudoers. Portanto, 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

Edit : Como @ user23013 aponta nos comentários, isso pode ser explorado para grep para "string I want" em qualquer arquivo (e, por extensão, também para "string I" e "string".) Por favor, faça uma consideração cuidadosa antes usando 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 manipulados pelo shell e nunca alcançam sudo.

Alexander Batischev
fonte
Interessante, eu me pergunto se isso é explorável, ou seja, convencer que sudovocê digitou uma coisa (que corresponde à especificação), mas quando se trata de executá-la, é algo totalmente diferente.
EightBitTony
4
@EightBitTony Claro que é! No seu sudoers: user host = NOPASSWD: /usr/bin/vim Editing sudoers file(com a intenção de permitir que os usuários editem "Editando arquivo de sudoers"), pode ser explorado cdentrando /etc/e executando sudo vim Editing sudoers file. Eu diria que, para qualquer comando de complexidade razoável, deve-se seguir a abordagem sugerida em seu comentário - o shell fornece uma $@variável na qual é possível verificar se os argumentos estão agrupados da maneira que você espera que sejam agrupados.
Alexander Batischev
8
Crie um caminho em ( /var/logqualquer lugar e faça o link simbólico thefilename.logpara qualquer arquivo; o usuário pode receber a string I wantpartir de qualquer arquivo.
precisa saber é o seguinte
2
A resposta do @ EightBitTony (escreva um script de wrapper, permita o acesso do sudo a esse script) é muito melhor e mais seguro.
27616 #
Uau, essa é uma prática extremamente ruim para uma ferramenta focada na segurança.
Sam Watkins
32
  1. Escreva um script (gravável somente pela raiz)
  2. Nesse script, execute o que grepvocê precisa
  3. Na configuração do sudoers, permita apenas o acesso a esse script
  4. Configure qualquer ferramenta ou aconselhe o usuário a executar o script via sudo

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

EightBitTony
fonte
2

Desde que você só precisa de raiz para o acesso a arquivos, considere o uso cat, teeou algo semelhante e tubulações que a grepou qualquer programa que você precisa executar. Por exemplo, sudo cat /file/path | grep …desta maneira, você restringe a raiz aonde você absolutamente precisa.

user167676
fonte
0

sudoé ótimo, mas às vezes não é o melhor ajuste. Para isso eu gosto de usar super.supertambém permite permissões elevadas, no entanto, 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 ficaria assim:

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

e seria invocado como super grepcmd.

hildred
fonte
sudotem Cmnd_Alias(o qual pode conter um ou mais comandos, com ou sem restrições arg).
27516
Não é a mesma coisa. Cmnd_Alias ​​é uma ferramenta para simplificar o arquivo de configuração; ele não expõe um alias para o usuário, que é o principal modo de operação do super (é por isso que eu uso o sudo quando não estou usando nomes alternativos ou executando scripts suid (na maioria das vezes) e super para esses dois casos de uso).
Hildred 27/04/16
é para isso que servem os scripts de wrapper ... e eles não estão limitados a apenas uma linha ou têm problemas irritantes de citação.
27516