Sudo (Português)

Sudo permite a um administrador de sistemas delegar autoridade para dar a certos utilizadores – ou grupos de utilizadores – a capacidade de executar comandos como root ou outro utilizador enquanto fornece uma pista de auditoria dos comandos e os seus argumentos.

Sudo é uma alternativa ao su para executar comandos como root. Ao contrário do su, que lança uma shell de raiz que permite o acesso root a todos os comandos adicionais, o sudo, em vez disso, concede uma escalada temporária de privilégios a um único comando. Ao permitir privilégios de root apenas quando necessário, o uso do sudo reduz a probabilidade de que um erro de digitação ou um bug num comando invocado arruine o sistema.

Sudo também pode ser usado para executar comandos como outros utilizadores; adicionalmente, o sudo regista todos os comandos e tentativas de acesso falhadas para auditoria de segurança.

Instalação

Instalar o pacote sudo.

Utilização

Para começar a utilizar sudo como um utilizador não privilegiado, deve ser configurado correctamente. Ver #Configuração.

Para usar sudo, basta prefixar um comando e os seus argumentos com sudo e um espaço:

$ sudo cmd

Por exemplo, para usar pacman:

$ sudo pacman -Syu

Ver sudo(8) para mais informações.

Configuração

Tango-view-fullscreen.pngEste artigo ou secção precisa de expansão.

Motivo: Criar uma introdução discutindo Defaults, talvez com uma tabela que lista as definições comuns (Discuss in Talk:Sudo#)

Esqueleto de defaults

sudoers(5) § SUDOERS OPTIONS lista todas as opções que podem ser usadas com o comando Defaults no ficheiro /etc/sudoers.

Ver para uma lista de opções (parsed a partir da versão 1.8.7 código fonte) num formato optimizado para sudoers.

Ver sudoers(5) para mais informações, tais como configurar o timeout da senha.

Ver definições actuais

Executar sudo -ll para imprimir a configuração actual do sudo, ou sudo -lU user para um utilizador específico.

Usar visudo

O ficheiro de configuração para sudo é /etc/sudoers. Deve ser sempre editado com o comando visudo(8). visudo bloqueia o ficheiro sudoers, guarda as edições num ficheiro temporário, e verifica-o quanto a erros de sintaxe antes de o copiar para /etc/sudoers.

Aviso:

  • É imperativo que sudoers esteja livre de erros de sintaxe! Qualquer erro torna o sudo inutilizável. Sempre editá-lo com visudo para prevenir erros.
  • visudo(8) avisa que configurar o visudo para honrar as variáveis de ambiente do utilizador para o seu editor de eleição pode ser uma falha de segurança, uma vez que permite ao utilizador com privilégios de visudo executar comandos arbitrários como raiz sem se registar simplesmente definindo essa variável para outra coisa.

O editor predefinido para visudo é o vi. O pacote sudo é compilado com --with-env-editor e honra o uso das variáveis SUDO_EDITORVISUAL e EDITOREDITOR não é utilizado quando VISUAL está definido.

Para estabelecer nano como o editor visudo para a duração da actual sessão shell, exportar EDITOR=nano; para usar um editor diferente apenas uma vez basta definir a variável antes de chamar visudo:

# EDITOR=nano visudo

Alternativamente pode editar uma cópia do ficheiro /etc/sudoers e verificá-lo usando visudo -c -f /copy/of/sudoers. Isto pode ser útil no caso de querer contornar o bloqueio do ficheiro com visudo.

Para alterar o editor permanentemente, ver Variáveis de Ambiente#Por utilizador. Para mudar o editor de escolha permanente apenas para visudo, adicionar o seguinte a /etc/sudoers (assumindo que nano é o seu editor preferido):

# Reset environment by defaultDefaults env_reset# Set default EDITOR to nano, and do not allow visudo to use EDITOR/VISUAL.Defaults editor=/usr/bin/nano, !env_editor

Entradas de exemplo

Para permitir a um utilizador ganhar privilégios totais de raiz quando precede um comando com sudo, adicione a seguinte linha:

USER_NAME ALL=(ALL) ALL

Permitir que um utilizador execute todos os comandos como qualquer utilizador mas apenas na máquina com o nome da máquina HOST_NAME:

USER_NAME HOST_NAME=(ALL) ALL

Permitir aos membros do grupo wheel sudo access:

%wheel ALL=(ALL) ALL
Dica: Ao criar novos administradores, é muitas vezes desejável permitir o acesso sudo para o grupo wheel e adicionar o utilizador ao mesmo, uma vez que por defeito o Polkit trata os membros do grupo wheel como administradores. Se o utilizador não for membro do grupo wheel, o software que utiliza o Polkit pode pedir para autenticar utilizando a palavra-passe de raiz em vez da palavra-passe do utilizador.

Para desactivar pedir uma palavra-passe para o utilizador USER_NAME:

Aviso: Isto permitirá que qualquer processo em execução com o seu nome de utilizador utilize o sudo sem pedir permissão.
Defaults:USER_NAME !authenticate

Activar comandos explicitamente definidos apenas para o utilizador USER_NAME no anfitrião HOST_NAME:

USER_NAME HOST_NAME=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu
Nota: A opção mais personalizada deve ir no fim do ficheiro, uma vez que as linhas posteriores substituem as anteriores. Em particular, tal linha deve ser depois da linha %wheel se o seu utilizador estiver neste grupo.

Activar comandos explicitamente definidos apenas para o utilizador USER_NAME no anfitrião HOST_NAME sem palavra-passe:

USER_NAME HOST_NAME= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

um exemplo detalhado sudoers está disponível em /usr/share/doc/sudo/examples/sudoers. Caso contrário, ver os sudoers(5) para informação detalhada.

Permissões de ficheiro por defeito dos sudoers

O dono e grupo para o ficheiro sudoers tem de ser ambos 0. As permissões de ficheiro têm de ser definidas para 0440. Estas permissões são definidas por defeito, mas se as alterar acidentalmente, devem ser alteradas imediatamente ou o sudo falhará.

# chown -c root:root /etc/sudoers# chmod -c 0440 /etc/sudoers

Dicas e truques

Senha desactivada, tempo limite imediato

Um incómodo comum é um processo de longa duração que corre num terminal de fundo em algum lugar que corre com permissões normais e só se eleva quando necessário. Isto leva a um sudo password prompt, que passa despercebido e se desfaz por vezes, altura em que o processo morre e o trabalho feito é perdido ou, na melhor das hipóteses, colocado em cache. O conselho comum é permitir o sudo sem palavra-passe, ou prolongar o tempo de espera do sudo a lembrar uma palavra-passe. Ambos têm implicações de segurança negativas. O timeout imediato também pode ser desactivado e, uma vez que isso não serve qualquer objectivo razoável de segurança, deve ser a solução aqui:

Defaults passwd_timeout=0

Adicionar sino do terminal ao prompt da palavra-passe

Para chamar a atenção para um prompt do sudo num terminal de fundo, os utilizadores podem simplesmente fazê-lo ecoar um carácter de sino:

Defaults passprompt="^G password for %p: "

Nota o ^G é um caracter literal da campainha. Por exemplo, em vim, inserir usando a sequência Ctrl+vCtrl+g, ou em nano, Alt+vCtrl+g.

Passar pseudónimos

Se usar muitos pseudónimos, poderá ter notado que eles não transitam para a conta de raiz quando se usa sudo. No entanto, há uma forma fácil de os fazer funcionar. Basta adicionar o seguinte ao seu ~/.bashrc ou /etc/bash.bashrc:

alias sudo='sudo '

Disable per-terminal sudo

Aviso: Isto permitirá que qualquer processo utilize a sua sessão de sudo.

Se estiver aborrecido com os padrões de sudo que exigem que introduza a sua palavra-passe sempre que abrir um novo terminal, defina timestamp_type para global:

Defaults timestamp_type=global

Reduzir o número de vezes que tem de digitar uma palavra-passe

Se estiver aborrecido por ter de reintroduzir a sua palavra-passe de 5 em 5 minutos (por defeito), pode alterá-la definindo um valor mais longo para timestamp_timeout (em minutos):

Defaults timestamp_timeout=10

Se estiver a utilizar muitos comandos sudo seguidos, é mais lógico actualizar o tempo limite cada vez que utilizar o aumento de sudo timestamp_timeout. A actualização do tempo limite pode ser feita com sudo -v (enquanto sudo -K revoga imediatamente).

Pode querer automatizar isto adicionando o seguinte ao seu .bashrc:

alias sudo='sudo -v; sudo '

Também é possível utilizar uma função bash; para mais detalhes ver stackexchange.

Variáveis de ambiente

Se tiver muitas variáveis de ambiente, ou exportar as suas definições de proxy via export http_proxy="...", ao usar sudo estas variáveis não são passadas para a conta raiz, a menos que execute sudo com a opção -E.

$ sudo -E pacman -Syu

A forma recomendada de preservar as variáveis ambientais é anexá-las a env_keep:

/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

Root password

Os utilizadores podem configurar sudo para pedir a palavra-passe raiz em vez da palavra-passe do utilizador adicionando targetpw (utilizador alvo, defaults to root) ou rootpw à linha Defaults in /etc/sudoers:

Defaults targetpw

Para prevenir a exposição da sua palavra-passe de raiz aos utilizadores, pode restringir isto a um grupo específico:

Defaults:%wheel targetpw%wheel ALL=(ALL) ALL

Inicio de sessão desactivado da raiz

Os utilizadores podem desejar desactivar o início de sessão da raiz. Sem root, os atacantes devem primeiro adivinhar um nome de utilizador configurado como um sudoer, bem como a palavra-passe do utilizador. Ver, por exemplo, OpenSSH#Deny.

Aviso:

  • Tenha cuidado, pode bloquear-se a si próprio desactivando o login de root. O Sudo não é instalado automaticamente e a sua configuração por defeito não permite acesso root sem palavra-passe nem acesso root com a sua própria palavra-passe. Certifique-se de que um utilizador está devidamente configurado como um sudoer antes de desactivar a conta root!
  • se tiver alterado o seu ficheiro sudoer para utilizar o rootpw como padrão, então não desactivar o login root com qualquer um dos seguintes comandos!
  • se já estiver bloqueado, consulte Recuperação de palavra-passe para ajuda.

A conta pode ser bloqueada via passwd:

# passwd -l root

Um comando semelhante desbloqueia root.

$ sudo passwd -u root

Alternativamente, editar /etc/shadow e substituir a palavra-passe encriptada da raiz por “!”:

root:!:12345::::::

Para permitir o login da raiz novamente:

$ sudo passwd root
Dica: Para chegar a um prompt de root interactivo, mesmo depois de desactivar a conta root, usar sudo -i.

kdesu

kdesu pode ser usado sob KDE para lançar aplicações GUI com privilégios de root. É possível que por defeito o kdesu tente utilizar o su mesmo que a conta raiz esteja desactivada. Felizmente, pode-se dizer ao kdesu para usar sudo em vez de su. Criar/editar o ficheiro ~/.config/kdesurc:

super-user-command=sudo

ou usar o seguinte comando:

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

Alternativamente, instalar kdesudoAUR, que tem a vantagem adicional de tab-completamento para o comando seguinte.

Harden with sudo example

Deixe-nos dizer que cria 3 utilizadores: admin, devel, e joe. O utilizador “admin” é usado para journalctl, systemctl, mount, kill, e iptables; “devel” é usado para instalar pacotes, e editar ficheiros de configuração; e “joe” é o utilizador com o qual se loga. Para deixar “joe” reiniciar, desligar, e usar netctl faríamos o seguinte:

p>Edit/etc/pam.d/sue/etc/pam.d/su-lRequer que o utilizador esteja no grupo wheel, mas não coloque ninguém nele.

#%PAM-1.0auth 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_uidauth required pam_unix.soaccount required pam_unix.sosession required pam_unix.so

Limite o login SSH ao grupo ‘ssh’. Apenas “joe” fará parte deste grupo.

groupadd -r sshgpasswd -a joe sshecho 'AllowGroups ssh' >> /etc/ssh/sshd_config

Restart sshd.service.

Adicionar utilizadores a outros grupos.

for g in power network ;do ;gpasswd -a joe $g ;donefor g in network power storage ;do ;gpasswd -a admin $g ;done

Definir permissões nas configurações para que o devel as possa editar.

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/rebootCmnd_Alias STORAGE = /usr/bin/mount -o nosuid\,nodev\,noexec, /usr/bin/umountCmnd_Alias SYSTEMD = /usr/bin/journalctl, /usr/bin/systemctlCmnd_Alias KILL = /usr/bin/kill, /usr/bin/killallCmnd_Alias PKGMAN = /usr/bin/pacmanCmnd_Alias NETWORK = /usr/bin/netctlCmnd_Alias FIREWALL = /usr/bin/iptables, /usr/bin/ip6tablesCmnd_Alias SHELL = /usr/bin/zsh, /usr/bin/bash%power ALL = (root) NOPASSWD: POWER%network ALL = (root) NETWORK%storage ALL = (root) STORAGEroot ALL = (ALL) ALLadmin ALL = (root) SYSTEMD, KILL, FIREWALLdevel ALL = (root) PKGMANjoe ALL = (devel) SHELL, (admin) SHELL 

Com esta configuração, quase nunca precisará de iniciar sessão como utilizador Root.

“joe” pode ligar-se ao seu WiFi.

sudo netctl start homesudo poweroff

“joe” não pode utilizar netctl como qualquer outro utilizador.

sudo -u admin -- netctl start home

Quando “joe” precisa de usar o processo journalctl ou kill run away pode mudar para esse utilizador.

sudo -i -u develsudo -i -u admin

Mas “joe” não pode mudar para o utilizador raiz.

sudo -i -u root

Se “joe” quiser iniciar uma sessão gnu-screen como administrador pode fazê-lo desta forma:

sudo -i -u adminadmin% chown admin:tty `echo $TTY`admin% screen

Configurar sudo usando ficheiros drop-in em /etc/sudoers.d

sudo parses ficheiros contidos no directório /etc/sudoers.d/. Isto significa que, em vez de editar /etc/sudoers, pode alterar as definições em ficheiros autónomos e deixá-los cair nesse directório. Isto tem duas vantagens:

  • Não há necessidade de editar um ficheiro sudoers.pacnew;
  • Se houver um problema com uma nova entrada, pode remover o ficheiro ofensivo em vez de editar /etc/sudoers (mas veja o aviso abaixo).

O formato das entradas nestes ficheiros drop-in é o mesmo que para /etc/sudoers em si. Para os editar directamente, utilizar visudo -f /etc/sudoers.d/somefile. Ver sudoers(5) § Incluindo outros ficheiros de dentro de sudoers para detalhes.

Os ficheiros em /etc/sudoers.d/ directório são analisados por ordem lexicográfica, os nomes dos ficheiros contendo . ou ~ são ignorados. Para evitar problemas de ordenação, os nomes dos ficheiros devem começar com dois dígitos, por exemplo 01_foo.

Nota: A ordem das entradas nos ficheiros drop-in é importante: certifique-se de que as declarações não se sobrepõem.
Aviso: Os ficheiros em /etc/sudoers.d/ são tão frágeis como /etc/sudoers em si mesmos: qualquer ficheiro formatado incorrectamente impedirá sudo de funcionar. Assim, pela mesma razão é fortemente aconselhado usar visudo

Editar ficheiros

sudo -e ou sudoedit permite-lhe editar um ficheiro como outro utilizador enquanto ainda executa o editor de texto como seu utilizador.

Isto é especialmente útil para editar ficheiros como raiz sem elevar o privilégio do seu editor de texto, para mais detalhes leia sudo(8) § e.

Nota que pode definir o editor para qualquer programa, assim, por exemplo, pode-se usar meld para gerir ficheiros pacnew:

$ SUDO_EDITOR=meld sudo -e /etc/file{,.pacnew}

Insultos permitidos

Os utilizadores podem permitir insultos easter egg em sudo, adicionando a seguinte linha no ficheiro sudoers com visudo.

Upon introduzindo uma palavra-passe incorrecta isto irá substituir Sorry, try again. mensagem com insultos humorísticos.

/etc/sudoers
Insultos de falhas

Solução de problemas

Problemas deSSH sem TTY

Merge-arrows-2.png Este artigo ou secção é um candidato à fusão com #Configuration.Merge-arrows-2.png

Notas: por favor use o segundo argumento do modelo para fornecer indicações mais detalhadas. (Discuss in Talk:Sudo#)

SSH não atribui um tty por defeito quando se executa um comando remoto. Sem um tty atribuído, o sudo não pode impedir que a palavra-passe seja exibida. Pode usar a opção ssh’s -t para forçar a atribuição de um tty.

O Defaults opção requiretty só permite ao utilizador executar o sudo se este tiver um 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

Pesquisa permissiva

Merge-arrows-2.png Este artigo ou secção é um candidato à fusão com #Configuration.Merge-arrows-2.png

Notas: por favor use o segundo argumento do modelo para fornecer indicações mais detalhadas. (Discuss in Talk:Sudo#)

Sudo irá unir o valor da máscara do utilizador com a sua própria máscara (que por defeito é 0022). Isto impede que o sudo crie ficheiros com mais permissões abertas do que a máscara do utilizador permite. Embora isto seja um padrão razoável se não estiver a ser utilizada uma máscara personalizada, isto pode levar a situações em que um utilitário executado pelo sudo pode criar ficheiros com permissões diferentes das que se executado directamente pela raiz. Se daí resultarem erros, o sudo fornece um meio de corrigir a máscara, mesmo que a máscara desejada seja mais permissiva do que a máscara que o utilizador especificou. Adicionar isto (usando visudo) anulará o comportamento por defeito do sudo:

Defaults umask = 0022Defaults umask_override

Isto define o umask do sudo para o umask por defeito da raiz (0022) e anula o comportamento por defeito, usando sempre o umask indicado independentemente do umask que o utilizador tenha definido.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *