Sudoers: Permitir qualquer subcomando para determinado argumento

5

Estou tentando permitir que um grupo de usuários ganhe algum controle sobre uma instância de um serviço dhcpcd. Em outras palavras, gostaria que eles fossem executados:

systemctl (start,stop,...) [email protected]

sem ser solicitada uma senha, mas somente em [email protected]. Eu já encontrei maneiras de fazer isso, no entanto, eles exigem enumeração de cada subcomando em sua própria linha.

%mygroup ALL=NOPASSWD: /usr/bin/systemctl start [email protected], /usr/bin/systemctl stop [email protected], ...

Existe um método mais elegante de fazer isso?

    
por XYZ Rose 03.07.2016 / 14:49

1 resposta

7

Os curingas dos Sudoers são suportados apenas com globbing ( man glob , man fnmatch ). No entanto, os comandos start , stop , restart (, etc.) para systemctl não podem ser globbed, pois não são arquivos.

O fato de você precisar enumerar todos os comandos é uma coisa boa do ponto de vista de segurança. Se [email protected] for atualizado com um comando, digamos shutdown-machine em uma atualização do sistema, seus usuários sudo não poderão usá-lo (felizmente).

Há uma observação sobre isso no manual do sudoers:

 Wildcards in command line arguments should be used with care.
 Command line arguments are matched as a single, concatenated string.  This mean a wildcard character such as ‘?’ or
 ‘*’ will match across word boundaries, which may be unexpected.  For example, while a sudoers entry like:

     %operator ALL = /bin/cat /var/log/messages*

 will allow command like:

     $ sudo cat /var/log/messages.1

 It will also allow:

     $ sudo cat /var/log/messages /etc/shadow

 which is probably not what was intended.  In most cases it is better to do command line processing outside of the
 sudoers file in a scripting language.

Por outro lado, se quiser economizar na digitação, você pode fazer exatamente o que o manual sugere: use uma linguagem de script. Por exemplo, você poderia escrever algo assim em, digamos, /usr/local/sbin/sudoers-dhcpd.sh :

#!/bin/sh

case "$1" in
  start)
    systemctl start [email protected]
    ;;
  stop)
    systemctl stop [email protected]
    ;;
  restart)
    systemctl restart [email protected]
    ;;
  *)
    echo You are not allowed to do that!
    ;;
esac

Adicione uma linha de sudoers da seguinte forma:

%mygroup ALL=NOPASSWD: /usr/local/sbin/sudoers-dhcpd.sh
    
por 03.07.2016 / 15:36