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:root
e tem permissões-r--r-----
O servidor possui o confiável Ubuntu 14.04.3 LTS.
Como posso fazer isso funcionar?
sudo
.grep
ewhich grep
me 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.Respostas:
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:
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:
Isso se deve ao fato de que aspas e escape são manipulados pelo shell e nunca alcançam
sudo
.fonte
sudo
você digitou uma coisa (que corresponde à especificação), mas quando se trata de executá-la, é algo totalmente diferente.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 exploradocd
entrando/etc/
e executandosudo 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.( /var/log
qualquer lugar e faça o link simbólicothefilename.log
para qualquer arquivo; o usuário pode receber astring I want
partir de qualquer arquivo.grep
você precisaMuito 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.
fonte
Desde que você só precisa de raiz para o acesso a arquivos, considere o uso
cat
,tee
ou algo semelhante e tubulações que agrep
ou qualquer programa que você precisa executar. Por exemplo,sudo cat /file/path | grep …
desta maneira, você restringe a raiz aonde você absolutamente precisa.fonte
sudo
é ótimo, mas às vezes não é o melhor ajuste. Para isso eu gosto de usarsuper
.super
també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:
e seria invocado como
super grepcmd
.fonte
sudo
temCmnd_Alias
(o qual pode conter um ou mais comandos, com ou sem restrições arg).