Fundamentos de Configuracao do sudoers - Delegando Privilegios com Seguranca

Fundamentos de Configuracao do sudoers - Delegando Privilegios com Seguranca

O que e /etc/sudoers?

/etc/sudoers define quem pode executar o que como quem -- ele controla toda a delegacao de privilegios do comando sudo. Nunca edite-o diretamente; sempre use visudo.

Resumo Rapido

  • Somente edite sudoers via visudo (erros de sintaxe com edicao direta podem bloquear voce completamente do sudo)
  • Restrinja permissoes a comandos especificos sempre que possivel (ALL e ultimo recurso)
  • Use NOPASSWD apenas para pipelines CI/CD e automacao confiavel

Ambiente Alvo

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

Por que voce deve usar visudo?

visudo e um wrapper de editor com validacao 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 padrao e o nano. Substitua-o com a variavel EDITOR:

$ sudo EDITOR=vim visudo

Sintaxe do sudoers

Forma basica

usuario host=(executar-como) comando

O exemplo mais comum:

alice ALL=(ALL:ALL) ALL

O que cada campo significa:

Campo Exemplo Significado
Usuario alice A quem esta regra se aplica
Host ALL Valido em todos os hosts
Executar-como (ALL:ALL) Pode executar como qualquer usuario/grupo incluindo root
Comando ALL Todos os comandos

Delegacao 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 convencao. No CentOS/RHEL, e %wheel.

Restringindo a Comandos Especificos

Listar apenas os comandos que voce realmente precisa e 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 e efetivamente acesso root completo -- um usuario pode escapar para um shell com :!sh. Editores nunca devem estar no sudoers.

Configuracao 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 especificos. NOPASSWD: ALL deve ser raro e bem justificado
  • Monitore o uso do sudo em /var/log/auth.log

O Diretorio de Inclusao sudoers.d (Recomendado)

Para ambientes multi-servico 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 conteudo 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 la. Os arquivos devem ser de propriedade de root:root com modo 0440 ou serao silenciosamente ignorados.

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

Verificando e Testando Permissoes

Listar suas proprias permissoes sudo

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

Executar um comando como outro usuario

$ sudo -u www-data whoami
www-data

Verificar permissoes de outro usuario sem executar nada

$ sudo -l -U bob

Ajustando Comportamento com Defaults

A entrada Defaults altera o comportamento padrao do sudo globalmente ou por usuario.

# 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
Opcao Significado
timestamp_timeout=N Tempo de vida do cache de credenciais em minutos. 0 = sempre perguntar
env_reset Resetar variaveis de ambiente (habilitado por padrao)
logfile=/var/log/sudo.log Gravar atividade do sudo em um arquivo de log dedicado
passwd_tries=N Limite de tentativas de senha (padrao 3)

Erros Comuns e Correcoes

"sudo: /etc/sudoers is world writable"

$ sudo chmod 0440 /etc/sudoers

O arquivo deve ser legivel apenas pelo root (0440).

Alteracoes nao surtindo efeito apos visudo

  • Execute sudo -k para limpar o cache de credenciais, depois tente novamente
  • Apos adicionar um usuario ao grupo sudo, ele deve fazer logout e login novamente (ou executar newgrp sudo)

"sudo: command not found" para um binario conhecido

env_reset limpa o PATH. Certifique-se de que o diretorio do comando esta em secure_path:

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

Proximas Leituras