Fundamentos de Configuração do sudoers - Delegando Privilégios com Segurança

Fundamentos de Configuração do sudoers - Delegando Privilégios com Segurança

O que é /etc/sudoers?

/etc/sudoers define quem pode executar o que como quem -- ele controla toda a delegação de privilégios do comando sudo. Nunca edite-o diretamente; sempre use visudo.

Resumo Rápido

  • Somente edite sudoers via visudo (erros de sintaxe com edição direta podem bloquear você completamente do sudo)
  • Restrinja permissões a comandos específicos sempre que possível (ALL é último recurso)
  • Use NOPASSWD apenas para pipelines CI/CD e automação confiável

Ambiente Alvo

  • SO: Ubuntu 22.04 / 24.04 (aplica-se a distros baseadas em Debian em geral)
  • sudo deve estar instalado (instalado por padrão)

Por que você deve usar visudo?

visudo é um wrapper de editor com validação de sintaxe -- ele verifica erros antes de salvar e recusa gravar um arquivo quebrado. Isso impede que o sudo fique travado em um estado quebrado.

$ sudo visudo

No Ubuntu, o editor padrão é o nano. Substitua-o com a variável EDITOR:

$ sudo EDITOR=vim visudo

Sintaxe do sudoers

Forma básica

usuario host=(executar-como) comando

O exemplo mais comum:

alice ALL=(ALL:ALL) ALL

O que cada campo significa:

Campo Exemplo Significado
Usuário alice A quem esta regra se aplica
Host ALL Válido em todos os hosts
Executar-como (ALL:ALL) Pode executar como qualquer usuário/grupo incluindo root
Comando ALL Todos os comandos

Delegação de grupo

Prefixe com % para especificar um grupo:

%sudo ALL=(ALL:ALL) ALL
%wheel ALL=(ALL) ALL

No Ubuntu, o grupo %sudo recebe acesso sudo por convenção. No CentOS/RHEL, é %wheel.

Restringindo a Comandos Específicos

Listar apenas os comandos que você realmente precisa é a abordagem mais segura.

# Permitir apenas reinicio do nginx
bob ALL=(root) /usr/bin/systemctl restart nginx

# Multiplos comandos, separados por virgula
carol ALL=(root) /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx

Os comandos devem ser escritos com caminhos absolutos completos (verifique com which nginx).

Conceder acesso a editores como /usr/bin/vim é efetivamente acesso root completo -- um usuário pode escapar para um shell com :!sh. Editores nunca devem estar no sudoers.

Configuração NOPASSWD

Permite executar comandos sem digitar senha. Comum em pipelines CI/CD e scripts de deploy.

# NOPASSWD para um comando especifico apenas
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp

# NOPASSWD para um grupo inteiro (use com cautela)
%automation ALL=(ALL) NOPASSWD: ALL

Riscos do NOPASSWD

  • Se um script for comprometido, comandos root executam sem nenhum prompt de senha
  • Sempre restrinja a comandos específicos. NOPASSWD: ALL deve ser raro e bem justificado
  • Monitore o uso do sudo em /var/log/auth.log

O Diretório de Inclusão sudoers.d (Recomendado)

Para ambientes multi-serviço ou multi-equipe, coloque arquivos de regras individuais em /etc/sudoers.d/ em vez de editar o arquivo principal.

# Criar um novo arquivo com verificacao de sintaxe
$ sudo visudo -f /etc/sudoers.d/deploy-user

Exemplo de conteúdo do arquivo:

# /etc/sudoers.d/deploy-user
deploy ALL=(root) NOPASSWD: /usr/bin/systemctl restart myapp, /usr/bin/systemctl status myapp

O /etc/sudoers principal termina com #includedir /etc/sudoers.d, que carrega automaticamente todos os arquivos de lá. Os arquivos devem ser de propriedade de root:root com modo 0440 ou serão silenciosamente ignorados.

$ sudo chmod 0440 /etc/sudoers.d/deploy-user
$ sudo chown root:root /etc/sudoers.d/deploy-user

Verificando e Testando Permissões

Listar suas próprias permissões sudo

$ sudo -l
User alice may run the following commands on server:
    (ALL : ALL) ALL

Executar um comando como outro usuário

$ sudo -u www-data whoami
www-data

Verificar permissões de outro usuário sem executar nada

$ sudo -l -U bob

Ajustando Comportamento com Defaults

A entrada Defaults altera o comportamento padrão do sudo globalmente ou por usuário.

# Exigir senha toda vez (desabilitar cache)
Defaults timestamp_timeout=0

# Nao herdar o PATH do usuario (padrao -- seguro)
Defaults env_reset

# Aplicar apenas a um usuario especifico
Defaults:bob timestamp_timeout=5
Opção Significado
timestamp_timeout=N Tempo de vida do cache de credenciais em minutos. 0 = sempre perguntar
env_reset Resetar variáveis de ambiente (habilitado por padrão)
logfile=/var/log/sudo.log Gravar atividade do sudo em um arquivo de log dedicado
passwd_tries=N Limite de tentativas de senha (padrão 3)

Erros Comuns e Correções

"sudo: /etc/sudoers is world writable"

$ sudo chmod 0440 /etc/sudoers

O arquivo deve ser legível apenas pelo root (0440).

Alterações não surtindo efeito após visudo

  • Execute sudo -k para limpar o cache de credenciais, depois tente novamente
  • Após adicionar um usuário ao grupo sudo, ele deve fazer logout e login novamente (ou executar newgrp sudo)

"sudo: command not found" para um binário conhecido

env_reset limpa o PATH. Certifique-se de que o diretório do comando está em secure_path:

Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

Próximas Leituras