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.

Status de tradução: Esse artigo é uma tradução de Sudo. Data da última tradução: 2020-06-04. Você pode ajudar a sincronizar a tradução, se houver alterações na versão em inglês.

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

Instale o pacote sudo.

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 para uma lista de opções (parseada da versão 1.8.7 do código fonte) em um formato otimizado para o .

Veja para mais informações, como configurar o tempo antes de pedir novamente a senha.

Ver as configurações atuais

Execute para mostrar a configuração atual do sudo, ou 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 , 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.

O editor padrão do visudo é o . O sudo do repositório core é compilado com por padrão e possibilita o uso das váriaveis e . não é usada quando está definida.

Para usar nano como o editor do visudo durante o shell atual execute ; 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 (hostname):

NOME_DO_USUÁRIO   NOME_DA_MÁQUINA=(ALL) ALL

Para permitir que membros do grupo usem o sudo:

%wheel      ALL=(ALL) ALL

Para desabilitar a solicitação de senha para o usuário :

Defaults:NOME_DO_USUÁRIO      !authenticate

Para habilitar explicitamente comandos definidos somente pelo usuário na máquina :

NOME_DO_USUÁRIO NOME_DA_MÁQUINA=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

Para habilitar explicitamente comandos definido somente para o usuário na 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 está disponível em . De outro modo, veja para informações detalhadas.

Permissões padrão do arquivo sudoers

O dono e grupo para o arquivo 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 ou /etc/bash.bashrc:

alias sudo='sudo '

Desabilitar sudo por terminal

Atenção: Isto vai deixar qualquer processo usar sua sessão sudo.

Se você está incomodado pelo padrão do sudo em solicitar a senha toda vez que você abre um novo terminal, defina para :

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 (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 . Essa atualização pode ser feita com (onde revoca imediatamente).

Você pode querer automatizar isto ao adicionar o seguinte para seu :

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 , 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 .

$ sudo -E pacman -Syu

A maneira recomendada de preservar as variáveis de ambiente é adicioná-las ao env_keep:

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 (usuário alvo, o padrão é o root) ou 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.

A conta pode ser bloqueada com passwd:

# passwd -l root

Um comando similar desbloqueia o root.

$ sudo passwd -u root

Alternativamente, edite e troque a senha criptografada do root com "!":

root:!:12345::::::

Para habilitar o login do root novamente:

$ sudo passwd root

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 :

[super-user-command]
super-user-command=sudo

ou use o seguinte comando:

$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo

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 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 .

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 . 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 ;
  • 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 . Veja a seção "Including other files from within sudoers" do para detalhes.

Os arquivos no diretório 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. .

Editando arquivos

sudo -e ou 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 .

Note que você pode definir o editor para qualquer programa, por exemplo, pode usar o 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 (ou ) será trocada por uma com insultos engraçados.

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 para forçá-lo a alocar uma tty.

A opção 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.

gollark: Right. Fair point. I'm sure there's some networking stuff around for networking over a channel where you can't run two things at once.
gollark: I also had the weird idea of networking between adjacent devices by setting labels really fast, but that probably could get by with just some sensible error checking.
gollark: Also, I have this thing for networking (at amazing 20Bps speed) over bundled cables. Perhaps that would be a sensible place to apply Ethernet stuff? It's currently only safe to use between two devices at once (lest others interfere horribly) and has no error correcting stuff.
gollark: My chat system runs over 3636, I'll add that tomorrow.
gollark: I suppose you could download more random from the internet.
This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.