Entendendo sudo vs su - Escalação de Privilégios Segura no Linux
O que você vai conseguir fazer
- Escolher entre sudo e su conforme a tarefa
- Explicar em termos de segurança por que o sudo é recomendado
- Editar o sudoers com segurança usando o visudo
Pré-requisitos (leia estes primeiro)
O que Você Vai Aprender
- Você vai conseguir escolher entre
sudoesuconforme a tarefa. - Você vai conseguir explicar, em termos de segurança, por que o
sudoé a abordagem recomendada. - Você vai conseguir escrever com segurança a configuração básica do
sudoers. - Você vai conhecer os padrões de acidente mais comuns e como evitá-los.
Para quem é: quem está começando em um servidor Ubuntu e digita sudo como se fosse uma formula mágica.
Termos definidos antes de começar
Cada termo abaixo é definido uma única vez, aqui.
- Escalação de privilégios é realizar uma operação que seu usuário atual não tem permissão de fazer, usando privilégios mais fortes.
- root é o nome do usuário administrador que pode fazer tudo no sistema. Também é chamado de superusuário.
- Um shell de login é um shell que carregou a configuração de login (
.profile,.bashrc). Para o mesmo usuário, variáveis de ambiente comoPATHmudam conforme o shell seja ou não de login. - Uma variável de ambiente é um valor de configuração que o shell carrega.
PATH(a lista de lugares onde os comandos são procurados) eHOME(o diretório pessoal) são os exemplos típicos. - sudoers é o arquivo de configuração
/etc/sudoersque registra quem pode executar quais comandos. - visudo é o comando dedicado a editar o
sudoerscom checagem de sintaxe. - NOPASSWD é uma configuração do sudoers que permite executar um comando sem digitar senha.
Resumo Rápido
- Executar um comando como root -->
sudo command - Iniciar uma sessão root estendida (use com moderação) -->
sudo -i - Executar como outro usuário -->
sudo -u username command su -requer a senha do root -- desabilitada por padrão no Ubuntu. Usesudo -iem vez disso.
Pré-requisitos
- SO: Ubuntu (ou outras distros baseadas em Debian)
- Sua conta de usuário é membro do grupo
sudo
Qual é a Diferença Entre sudo e su?
Tanto sudo (substitute user do) quanto su (switch user) elevam privilégios, mas funcionam de maneiras diferentes.
| Aspecto | sudo | su |
|---|---|---|
| Autenticação | Sua própria senha | Senha do usuário de destino |
| Senha root necessária | Não | Sim (para su -) |
| Log de auditoria | /var/log/auth.log |
Mínimo |
| Controle de permissão | Por comando via /etc/sudoers |
Acesso root completo |
| Padrão no Ubuntu | Disponível | Bloqueado (senha root desabilitada) |
sudo é a ferramenta preferida porque aplica acesso de menor privilégio por usuário sem compartilhar a senha root.
Como Usar o sudo
2-1. Uso Básico -- Um Comando por Vez
$ sudo command
Exemplos:
$ sudo apt update $ sudo systemctl restart nginx
2-2. Iniciar um Shell Root de Login
$ sudo -i
sudo -i inicia um shell root que carrega as variáveis de ambiente e .profile do root. Use isso apenas quando precisar executar múltiplos comandos como root.
Sempre execute exit ao terminar o shell root. Executar como root desnecessariamente aumenta o risco de danos acidentais.
2-3. Executar como Outro Usuário
$ sudo -u username command
Exemplo -- executar um comando como www-data:
$ sudo -u www-data php /var/www/html/artisan cache:clear
2-4. Por Quanto Tempo o sudo Permanece Ativo?
Após autenticação bem-sucedida, o sudo armazena credenciais em cache por 15 minutos por padrão. Para invalidar o cache manualmente:
$ sudo -k
Para listar suas permissões sudo atuais:
$ sudo -l
User alice may run the following commands on hostname:
(ALL : ALL) ALL
(ALL : ALL) ALL significa "como qualquer usuário, qualquer comando". Quando apenas comandos específicos são permitidos, os caminhos deles aparecem na lista.
Como Usar o su
3-1. su - para um Shell de Login
$ su - [username]
A flag - (equivalente a -l ou --login) recria o ambiente de login completo do usuário de destino -- diretório home, variáveis de ambiente e PATH.
$ su - deploy # Iniciar um shell de login como o usuario deploy
3-2. su vs su - -- O que Muda?
$ su username # Aviso: herda SEU ambiente atual $ su - username # Correto: reproduz o ambiente de login do usuario de destino
Usar su username sem - carrega suas variáveis de ambiente atuais para o novo shell. Isso frequentemente causa confusão de PATH e erros command not found no contexto do usuário de destino.
3-3. Por que o su Não Funciona no Ubuntu por Padrão
O Ubuntu desabilita a senha da conta root por padrão. Tentar su - para alternar para root falha na autenticação:
$ su - Password: su: Authentication failure # senha root esta desabilitada
Use sudo -i em vez disso para um shell root interativo no Ubuntu.
Por que o sudo é Recomendado?
A vantagem principal do sudo sobre o su é seu modelo de segurança.
Toda ação é registrada. Cada invocação do sudo registra quem executou qual comando e quando em /var/log/auth.log:
# Sistemas com rsyslog (Ubuntu 22.04 e similares) $ sudo grep sudo /var/log/auth.log | tail -3 # Sistemas apenas com journald (instalacao padrao do Ubuntu 24.04 e similares) $ sudo journalctl -t sudo -n 3
May 31 10:30:01 host sudo: alice : TTY=pts/0 ; PWD=/home/alice ; USER=root ; COMMAND=/usr/bin/apt update
A instalação padrão do Ubuntu 24.04 não inclui o rsyslog, então o /var/log/auth.log pode não existir. Nesse caso os registros ficam no journald, e você usa a forma com journalctl.
Quem executou, a partir de qual diretório e qual comando: tudo em uma linha. A investigação de incidentes é possível justamente porque esse registro existe.
Aplicação do menor privilégio. O sudoers permite conceder apenas os comandos que um usuário realmente precisa. Um operador pode reiniciar um serviço específico sem obter acesso root completo.
Sem senha root compartilhada. Os membros da equipe se autenticam com suas próprias senhas, mantendo as credenciais individuais e revogáveis.
Configurando sudoers com visudo
5-1. Sempre Use visudo
/etc/sudoers deve ser editado com visudo. Ele valida a sintaxe antes de salvar, prevenindo cenários de bloqueio onde um arquivo sudoers quebrado torna o sudo inutilizável.
$ sudo visudo
Nunca edite /etc/sudoers diretamente
Não abra o /etc/sudoers com vi ou nano. O que acontece quando dá errado é o seguinte.
- Um único caractere de sintaxe errada desabilita o
sudopor completo. - No Ubuntu a senha de root é desabilitada, então o
su -também não salva. É preciso iniciar em modo de recuperação por um console físico. - Se isso acontecer durante um trabalho via SSH, você perde o acesso administrativo aquele servidor.
Como se manter seguro envolve três hábitos.
- Edite sempre com
sudo visudo. Ele roda a checagem de sintaxe ao salvar e recusa gravar um arquivo quebrado. - Pratique em uma máquina virtual ou container local, nunca em um servidor de produção.
- Antes de começar, deixe um segundo terminal aberto com uma sessão em que o
sudo -vjá funciona. Se quebrar o sudoers, você conserta por essa sessão.
5-2. Sintaxe Básica
# usuario host=(executar-como) comando alice ALL=(ALL) ALL # NOPASSWD: pular prompt de senha para um comando especifico deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
5-3. Conceder Permissões a um Grupo
# Prefixe nomes de grupo com % %admin ALL=(ALL) ALL %deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl
5-4. Use Arquivos Drop-In (Recomendado)
Para ambientes de produção, evite editar sudoers diretamente. Coloque arquivos por função em /etc/sudoers.d/:
$ sudo visudo -f /etc/sudoers.d/deploy
Conteúdo:
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
Erros Comuns
Definindo NOPASSWD para TODOS os Comandos
# Perigoso em producao: alice ALL=(ALL) NOPASSWD: ALL
Isso elimina toda fricção de senha. Aceitável em máquinas de desenvolvimento local, mas copiar essa configuração para um servidor de produção é um risco critico de segurança. No momento em que a sessão desse usuário for sequestrada, o atacante ganha poder equivalente ao root sem saber nenhuma senha. Restrinja a comandos específicos.
Editando sudoers sem visudo
Executar vi /etc/sudoers diretamente e introduzir um erro de sintaxe desabilita o sudo. Sempre use visudo -- ele realiza uma verificação de sintaxe antes de gravar o arquivo.
Usando su sem a Flag -
# Herda seu PATH -- provavelmente causa erros command-not-found: $ su deploy # Correto -- reproduzir o ambiente de login do deploy: $ su - deploy
Referência Rápida
| Tarefa | Comando |
|---|---|
| Executar um comando como root | sudo command |
| Iniciar um shell root de login | sudo -i |
| Executar um comando como outro usuário | sudo -u user command |
| Abrir um shell interativo como usuário | sudo -u user -i |
| Invalidar cache de credenciais sudo | sudo -k |
| Listar suas permissões sudo atuais | sudo -l |
| Editar sudoers com segurança | sudo visudo |
Templates Prontos para Copiar
# Verificar o que o sudo permite voce executar sudo -l # Executar um comando como root sudo apt update # Iniciar um shell root -- saia quando terminar sudo -i exit
Solução de Problemas
Sintoma: alice is not in the sudoers file. This incident will be reported.
Causa: o usuário não pertence ao grupo sudo (wheel em sistemas baseados em RHEL).
Verificação:
id -nG
alice
Se sudo não aparecer na lista, o privilégio não existe.
Correção: peça a outro usuário com direitos administrativos que adicione a conta.
sudo usermod -aG sudo alice # executado pelo administrador
A mudança passa a valer somente depois que o usuário alvo sair e entrar de novo. Se não houver administrador disponível, inicie em modo de recuperação por um console físico e corrija por lá.
Sintoma: sudo: unable to resolve host <hostname>
Causa: o nome em /etc/hostname não está registrado em /etc/hosts. O sudo continua funcionando, mas o aviso aparece sempre.
Verificação:
hostname grep "$(hostname)" /etc/hosts
Correção: acrescente o hostname atual à linha 127.0.0.1 do /etc/hosts. Faça uma cópia antes para poder voltar atrás.
sudo cp /etc/hosts /etc/hosts.bak sudo nano /etc/hosts
127.0.0.1 localhost myhost
Sintoma: sudo: no tty present and no askpass program specified
Causa: um comando sudo que pede senha foi executado em um ambiente sem terminal, como cron ou um script.
Verificação: confirme se a origem é um contexto não interativo: cron, systemd, CI.
Correção: conceda NOPASSWD no sudoers apenas para aquele comando, restrito por caminho absoluto.
sudo visudo -f /etc/sudoers.d/deploy
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
Sintoma: 3 incorrect password attempts
Causa: a senha foi digitada errado três vezes. O sudo desiste depois de três falhas.
Verificação: confirme que você está digitando a sua própria senha, não a senha do root. O sudo pede a sua.
Correção: execute o sudo de novo e digite a sua senha. Se a esqueceu, peça a outro administrador que a redefina com sudo passwd alice.
Checklist de Conclusão
- [ ] Escolheu
sudo comandopara um único comando esudo -ipara trabalho prolongado - [ ] Saiu do shell root com
exitao terminar o trabalho - [ ] Editou o
sudoerspor meio dovisudo - [ ] Restringiu qualquer entrada
NOPASSWDa comandos específicos por caminho absoluto - [ ] Verificou com
sudo -lo que você tem permissão de executar