/etc/sudoers define o usuário para uso geral do sudo, sem solicitação de senha para apenas um comando

/etc/sudoers define o usuário para uso geral do sudo, sem solicitação de senha para apenas um comando

Eu tenho uma entrada em /etc/sudo para um usuário que pode executar o sudo para todos os comandos.

fred TODOS=(TODOS:TODOS) TODOS

Conforme documentação o ALL final é responsável por permitir o acesso a todos os comandos.

Eu gostaria que Fred pudesse executar uma reinicialização do nginx no Ubuntu 14.04 sem fornecer uma senha do sudo, mantendo a capacidade de invocar o sudo para outros comandos. Osudoersa documentação não está clara, mas acredito

fred ALL=(ALL) NOPASSWD: /usr/sbin/service

permite apenas que Fred execute um comando. Quero dar ao Fred a capacidade de executar todos os comandos como root via sudo, com todos, exceto /usr/sbin/service, exigindo uma senha.

Olhando o BNF da documentação

User_Spec ::= User_List Host_List '=' Cmnd_Spec_List  (':' Host_List '=' Cmnd_Spec_List)*   

Cmnd_Spec_List ::= Cmnd_Spec | Cmnd_Spec ',' Cmnd_Spec_List

Cmnd_Spec ::= Runas_Spec? SELinux_Spec? Solaris_Priv_Spec? Tag_Spec* Cmnd 
 
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')' 

SELinux_Spec ::= ('ROLE=role' | 'TYPE=type') 

Solaris_Priv_Spec ::= ('PRIVS=privset' | 'LIMITPRIVS=privset')   

Tag_Spec ::= ('EXEC:' |
              'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
              'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
              'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
              'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')

parece que posso usar vários Cmnd_Spec_Lists assim

fred ALL=(ALL: ALL) ALL, NOPASSWD: /usr/sbin/service

Mas a documentação não diz que o último NOPASSWD: Cmnd_Spec substituirá o acesso root do comando ALL apenas para esse comando.

É o tipo de coisa que gosto de acertar na primeira vez. Alguém pode confirmar se a última linha funcionará (ou, alternativamente, dizer que não funcionará) para o propósito específico em questão, por favor?

Além disso, se funcionar para permitir que fred execute o serviço sem uma senha sudo, existe uma maneira de restringir os argumentos ao serviço, para que fred só possa trabalhar sem uma senha no serviço nginx, ou melhor ainda, para que fred só possa reiniciar esse servidor sem senha?

Obrigado.

Responder1

Os comandos na parte inferior da configuração substituem os acima. É mencionado na documentação emhttps://www.sudo.ws/man/1.8.15/sudoers.man.html#SUDOERS_FILE_FORMATque não é mais ou menos específico, a menos que você os coloque em ordem dessa maneira.

Eu faço isso usando várias linhas. Várias linhas e regras serão mais fáceis de ler e entender no futuro, quando as coisas ficarem mais complicadas. Várias linhas podem ajudá-lo a definir o pedido.

# I don't know what order this is interpreted in:
fred ALL=(ALL : ALL) ALL, NOPASSWD: /usr/sbin/service

# I do know what order this is interpreted in:
fred ALL=(ALL) ALL
fred ALL=(ALL) NOPASSWD: /usr/sbin/service

As linhas a seguir vêm do meu arquivo sudoers. Permitir que os membros do grupo wheelexecutem todos os comandos e, em seguida, executem comandos especificamente no REBOOTalias sem uma senha.

Cmnd_Alias      REBOOT = /sbin/halt, /sbin/reboot, \
                         /sbin/poweroff, /sbin/shutdown
%wheel ALL=(ALL) ALL
%wheel ALL=(ALL) NOPASSWD: REBOOT

Infelizmente não tenho muita documentação pública para indicar. A página de manual do sudoers é ridícula. Eu li um livro ótimo (fácil de ler) sobre isso há algum tempo (Domínio do Sudopor Michael W. Lucas) e este exemplo funciona para mim em várias máquinas Linux e BSD.

Responder2

Olá, isso pode funcionar. Tente este login como root e siga os comandos abaixo $ acrescente as linhas abaixo no arquivo sudoers

fred TODOS=(TODOS)NOPASSWD:TODOS

informação relacionada