Limitando o uso de 'sudo -s'

8

Estou configurando o Nagios em alguns dos meus servidores Linux e me deparo com um problema. O check_ide_smart plugin requer acesso root ao sistema para ser executado. Para executá-lo, eu uso o check_by_ssh plugin para ssh na conta nagios no host remoto e, em seguida, execute check_ide_smart usando o sudo.

Inicialmente adicionei as seguintes linhas a /etc/sudoers para permitir que o programa funcione:

nagios  ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_smart

Embora isso funcionasse bem quando executado localmente, eu estava tendo um problema quando era executado a partir do Nagios: nenhum TTY estava sendo gerado, o que impedia o plug-in de funcionar.

Eu cavei na man page do sudo e encontrei a opção -s, que gera um shell e executa o programa lá. Quando tentei usar sudo -s , tive problemas de permissão, pois aparentemente o -s altera o comando para /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart , o que não é permitido pelo arquivo sudoers. Tentei alterar o arquivo sudoers para usar esse comando, mas isso não funcionou e usar aspas é um erro de sintaxe.

Eu consegui que funcionasse usando a seguinte linha em /etc/sudoers :

nagios ALL=/bin/bash

Isso parece muito errado para mim, já que estou permitindo que o usuário nagios crie um shell de root, com o qual eles podem fazer qualquer coisa.

Neste ponto, eu pensei que talvez, colocando o comando em um shell script que o usuário nagios tenha privilégios de somente leitura funcionasse, então eu criei um script de shell:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin $@

Infelizmente, eu nunca consegui obter os parâmetros passados ( $@ ) para trabalhar corretamente com o plugin, então eu não sei se isso funcionaria. Edit: Eu precisava citar o $@ para ele funcionar. Obrigado @derobert e @pjz. Eu ainda não sei se funcionaria desde que eu comecei a trabalhar usando a solução do @Mike Arthur.

Existe alguma maneira de eu conseguir que o sudo -s funcione sem permitir a desova de um shell de root?

Resposta:

Adicionada a linha a seguir a /etc/sudoers :

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

Observe o asterisco à direita; sem isso, isso não funciona. Obrigado @Mike Arthur pela resposta.

    
por Chris Lieb 07.05.2009 / 17:12

5 respostas

7

nagios ALL=NOPASSWD: /bin/bash -c /usr/lib/nagios/plugins/check_ide_smart *

Isso deve funcionar e permitir argumentos.

    
por 07.05.2009 / 17:15
2

FYI, você precisa citar $ @ em seu script de shell para que funcione corretamente:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"

$@ é mágico. Na manpage bash,

@ Expands to the positional parameters, starting from one. When the expansion occurs within double quotes, each parameter expands to a separate word. That is, "$@" is equivalent to "$1" "$2" ... If the double-quoted expansion occurs within a word, the expansion of the first parameter is joined with the beginning part of the original word, and the expansion of the last parameter is joined with the last part of the original word. When there are no positional parameters, "$@" and $@ expand to nothing (i.e., they are removed).

Além disso, iniciar o bash não gerará um pty; embora eu esteja perplexo a respeito de porque seu plugin nagios precisa de um terminal para rodar. Não deveria. Talvez o problema real seja a sanitização do ambiente do sudo?

    
por 07.05.2009 / 18:06
1

Em vez de usar sudo -s e lançar um shell de root, permita que seu usuário nagios use sudo sem tty usando !requiretty . Seu /etc/sudoers deve ter o seguinte:

# Allow Nagios extra privs
Defaults:nagios !requiretty
nagios ALL=NOPASSWD: /usr/lib/nagios/plugins/check_ide_plugin

... que permitirá acesso direto ao sudo, sem senha e sem tty. Você pode deixar o "check_ide_plugin" desativado se quiser que o sudo acesse todos os plugins.

Também usamos o NRPE, que parece um pouco mais seguro que o check_by_ssh, mas requer um pouco mais de configuração. Mesma idéia em / etc / sudoers tho, basta trocar nagios com nrpe. :)

~ tommy

    
por 03.04.2013 / 01:37
0

Tente o script novamente, mas coloque aspas em torno do seu $ @:

#!/bin/sh
/bin/bash -c /usr/lib/nagios/plugins/check_ide_plugin "$@"
    
por 07.05.2009 / 18:06
-1

Eu não acho que é possível usar -s sem gerar um shell de root (supondo que você precise de privilégios de root). A opção -s está especificamente lá para gerar um shell. Isso é o que quer dizer. Do sudo (8):

-s [command]
    The -s (shell) option runs the shell specified by the SHELL
    environment variable if it is set or the shell as specified
    in passwd(5).  If a command is specified, it is passed to
    the shell for execution.  Otherwise, an interactive shell
    is executed.
    
por 07.05.2009 / 18:12