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 (
ALLe 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
Editar com sudo vi /etc/sudoers ou sudo nano /etc/sudoers diretamente ignora todas as verificacoes de seguranca. Um erro de sintaxe salvo dessa forma desabilita completamente o sudo. A recuperacao requer acesso ao shell root (ou um ambiente de recuperacao live se a senha root nao estiver configurada).
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: ALLdeve 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) ALLExecutar 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 -kpara 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"