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
Dica: Prefira sempre 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.

Dica: Use arquivos separados em /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
Dica: Evite 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