sudo vs su
O su troca para outro usuário (por padrão, root) e abre um shell completo. O sudo executa apenas um comando com privilégios elevados, sem trocar de sessão.
# Trocar para root (pede a senha do root)
su -
# Executar um comando como root (pede SUA senha)
sudo systemctl restart nginx
# Executar como outro usuário
sudo -u postgres psql
sudo a su. O sudo registra cada comando em log (/var/log/auth.log), enquanto o su não rastreia o que foi feito dentro do shell root.Verificando seus privilégios com sudo -l
Para saber o que você pode executar como sudo:
sudo -l
Matching Defaults entries for joao on srv01:
env_reset, mail_badpass,
secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
User joao may run the following commands on srv01:
(ALL : ALL) ALL
A linha (ALL : ALL) ALL significa: pode executar qualquer comando, como qualquer usuário/grupo, em qualquer host.
O arquivo /etc/sudoers
Toda configuração do sudo fica em /etc/sudoers. A sintaxe de cada regra é:
# quem onde=(como_quem) o_quê
ana ALL=(ALL:ALL) ALL
Para conceder acesso a um grupo inteiro, use % antes do nome:
# Todos do grupo devops podem executar qualquer comando
%devops ALL=(ALL:ALL) ALL
Editando com visudo
Nunca edite /etc/sudoers diretamente. Use visudo, que valida a sintaxe antes de salvar:
sudo visudo
Se houver erro de sintaxe, o visudo avisa e oferece opções para corrigir. Editar diretamente com vim/nano pode travar todo o acesso sudo do sistema.
/etc/sudoers.d/ em vez de editar o sudoers principal. Isso facilita o gerenciamento e evita conflitos em atualizações.# Criar regra em arquivo separado
sudo visudo -f /etc/sudoers.d/devops
NOPASSWD: sem pedir senha
Para comandos de automação (scripts, CI/CD), você pode dispensar a senha:
# Usuário deploy pode reiniciar nginx sem senha
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
# Grupo monitoring pode rodar qualquer comando sem senha
%monitoring ALL=(ALL) NOPASSWD: ALL
NOPASSWD: ALL para usuários comuns. Prefira listar comandos específicos. Quanto mais restrito, melhor a segurança.Restringindo comandos permitidos
Uma boa prática é permitir apenas os comandos necessários:
# ana pode apenas gerenciar o serviço web
ana ALL=(ALL) NOPASSWD: /usr/bin/systemctl start nginx, \
/usr/bin/systemctl stop nginx, \
/usr/bin/systemctl restart nginx, \
/usr/bin/systemctl status nginx
Verifique com:
sudo -l -U ana
User ana may run the following commands on srv01:
(ALL) NOPASSWD: /usr/bin/systemctl start nginx,
/usr/bin/systemctl stop nginx,
/usr/bin/systemctl restart nginx,
/usr/bin/systemctl status nginx
Aliases no sudoers
Para organizar regras complexas, use aliases:
# Definir alias de comandos
Cmnd_Alias SERVICOS = /usr/bin/systemctl start *, \
/usr/bin/systemctl stop *, \
/usr/bin/systemctl restart *
# Usar o alias
%devops ALL=(ALL) NOPASSWD: SERVICOS