15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar
10.11.2023

Como Desativar a Solicitação de Senha para o Comando Sudo no Linux

O comando sudo — abreviação de superuser do — concede a utilizadores Linux autorizados privilégios temporários de nível root para executar tarefas administrativas. Por padrão, cada invocação de sudo requer autenticação por palavra-passe para verificar a identidade do utilizador. Pode desativar este pedido de palavra-passe globalmente para um utilizador, seletivamente para comandos específicos, ou temporariamente para uma sessão, modificando o ficheiro /etc/sudoers através do visudo ou ajustando a diretiva timestamp_timeout.

Antes de continuar: desativar a autenticação por palavra-passe do sudo reduz a postura de defesa em profundidade do seu sistema. Aplique estas alterações apenas a contas de confiança, preferencialmente limitadas a comandos específicos em vez de privilégios ALL globais. Em qualquer ambiente de VPS Hosting em produção, trate o sudo sem palavra-passe como uma troca calculada, não como uma conveniência padrão.

Compreender Como Funciona a Autenticação do Sudo

Quando um utilizador executa sudo, a pilha PAM (Pluggable Authentication Modules) do Linux autentica o pedido com base nas regras definidas em /etc/sudoers. Após autenticação bem-sucedida, o kernel regista um timestamp de credencial em /run/sudo/ts/ (ou /var/db/sudo/ em distribuições mais antigas). Chamadas subsequentes de sudo dentro da janela timestamp_timeout — 15 minutos por padrão — ignoram completamente a reautenticação.

Esta arquitetura significa que existem dois mecanismos fundamentalmente diferentes que pode utilizar:

  • Cache de credenciais — estender ou eliminar a janela de timeout para que o utilizador se autentique uma vez e a credencial persista por mais tempo.
  • Diretiva NOPASSWD — instruir o sudo a ignorar completamente a autenticação para comandos ou utilizadores específicos, independentemente do tempo.

Compreender esta distinção é fundamental. Estender timestamp_timeout para um valor elevado ainda requer uma autenticação inicial. A diretiva NOPASSWD não requer qualquer autenticação, nunca. Estas opções não são equivalentes do ponto de vista da segurança.

O Ficheiro sudoers: Arquitetura e Edição Segura

O ficheiro de configuração principal é /etc/sudoers. Nunca deve ser editado diretamente com um editor de texto padrão. Utilize sempre visudo, que:

  • Bloqueia o ficheiro contra edições simultâneas
  • Valida a sintaxe antes de guardar
  • Impede que um ficheiro sudoers malformado bloqueie todos os utilizadores do sudo
sudo visudo

Em sistemas Debian/Ubuntu modernos, /etc/sudoers inclui um diretório de ficheiros adicionais:

/etc/sudoers.d/

Pode colocar ficheiros de regras individuais aqui em vez de modificar diretamente o ficheiro principal. Esta é a abordagem recomendada para sistemas em produção — mantém as suas regras personalizadas isoladas e facilita a auditoria.

sudo visudo -f /etc/sudoers.d/custom_nopasswd

Os ficheiros em /etc/sudoers.d/ não devem conter um . no seu nome (por exemplo, evite custom.conf) e devem ter permissões definidas para 0440:

sudo chmod 0440 /etc/sudoers.d/custom_nopasswd

Método 1: Ignorar Temporariamente o Pedido de Palavra-passe para uma Única Sessão

O sinalizador -S instrui o sudo a ler a palavra-passe da entrada padrão (stdin) em vez do terminal. Isto é principalmente útil em scripts não interativos onde a palavra-passe é fornecida programaticamente através de um pipe:

echo "your_password" | sudo -S apt update

Aviso importante: Incorporar palavras-passe em texto simples em scripts ou no histórico do shell é um risco de segurança significativo. Este método é adequado para pipelines de automação isolados onde a palavra-passe é injetada através de um gestor de segredos ou variável de ambiente — não codificada diretamente num ficheiro de script. Para automação sem supervisão num servidor, a diretiva NOPASSWD descrita abaixo é a solução arquiteturalmente mais limpa.

Método 2: Desativar o Pedido de Palavra-passe para Todos os Comandos de um Utilizador Específico

Este método concede a um utilizador nomeado a capacidade de executar qualquer comando sudo sem palavra-passe. Utilize-o com moderação — tipicamente para contas de serviço dedicadas ou utilizadores de automação, não para contas de operadores humanos.

Passo 1: Abra o ficheiro sudoers:

sudo visudo

Passo 2: Adicione a seguinte linha, substituindo username pelo nome real da conta Linux:

username ALL=(ALL) NOPASSWD: ALL

Passo 3: Guarde e saia. Em nano baseado em visudo, prima Ctrl+X, depois Y, depois Enter. Em vi baseado em visudo, escreva :wq.

O que esta regra significa, analisada:

CampoValorSignificado
usernameO utilizador alvoA quem a regra se aplica
ALL (primeiro)Qualquer hostA regra aplica-se em todas as máquinas (útil para configurações sudoers partilhadas)
(ALL)Qualquer utilizador alvoPode executar comandos como qualquer utilizador, incluindo root
NOPASSWD: ALLTodos os comandos, sem palavra-passeNão é necessária autenticação para nenhum comando

Método 3: Desativar o Pedido de Palavra-passe Apenas para Comandos Específicos

Esta é a abordagem mais consciente em termos de segurança quando a execução sem palavra-passe é genuinamente necessária. Em vez de conceder NOPASSWD: ALL global, limita a isenção a um caminho binário preciso.

Passo 1: Abra o ficheiro sudoers:

sudo visudo

Passo 2: Localize a secção Defaults e adicione uma regra direcionada abaixo dela:

username ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/apt-get update

Substitua username pela conta real e especifique o caminho absoluto completo para cada comando. Pode separar múltiplos comandos por vírgula numa única linha.

Passo 3: Guarde e saia.

Por que os caminhos absolutos são importantes: O sudo resolve os comandos com base nas regras do sudoers usando o caminho binário completo. Se especificar apt-get sem um caminho, a regra pode não corresponder, ou pior, um binário malicioso colocado anteriormente no $PATH pode ser invocado em vez disso. Verifique sempre os caminhos com which:

which systemctl
# /usr/bin/systemctl

Caso de uso real: Um pipeline de implementação a correr como utilizador deploy precisa de reiniciar serviços de aplicação após cada lançamento. Conceder NOPASSWD apenas para systemctl restart myapp significa que o pipeline pode funcionar de forma autónoma sem expor acesso root completo.

Método 4: Estender o Timeout do Timestamp de Credencial

Em vez de eliminar completamente a autenticação, pode estender o tempo durante o qual o sudo recorda uma autenticação bem-sucedida. Esta é a opção menos invasiva para utilizadores interativos que executam múltiplos comandos administrativos numa única sessão de trabalho.

Passo 1: Abra o ficheiro sudoers:

sudo visudo

Passo 2: Modifique ou adicione a diretiva timestamp_timeout no bloco Defaults:

Defaults    timestamp_timeout=60

Isto define a cache de credenciais para 60 minutos. O utilizador autentica-se uma vez, e os comandos sudo subsequentes dentro dessa janela não requerem palavra-passe.

Valores especiais:

ValorComportamento
0Palavra-passe necessária em cada invocação de sudo
-1A credencial nunca expira (efetivamente sem palavra-passe após a primeira autenticação)
15Padrão na maioria das distribuições
60Razoável para sessões de administração ativas

Passo 3: Guarde e saia.

Para aplicar uma substituição de timeout apenas para um utilizador específico em vez de todo o sistema:

Defaults:username    timestamp_timeout=60

Método 5: Utilizar um Ficheiro Drop-in do sudoers (Melhor Prática para Produção)

Em vez de editar /etc/sudoers diretamente, crie um ficheiro drop-in com âmbito definido. Esta abordagem é idempotente, auditável e segura para gerir através de ferramentas de gestão de configuração como Ansible, Puppet ou Chef.

sudo visudo -f /etc/sudoers.d/deploy_nopasswd

Dentro do ficheiro:

# Allow the deploy user to restart services without a password
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp

Defina as permissões corretas:

sudo chmod 0440 /etc/sudoers.d/deploy_nopasswd

Verifique se a configuração do sudoers é válida em todos os ficheiros:

sudo visudo -c
# sudoers file: /etc/sudoers, parsed OK
# sudoers file: /etc/sudoers.d/deploy_nopasswd, parsed OK

Comparação de Todos os Métodos

MétodoÂmbitoRequer Autenticação InicialRisco de SegurançaMelhor Caso de Uso
sudo -S com stdinComando únicoSim (via pipe)Alto se codificado diretamenteCI/CD com gestor de segredos
NOPASSWD: ALLTodos os comandos, um utilizadorNãoMuito AltoContas de automação isoladas
NOPASSWD: /path/cmdApenas comandos específicosNãoBaixo-MédioPipelines de implementação, scripts
Extensão timestamp_timeoutTodos os comandos, limitado no tempoSim (uma vez)BaixoSessões de administração interativas
Ficheiro drop-in /etc/sudoers.d/ConfigurávelConfigurávelDepende da regraProdução, servidores geridos por IaC

Considerações de Reforço de Segurança

Desativar os pedidos de palavra-passe do sudo introduz uma superfície de ataque real. Aplique estas mitigações:

  • Audite o uso do sudo: Ative o registo do sudo adicionando Defaults logfile="/var/log/sudo.log" à sua configuração do sudoers. Reveja este registo regularmente.
  • Restrinja por comando e argumento: NOPASSWD: /usr/bin/systemctl restart nginx é muito mais seguro do que NOPASSWD: /usr/bin/systemctl — o último permite ao utilizador parar, desativar ou mascarar qualquer serviço.
  • Utilize contas de serviço dedicadas: Nunca aplique NOPASSWD: ALL à conta principal de um operador humano. Crie uma conta com propósito específico (por exemplo, deploy, monitor) com uma lista de comandos permitidos mínima.
  • Combine com autenticação SSH apenas por chave: Se o sudo sem palavra-passe estiver configurado num servidor, certifique-se de que o próprio acesso SSH requer autenticação baseada em chave. Desativar simultaneamente as palavras-passe SSH e do sudo num servidor acessível publicamente é uma configuração incorreta crítica.
  • Rotacione e reveja: Audite periodicamente /etc/sudoers.d/ para regras obsoletas associadas a contas desativadas ou scripts descontinuados.

Em Servidores Dedicados onde tem controlo total do hardware, estas configurações têm ainda mais peso — uma conta comprometida com sudo sem palavra-passe numa máquina dedicada significa acesso root completo e incontestado sem qualquer contenção ao nível do hipervisor.

Verificar a Sua Configuração

Após efetuar alterações, teste sempre a regra como utilizador alvo sem mudar para root:

# Switch to the target user
su - username

# Test a specific command
sudo /usr/bin/systemctl restart nginx

# Verify sudo privileges without executing a command
sudo -l

sudo -l lista todos os comandos que o utilizador atual tem permissão para executar, incluindo quais são NOPASSWD. Esta é a sua principal ferramenta de depuração quando uma regra não se comporta como esperado.

Para verificar as regras do sudoers efetivas para um utilizador específico a partir de uma sessão root:

sudo -l -U username

Configuração Prática para um Pipeline de Implementação de Servidor Web

O seguinte é uma configuração completa e pronta para produção para um utilizador de implementação num servidor web — o tipo de configuração que utilizaria num VPS com cPanel ou numa stack LEMP/LAMP personalizada:

1. Crie o utilizador de implementação:

sudo useradd -m -s /bin/bash deploy
sudo passwd deploy

2. Crie a regra drop-in do sudoers:

sudo visudo -f /etc/sudoers.d/deploy
# Deployment pipeline: passwordless service management only
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart php8.2-fpm
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl reload nginx
deploy ALL=(ALL) NOPASSWD: /usr/bin/chown -R www-data /var/www/html

3. Defina permissões e valide:

sudo chmod 0440 /etc/sudoers.d/deploy
sudo visudo -c

4. Teste como utilizador de implementação:

su - deploy
sudo systemctl restart nginx
# Should execute without a password prompt

Este padrão é diretamente aplicável a qualquer fluxo de trabalho de implementação automatizado, quer esteja a utilizar GitHub Actions, GitLab CI, Jenkins ou um script shell personalizado acionado via SSH.

Se a sua infraestrutura incluir Painéis de Controlo VPS geridos, verifique que o utilizador de sistema do próprio painel (por exemplo, cpanel, plesk) não é inadvertidamente afetado por regras NOPASSWD: ALL amplas que adicione ao sudoers.

Lista de Verificação de Pontos-Chave

Antes de aplicar qualquer configuração de sudo sem palavra-passe, percorra esta matriz de decisão:

  • É uma conta humana ou uma conta de serviço? As contas de serviço podem tolerar NOPASSWD; as contas humanas devem utilizar a extensão timestamp_timeout em vez disso.
  • Pode limitar a isenção a comandos específicos? Prefira sempre NOPASSWD: /path/to/command em vez de NOPASSWD: ALL.
  • O acesso SSH está protegido com autenticação baseada em chave? Se não, corrija isso primeiro antes de relaxar os requisitos do sudo.
  • A atividade do sudo está a ser registada? Adicione Defaults logfile="/var/log/sudo.log" se ainda não estiver presente.
  • Está a utilizar ficheiros drop-in em /etc/sudoers.d/? Prefira isto em vez de editar /etc/sudoers diretamente para maior manutenibilidade.
  • Executou sudo visudo -c para validar a sintaxe? Nunca ignore este passo — um erro de sintaxe no sudoers pode bloqueá-lo completamente do acesso administrativo.
  • Tem um método de recuperação fora de banda? Em instâncias VPS na nuvem, certifique-se de que tem acesso à consola ou um snapshot de recuperação antes de efetuar alterações ao sudoers.

FAQ

Qual é a forma mais segura de permitir sudo sem palavra-passe para um script específico?

Crie um script wrapper com um caminho absoluto fixo, coloque-o num diretório do sistema (por exemplo, /usr/local/bin/deploy-restart.sh), e conceda NOPASSWD apenas para esse caminho específico em /etc/sudoers.d/. Isto impede a injeção de argumentos e limita o impacto se a conta for comprometida.

Desativar o pedido de palavra-passe do sudo afetará imediatamente todas as sessões de terminal?

Sim. As alterações ao /etc/sudoers ou aos ficheiros em /etc/sudoers.d/ têm efeito imediato para todas as novas invocações de sudo. Não é necessário reiniciar nenhum serviço nem terminar sessão. As credenciais em cache existentes não são afetadas até expirarem.

O que acontece se cometer um erro de sintaxe no ficheiro sudoers?

Se utilizou visudo, este detetará o erro antes de guardar e solicitará que o corrija. Se de alguma forma contornou o visudo e introduziu um erro de sintaxe, o sudo recusará executar completamente. A recuperação requer arrancar em modo de utilizador único ou utilizar acesso à consola fora de banda para corrigir o ficheiro.

Posso aplicar NOPASSWD a um grupo em vez de a um utilizador individual?

Sim. Utilize a sintaxe %groupname: %developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx. Isto aplica a regra a todos os membros do grupo developers, facilitando a gestão do acesso em escala sem editar o sudoers para cada novo membro da equipa.

O timestamp_timeout=-1 comporta-se da mesma forma que o NOPASSWD: ALL?

Não. timestamp_timeout=-1 significa que a credencial nunca expira após a primeira autenticação bem-sucedida — mas essa primeira autenticação ainda requer uma palavra-passe. NOPASSWD: ALL ignora completamente a autenticação, incluindo a primeira invocação. O primeiro é significativamente mais seguro para utilizadores interativos.

15%

Poupe 15% em todos os serviços

Teste as suas habilidades e obtenha Desconto em qualquer plano

Utilizar o código:

Skills
Começar a trabalhar