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-nginx

Conteúdo do ficheiro:

# deploy may reload nginx without a password, and nothing else
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl reload nginx

Confirme 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 nginx

visudo -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.conf não.
  • Propriedade de root, modo 0440. Verifique com ls -l /etc/sudoers.d; se copiou o ficheiro de outro lado, corrija-o com chown root:root e chmod 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:

  1. Sem argumentos na regra (/usr/bin/systemctl): qualquer argumento é permitido, incluindo parar ou editar qualquer serviço.
  2. Argumentos exatos (/usr/bin/systemctl reload nginx): apenas essa linha de comando.
  3. Um "" vazio (/usr/local/bin/backup ""): o comando só é aceite sem argumentos.
  4. 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 medeRegra delimitada com caminho absolutoNOPASSWD: ALLsudo com palavra-passe
Alcance sem palavra-passeUma linha de comando exataQualquer comando como rootNenhum
Adequado para automatizaçãoSim, para essa tarefaSim, sem limitesNão, sudo -n falha
Se a sessão do utilizador for roubadaO atacante só pode executar esse comandoO atacante é rootO atacante também precisa da palavra-passe
Auditoria com sudo -lMostra o comando permitidoMostra ALL, sem detalheDepende 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 -i noutra 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.