Entendendo sudo vs su - Escalação de Privilégios Segura no Linux

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 sudo e su conforme 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 como PATH mudam 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) e HOME (o diretório pessoal) são os exemplos típicos.
  • sudoers é o arquivo de configuração /etc/sudoers que registra quem pode executar quais comandos.
  • visudo é o comando dedicado a editar o sudoers com 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. Use sudo -i em 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

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 comando para um único comando e sudo -i para trabalho prolongado
  • [ ] Saiu do shell root com exit ao terminar o trabalho
  • [ ] Editou o sudoers por meio do visudo
  • [ ] Restringiu qualquer entrada NOPASSWD a comandos específicos por caminho absoluto
  • [ ] Verificou com sudo -l o que você tem permissão de executar

Próximas Leituras