Não faça isso.
Você está dando à sudo-user
a capacidade de executar qualquer comando como qualquer usuário. Isso inclui a capacidade de modificar /etc/sudoers
usando qualquer ferramenta que não exija a execução de subprocessos. Você pode estar pensando que exclui visudo
, mas estritamente falando, você não precisa visudo
para editar /etc/sudoers
.
Como, por exemplo:
sudo-user$ sudo sed --in-place -e '/^sudo-user/s/NOEXEC://' /etc/sudoers
... e o usuário acabou de remover a restrição NOEXEC:
.
Uma restrição que o usuário pode remover à vontade não é uma restrição verdadeira.
Além disso, NOEXEC:
pode causar problemas. Ele não apenas evita escapes do shell: ele impede que o programa seja executado com sudo
de iniciando diretamente quaisquer outros programas . Isso pode ter muitas conseqüências.
Por exemplo, se o seu sudo-user
parar e depois reiniciar o daemon cron
(por exemplo, para interromper as tarefas agendadas enquanto durar alguma manutenção), o daemoncron
reiniciado não poderá realmente executar nenhuma tarefa agendada porque da restrição NOEXEC:
.
NOEXEC:
existe para que o administrador do sistema possa aplicá-lo a programas cuidadosamente selecionados que podem executar sua tarefa sem exec()
de quaisquer subprocessos. Aplicá-lo cegamente a tudo causará problemas.
Mas se você absolutamente precisa, aqui está como.
Na página sudoers(5)
man:
User specification
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? Tag_Spec* Cmnd
Runas_Spec ::= '(' Runas_List? (':' Runas_List)? ')'
SELinux_Spec ::= ('ROLE=role' | 'TYPE=type')
Tag_Spec ::= ('EXEC:' | 'NOEXEC:' | 'FOLLOW:' | 'NOFOLLOW' |
'LOG_INPUT:' | 'NOLOG_INPUT:' | 'LOG_OUTPUT:' |
'NOLOG_OUTPUT:' | 'MAIL:' | 'NOMAIL:' | 'PASSWD:' |
'NOPASSWD:' | 'SETENV:' | 'NOSETENV:')
Esta é uma descrição detalhada de como construir uma linha especificação do usuário para o arquivo sudoers
. Pode ser um pouco entediante ler, mas contém as informações de que você precisa.
Vamos resolver isso usando sua linha de exemplo:
sudo-user ALL=(ALL) NOEXEC: NOPASSWD: ALL
A linha inteira é conhecida como especificação do usuário , ou User_Spec
.
Ele é dividido da seguinte forma:
-
User_List
tem apenas um usuário no seu exemplo:sudo-user
-
Host_List
tem apenas uma entrada,ALL
-
Cmnd_Spec_List
no seu exemplo é(ALL) NOEXEC: NOPASSWD: ALL
- não há mais
: Host_List = Cmnd_Spec_List
unidades nessa linha (o asterisco após parênteses sugere que pode haver zero ou mais unidades adicionais como essa).
Seu Cmnd_Spec_List
não tem vírgulas, por isso tem apenas um Cmnd_Spec
.
Cmnd_Spec
se divide em:
- opcional
Runas_Spec
: no seu caso,(ALL)
- opcional
SELinux_Spec
, que não existe no seu exemplo - zero ou mais
Tag_Spec
s, que é a parte sobre a qual você deseja saber -
Cmnd
, o comando, que éALL
no seu caso.
E um único Tag_Spec
é apenas uma das palavras-chave listadas com dois pontos no final, sem vírgula, espaço ou outro delimitador listado explicitamente. A linha Cmnd_Spec ::=
nos diz exatamente onde colocar espaços nessa linha. Como não há instruções para colocar espaços ou quaisquer outros delimitadores entre as tags, não faça isso.
Então, basta colocar as tags uma após a outra , assim:
sudo-user ALL=(ALL) NOEXEC:NOPASSWD: ALL