Para permitir sudo sem palavra-passe para um único comando, crie um ficheiro em /etc/sudoers.d com visudo -f e adicione uma regra como utilizador ALL=(root) NOPASSWD: /caminho/absoluto argumentos. O caminho absoluto e os argumentos fixos restringem a permissão a esse comando exato. NOPASSWD: ALL, pelo contrário, equivale a entregar root sem palavra-passe.
Uma regra sudoers NOPASSWD para um comando: exemplo completo com visudo
A regra cria-se com visudo -f num ficheiro novo dentro de /etc/sudoers.d, nunca abrindo o ficheiro num editor qualquer. O exemplo usa um utilizador deploy que só deve recarregar o nginx depois de uma nova versão:
sudo visudo -f /etc/sudoers.d/deploy-nginxConteúdo do ficheiro:
# deploy may reload nginx without a password, and nothing else
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginxConfirme primeiro o caminho com command -v systemctl. Consoante a distribuição, pode estar em /usr/bin ou em /bin, e a regra só corresponde ao caminho exato. Depois valide e teste:
sudo visudo -c
sudo -l -U deploy
sudo -n /usr/bin/systemctl reload nginxvisudo -c verifica a sintaxe de todos os ficheiros sudoers. sudo -l -U deploy lista o que esse utilizador pode executar. sudo -n, executado como deploy, falha em vez de pedir palavra-passe, por isso indica se o NOPASSWD se aplica realmente.
Porque usar visudo e /etc/sudoers.d em vez de editar /etc/sudoers à mão
O visudo bloqueia o ficheiro enquanto o edita e verifica a sintaxe antes de guardar. Se encontrar um erro, avisa-o e deixa-o corrigi-lo. Um /etc/sudoers estragado pode deixar o sudo inutilizável e, num servidor sem palavra-passe de root, isso significa ir à consola de recuperação.
- Um ficheiro por permissão. Apagar o ficheiro revoga a regra sem mexer em mais nada.
- Separado do ficheiro principal. As alterações que um pacote traga para /etc/sudoers não colidem com as suas.
- Sem pontos nos nomes dos ficheiros. O sudo ignora os ficheiros em /etc/sudoers.d cujo nome contenha um ponto ou termine em
~:deploy-nginxé lido,deploy.confnão. - Propriedade de root, modo 0440. Verifique com
ls -l /etc/sudoers.d; se copiou o ficheiro de outro lado, corrija-o comchown root:rootechmod 0440.
Caminhos absolutos no NOPASSWD: porque o sudoers os exige e como fixar os argumentos
O sudoers exige o caminho completo do executável: um nome simples como systemctl é um erro de sintaxe no visudo. O caminho absoluto impede que alguém coloque um binário diferente com o mesmo nome numa pasta do seu PATH e o execute como root.
Os argumentos são a outra metade do controlo:
- Sem argumentos na regra (
/usr/bin/systemctl): qualquer argumento é permitido, incluindo parar ou editar qualquer serviço. - Argumentos exatos (
/usr/bin/systemctl reload nginx): apenas essa linha de comando. - Um
""vazio (/usr/local/bin/backup ""): o comando só é aceite sem argumentos. - Caracteres universais (
/usr/bin/systemctl restart *): o asterisco também corresponde a espaços e deixa passar mais argumentos do que o pretendido. Evite-os.
Porque não usar NOPASSWD: ALL no sudoers: comparação dos riscos
Com NOPASSWD: ALL, qualquer processo que corra com o seu utilizador —um script comprometido, uma dependência maliciosa, uma chave SSH roubada— obtém root através de sudo -n sem qualquer interação. Uma regra delimitada reduz esse prémio a um único comando.
| O que se mede | Regra delimitada com caminho absoluto | NOPASSWD: ALL | sudo com palavra-passe |
|---|---|---|---|
| Alcance sem palavra-passe | Uma linha de comando exata | Qualquer comando como root | Nenhum |
| Adequado para automatização | Sim, para essa tarefa | Sim, sem limites | Não, sudo -n falha |
| Se a sessão do utilizador for roubada | O atacante só pode executar esse comando | O atacante é root | O atacante também precisa da palavra-passe |
Auditoria com sudo -l | Mostra o comando permitido | Mostra ALL, sem detalhe | Depende de outras regras |
Uma regra delimitada continua a ser perigosa se o comando permitido puder abrir uma shell ou executar outros programas: editores como o vi, paginadores como o less, find com -exec ou um script que o utilizador possa modificar. Se permitir um script, este tem de pertencer a root e não pode ser gravável por mais ninguém. Para editar ficheiros protegidos, use sudoedit, que trabalha sobre uma cópia com as permissões do utilizador. A etiqueta NOEXEC pode impedir que um comando lance outros, mas não funciona com todos os binários.
Ordem das regras no sudoers: ganha a última correspondência
Quando várias regras correspondem ao mesmo utilizador e comando, o sudo aplica a última. Se /etc/sudoers.d for incluído no fim de /etc/sudoers, a sua regra NOPASSWD fica depois da regra geral do grupo de administradores e tem precedência. Se uma linha posterior exigir palavra-passe a esse utilizador, sobrepõe-se à sua regra e sudo -n continua a falhar. sudo -l mostra as entradas por ordem, o que torna o conflito fácil de detetar.
Editar o sudoers a partir do telemóvel com o termi1 sem ficar trancado fora
O visudo abre o editor configurado no sistema, muitas vezes o vi ou o nano, e ambos precisam de Esc, Ctrl e das teclas de setas. O teclado próprio do termi1 tem as teclas que o teclado do sistema esconde, além de uma camada fn com F1–F12, PgUp/PgDn, Home e End.
- Mantenha uma shell root de reserva. Abra
sudo -inoutra janela do tmux antes de mexer no sudoers; se algo se estragar, continua a ter root para o corrigir. - Mantenha a sessão ativa. Com o Mosh, o termi1 mantém a sessão quando passa do Wi-Fi para os dados móveis, e o tmux conserva tudo o que deixou a correr.
- Reveja antes de executar. A IA do termi1 transforma uma frase como “deixa o deploy recarregar o nginx sem palavra-passe” num comando escrito no prompt sem carregar em Enter. Nas ligações marcadas como produção, o Production Guard retém tudo o que apague, pare ou altere algo antes de chegar ao prompt.
As chaves SSH podem ser geradas no telemóvel e a chave privada nunca sai do dispositivo. Saiba mais sobre o terminal SSH para o telemóvel, descarregue o termi1 para iPhone ou visite o centro de suporte técnico.
Perguntas frequentes
Onde se coloca o NOPASSWD numa regra sudoers?
O NOPASSWD coloca-se numa regra sudoers imediatamente antes do comando, depois dos dois pontos: deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx. A etiqueta passa para os comandos seguintes na mesma linha, por isso mantenha essa linha limitada ao único comando que quer permitir sem palavra-passe.
Porque não funciona o meu ficheiro em /etc/sudoers.d?
Um ficheiro em /etc/sudoers.d costuma falhar por uma de três razões: o nome contém um ponto ou termina em ~, uma regra posterior exige palavra-passe e sobrepõe-se a ele, ou o caminho do comando não coincide exatamente. Verifique com sudo visudo -c e com sudo -l executado como esse utilizador.
O que acontece se guardar o sudoers com um erro de sintaxe?
Guardar o sudoers com um erro de sintaxe pode deixar o sudo estragado para todos os utilizadores. O visudo evita isto porque verifica a sintaxe antes de guardar e assinala o erro. Se editar com outro editor e estragar o ficheiro, precisará de uma shell root já aberta ou da consola de recuperação.
É seguro dar NOPASSWD ao meu próprio script?
Dar NOPASSWD ao seu próprio script só é seguro se o script pertencer a root e nenhum outro utilizador o puder modificar. Se o utilizador que tem a permissão sudo puder editar o script, pode acrescentar qualquer comando e executá-lo como root sem palavra-passe. Use sempre caminhos absolutos e argumentos fixos.