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
Este artigo ou secção precisa de expansão.
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
.
- É 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_EDITOR
VISUAL
e EDITOR
EDITOR
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
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
:
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
%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+v
Ctrl+g
, ou em nano, Alt+v
Ctrl+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
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.
- 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
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/su
e/etc/pam.d/su-l
Requer 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
.
/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
Este artigo ou secção é um candidato à fusão com #Configuration.
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
Este artigo ou secção é um candidato à fusão com #Configuration.
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.