Sudo (Português)
Sudo possibilita que um adminitrador do sistema dê autoridade a certos usuários —ou grupos de usuários— de executar comandos como root ou outro usuário enquanto fornece uma trilha de auditoria dos comandos e seus argumentos.
Sudo é uma alternativa ao su para executar comandos como root. Diferente do su, que lança um shell root que faz todos os próximos comandos terem acesso root, sudo garante escalação de privilégio temporária para um único comando. Ao habilitar privilégios root somente quando necessário, o uso do sudo reduz a probabilidade que um erro de digitação ou bug no comando arruine o sistema.
Sudo também pode ser usado para executar comandos como outros usuários; adicionalmente, sudo faz log de todos os comandos e tentativas de acesso fracassadas para auditoria de segurança.
Instalação
Uso
Para começar a usar sudo
como um usuário sem privilégios, é necessário configurá-lo apropriadamente. Veja #Configuração.
Para usar sudo, simplesmente prefixe o comando e seus argumentos com sudo
e um espaço:
$ sudo comando
Por exemplo, para usar pacman:
$ sudo pacman -Syu
Veja sudo(8) para mais informações.
Configuração
Estrutura do Defaults
O site do autor tem uma lista de todas as opções (inglês) que podem ser usadas com o comando Defaults
no arquivo /etc/sudoers
.
Veja [1] para uma lista de opções (parseada da versão 1.8.7 do código fonte) em um formato otimizado para o sudoers
.
Veja sudoers(5) para mais informações, como configurar o tempo antes de pedir novamente a senha.
Ver as configurações atuais
Execute sudo -ll
para mostrar a configuração atual do sudo, ou sudo -lU usuário
para a configuração específica de um usuário.
Usando visudo
O arquivo de configuração do sudo é o /etc/sudoers
. Ele deve sempre ser editado com o comando visudo(8). visudo
trava o arquivo sudoers
, salva as modificações para um arquivo temporário e verifica se o arquivo foi configurado corretamente antes de copiá-las para o /etc/sudoers
.
- É imperativo que
sudoers
não tenha erros de sintaxe! Qualquer erro inutiliza o sudo. Sempre edite ele comvisudo
para evitar erros. - Do visudo(8) (traduzido): Note que isto pode ter um buraco na segurança considerando que o usuário pode executar qualquer programa ao simplesmente definir as váriaveis de ambiente VISUAL ou EDITOR.
O editor padrão do visudo é o vi
. O sudo do repositório core é compilado com --with-env-editor
por padrão e possibilita o uso das váriaveis VISUAL
e EDITOR
. EDITOR
não é usada quando VISUAL
está definida.
Para usar nano como o editor do visudo durante o shell atual execute export EDITOR=nano
; para usar um editor diferente somente uma vez simplesmente defina a váriavel antes de executar o visudo:
# EDITOR=nano visudo
Alternativamente você pode editar uma cópia do arquivo /etc/sudoers
e verificá-lo com visudo -c -f /cópia/do/sudoers
. Isto pode ser útil caso você queira evitar a trava do arquivo com visudo.
Para mudar o editor permanentemente, veja Variáveis de ambiente#Por usuário. Para mudar o editor permanentemente no sistema todo somente para o visudo
, adicione o seguinte para o /etc/sudoers
(assumindo que nano
é o editor escolhido):
# Reseta o ambiente para o padrão Defaults env_reset # Define EDITOR para o nano, e não permite que o visudo use EDITOR/VISUAL. Defaults editor=/usr/bin/nano, !env_editor
Exemplos de entradas
Para permitir um usuário à ganhar todos os privilégios root quando precedido com o comando sudo
, adicione a seguinte linha:
NOME_DO_USUÁRIO ALL=(ALL) ALL
Para permitir que um usuário execute todos os comandos como qualquer usuário mas somente na máquina com o nome NOME_DA_MÁQUINA
(hostname):
NOME_DO_USUÁRIO NOME_DA_MÁQUINA=(ALL) ALL
Para permitir que membros do grupo wheel
usem o sudo:
%wheel ALL=(ALL) ALL
wheel
e adicionar o usuário nele, considerando que o Polkit por padrão trata os membros do grupo wheel
como administradores. Se o usuário não é membro do wheel
, programas usando Polkit pode pedir autentificação pela senha do root ao invês de pedir a do usuário.Para desabilitar a solicitação de senha para o usuário NOME_DO_USUÁRIO
:
Defaults:NOME_DO_USUÁRIO !authenticate
Para habilitar explicitamente comandos definidos somente pelo usuário NOME_DO_USUÁRIO
na máquina NOME_DA_MÁQUINA
:
NOME_DO_USUÁRIO NOME_DA_MÁQUINA=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
%wheel
se seu usuário está nesse grupo.Para habilitar explicitamente comandos definido somente para o usuário NOME_DO_USUÁRIO
na máquina NOME_DA_MÁQUINA
sem senha:
NOME_DO_USUÁRIO NOME_DA_MÁQUINA= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
Um exemplo detalhado do sudoers
está disponível em /usr/share/doc/sudo/examples/sudoers
. De outro modo, veja sudoers(5) para informações detalhadas.
Permissões padrão do arquivo sudoers
O dono e grupo para o arquivo sudoers
devem ser ambos 0. As permissões do arquivo devem ser definidas para 0440. Estas permissões são definidas por padrão, mas se você acidentalmente mudá-las, elas devem ser mudadas de volta imediatamente ou sudo vai dar erro.
# chown -c root:root /etc/sudoers # chmod -c 0440 /etc/sudoers
Dicas e truques
Desabilitar o tempo de solicitação da senha
Um incômodo comum é um processo com grande tempo de execução que é executado em segundo plano com permissões normais e as eleva somente quando necessário. Isto leva a solicitação da senha não ser notada e esgotar o tempo dela, fazendo com que o processo morra e o trabalho feito seja perdido, ou no melhor caso, salvo em cache. O conselho comum é habilitar o sudo sem senha, ou extender o tempo que o sudo se lembra da senha. Ambos tem implicações negativas de segurança. O tempo de solicitação pode ser desabilitado e considerando que isto não serve qualquer próposito de maior segurança, esta deve ser a solução aqui:
Defaults passwd_timeout=0
Adicionar toque no terminal na solicitação de senha
Para chamar atenção na solicitação de senha do sudo em um terminal no segundo plano, usuários podem simplesmente fazé-lo tocar um caractere bell
Defaults passprompt="^G[sudo] password for %p: "
Note que ^G é um caractere bell literal. E.x. no vim, insira usando a sequência ^V ^G.
Utilizando aliases
Se você usa muitas aliases, você pode ter notado que elas não são levadas a conta root quando o sudo é usado. No entanto, tem uma maneira fácil de fazê-los funcionar. Simplesmente adicione o seguinte para seu ~/.bashrc
ou /etc/bash.bashrc
:
alias sudo='sudo '
Desabilitar sudo por terminal
Se você está incomodado pelo padrão do sudo em solicitar a senha toda vez que você abre um novo terminal, defina timestamp_type
para global
:
Defaults timestamp_type=global
Reduzir o número de vezes que você tem que digitar a senha
Se você está incomodado em ter que entrar com sua senha a cada 5 minutos (padrão), você pode mudar isto ao definir um valor maior para timestamp_timeout
(em minutos):
Defaults timestamp_timeout=10
Se você está usando vários comandos sudo em sequência, é mais lógico atualizar o tempo de solicitação da senha toda vez que você usa o sudo do que aumentar timestamp_timeout
. Essa atualização pode ser feita com sudo -v
(onde sudo -K
revoca imediatamente).
Você pode querer automatizar isto ao adicionar o seguinte para seu .bashrc
:
alias sudo='sudo -v; sudo '
É também possível usar uma função bash; para mais detalhes veja stackexchange.
Variáveis de ambiente
Se você tem várias variáveis de ambiente, ou você exporta suas configurações de proxy com export http_proxy="..."
, quando você usar o sudo estas variáveis não vão ser passadas para a conta root a menos que você o execute com a opção -E
.
$ sudo -E pacman -Syu
A maneira recomendada de preservar as variáveis de ambiente é adicioná-las ao env_keep
:
/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"
Senha do root
Usuários podem configurar o sudo para pedir a senha do root ao invês da senha do usuário ao adicionar targetpw
(usuário alvo, o padrão é o root) ou rootpw
para a linha Defaults em /etc/sudoers
:
Defaults targetpw
Para evitar a exposição da sua senha root para os usuários, você pode restringir isto para um grupo específico:
Defaults:%wheel targetpw %wheel ALL=(ALL) ALL
Desabilitar o login do root
Usuários podem desejar desabilitar o login do root. Sem o root, atacantes devem primeiro supor o nome do usuário configurado como um sudoer e também a senha dele. Veja por exemplo OpenSSH#Deny.
- Tenha cuidado, você pode se trancar fora do sistema ao desabilitar o login do root. Sudo não é automaticamente instalado e sua configuração padrão não permite acesso ao root sem senha e nem com a senha do seu usuário. Garanta que um usuário está configurado apropriadamente como um sudoer antes de desabilitar a conta root!
- Se você modificou seu arquivo sudoers para usar rootpw por padrão, então não desabilite o login do root com qualquer um dos comandos a seguir!
- Se você já está trancado fora do sistema, veja Password recovery para ajuda.
A conta pode ser bloqueada com passwd
:
# passwd -l root
Um comando similar desbloqueia o root.
$ sudo passwd -u root
Alternativamente, edite /etc/shadow
e troque a senha criptografada do root com "!":
root:!:12345::::::
Para habilitar o login do root novamente:
$ sudo passwd root
sudo -i
.kdesu
kdesu pode ser usado no KDE para lançar programas gráficos com privilégios root. É possível que por padrão kdesu vai tentar usar su até mesmo se a conta root está desabilitada. Felizmente, você pode configurar o kdesu para usar sudo ao invês do su. Crie/edite o arquivo ~/.config/kdesurc
:
[super-user-command] super-user-command=sudo
ou use o seguinte comando:
$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo
Alternativamente, instale kdesudoAUR, que têm a vantagem adicionada da autocompletação com tab para o seguinte comando.
Exemplo de como aumentar a segurança com sudo
Vamos supor que você criou 3 usuários: admin, devel, e joe. O usuário "admin" é usado para journalctl, systemctl, mount, kill, e iptables; "devel" é usado para instalar pacotes, e editar arquivos de configuração; e "joe" é o usuário que você entra no sistema. Para permitir que "joe" reinicie e desligue o sistema e use netctl, devemos fazer o seguinte:
Edite /etc/pam.d/su
e /etc/pam.d/su-l
Faça necessário que o usuário esteja no grupo wheel, mas não coloque ninguém nele.
#%PAM-1.0 auth sufficient pam_rootok.so # Uncomment the following line to implicitly trust users in the "wheel" group. #auth sufficient pam_wheel.so trust use_uid # Uncomment the following line to require a user to be in the "wheel" group. auth required pam_wheel.so use_uid auth required pam_unix.so account required pam_unix.so session required pam_unix.so
Limite o login pelo SSH para o grupo 'ssh'. Somente "joe" vai ser parte desse grupo.
groupadd -r ssh gpasswd -a joe ssh echo 'AllowGroups ssh' >> /etc/ssh/sshd_config
Reinicie sshd.service
.
Adicione usuários para outros grupos.
for g in power network ;do ;gpasswd -a joe $g ;done for g in network power storage ;do ;gpasswd -a admin $g ;done
Defina permissões nos arquivos de configuração para que devel possa editá-los.
chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}
Cmnd_Alias POWER = /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/reboot Cmnd_Alias STORAGE = /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umount Cmnd_Alias SYSTEMD = /usr/bin/journalctl, /usr/bin/systemctl Cmnd_Alias KILL = /usr/bin/kill, /usr/bin/killall Cmnd_Alias PKGMAN = /usr/bin/pacman Cmnd_Alias NETWORK = /usr/bin/netctl Cmnd_Alias FIREWALL = /usr/bin/iptables, /usr/bin/ip6tables Cmnd_Alias SHELL = /usr/bin/zsh, /usr/bin/bash %power ALL = (root) NOPASSWD: POWER %network ALL = (root) NETWORK %storage ALL = (root) STORAGE root ALL = (ALL) ALL admin ALL = (root) SYSTEMD, KILL, FIREWALL devel ALL = (root) PKGMAN joe ALL = (devel) SHELL, (admin) SHELL
Com esta configuração, você quase nunca vai precisar logar como o usuário root.
"joe" pode se conectar ao WiFi de sua casa.
sudo netctl start home sudo poweroff
"joe" não pode usar netctl como qualquer outro usuário.
sudo -u admin -- netctl start home
Quando "joe" precisa usar journalctl ou matar processos ele pode trocar para outro usuário.
sudo -i -u devel sudo -i -u admin
Mas "joe" não pode trocar para o usuário root.
sudo -i -u root
Se "joe" quer iniciar uma sessão do gnu-screen como admin ele pode fazer isto:
sudo -i -u admin admin% chown admin:tty `echo $TTY` admin% screen
Configurar o sudo usando arquivos presentes no /etc/sudoers.d
sudo lê os arquivos contidos no diretório /etc/sudoers.d/
. Isto significa que ao invês de editar /etc/sudoers
, você pode mudar as configurações em arquivos separados e jogá-los nesse diretório. Isto tem duas vantagens:
- Não há necessidade de editar um arquivo
sudoers.pacnew
; - Se existe um problema com uma nova entrada, você pode remover o respectivo arquivo ao invês de editar o
/etc/sudoers
(mas veja o aviso abaixo).
O formato para entradas nestes arquivos é o mesmo do /etc/sudoers
. Para editá-los diretamente, use visudo -f /etc/sudoers.d/algum_arquivo
. Veja a seção "Including other files from within sudoers" do sudoers(5) para detalhes.
Os arquivos no diretório /etc/sudoers.d/
são lidos em ordem lexicográfica, nomes do arquivos contendo .
ou ~
são ignorados. Para evitar problemas de ordenamento, o nome dos arquivos devem começar com dois dígitos, e.x. 01_foo
.
/etc/sudoers.d/
são tão frágeis quanto o próprio /etc/sudoers
: qualquer arquivo com formatação errada vai impedir o funcionamento do sudo
. Então, pelo mesmo motivo, é recomendado fortemente o uso do visudo
Editando arquivos
sudo -e
ou sudoedit
possibilita que você modifique um arquivo como outro usuário enquanto ainda executa o editor de texto com seu usuário.
Isto é especialmente útil para editar arquivos como root sem elevar o privilégios do seu editor de texto, para mais detalhes leia sudo(8) § e.
Note que você pode definir o editor para qualquer programa, por exemplo, pode usar o meld para gerenciar arquivos pacnew:
$ SUDO_EDITOR=meld sudo -e /etc/file{,.pacnew}
Habilitar insultos
Usuários podem habilitar insultos ao adicionar a seguinte linha no arquivo sudoers com visudo
.
Ao entrar com uma senha incorreta, a mensagem Sorry, try again.
(ou Sinto muito, tente novamente.
) será trocada por uma com insultos engraçados.
/etc/sudoers
Defaults insults
Resolução de problemas
Problema do SSH sem TTY
SSH não aloca uma tty por padrão quando executa um comando remotamente. Sem um tty alocado, o sudo não pode impedir a senha de ser exibida. Você pode executar o ssh com a opção -t
para forçá-lo a alocar uma tty.
A opção requiretty
do Defaults
somente permite que o usuário execute sudo se ele tiver uma tty.
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. You have to run "ssh -t hostname sudo <cmd>". # #Defaults requiretty
Umask permissivo
Sudo vai unir o valor umask do usuário com o seu próprio (que por padrão é 0022). Isto evita que o sudo crie arquivos com permissões mais abertas que o umask do usuário permite. Enquanto isto é um padrão válido se nenhum umask customizado é usado, isto pode levar a situações onde um utilitário executado com sudo crie arquivo com permissões diferentes das que seriam criadas se fosse executado diretamente pelo root. Se erros aparecerem devido a isto, sudo fornece uma forma de consertar o umask, até mesmo se o umask desejado é mais permissivo que o especificado do usuário. Adicionar isto (usando visudo
) vai sobrescrever o comportamento padrão do sudo:
Defaults umask = 0022 Defaults umask_override
Isto define o umask do sudo para o padrão do root (0022) e sobrescreve o comportamento padrão, sempre usando o umask indicado não importando como o umask do usuário está definido.