Aplica-se a SUSE Linux Enterprise Desktop 12 SP2

2 sudo

Muitos comandos e utilitários do sistema precisam ser executados como root para modificar arquivos e/ou executar tarefas que apenas o superusuário tem permissão de fazer. Por motivos de segurança e para evitar a execução acidental de comandos perigosos, não é aconselhável, de modo geral, efetuar login diretamente como root. Em vez disso, é recomendável trabalhar como usuário normal, sem privilégio, e usar o comando sudo para executar comandos com privilégios elevados.

No SUSE Linux Enterprise Desktop, por padrão, o comando sudo é configurado para funcionar como o su. No entanto, o sudo oferece a possibilidade de permitir que os usuários executem comandos com privilégios de qualquer outro usuário de uma forma altamente configurável. Isso pode ser usado para atribuir funções com privilégios específicos a determinados usuários e grupos. Por exemplo, é possível permitir que os membros do grupo usuários executem um comando com os privilégios de wilber. É possível restringir ainda mais o acesso ao comando, por exemplo, proibindo a especificação de qualquer opção do comando. Enquanto o su sempre requer senha de root para autenticação com PAM, o sudo pode ser configurado para autenticar com suas próprias credenciais. Isso reforça a segurança porque não há necessidade de compartilhar a senha de root. Por exemplo, você pode permitir que os membros do grupo usuários executem um comando frobnicate como wilber, com a restrição de que nenhum argumento seja especificado. Isso pode ser usado para atribuir funções com habilidades específicas a determinados usuários e grupos.

2.1 Uso básico do sudo

O sudo é simples de usar, porém, muito poderoso.

2.1.1 Executando um único comando

Conectado como usuário normal, você pode executar qualquer comando como root anexando o sudo ao comando. A senha de root será solicitada e, se autenticada com êxito, execute o comando como root:

tux > id -un1
tux
tux > sudo id -un
root's password:2
root
tux > id -un
tux3
tux > sudo id -un
4
root

1

O comando id -un imprime o nome de login do usuário atual.

2

A senha não aparece ao ser inserida, nem como texto sem criptografia nem como marcadores.

3

Somente os comandos que começam com sudo são executados com privilégios elevados. Se você executar o mesmo comando sem o prefixo sudo, ele será executado com os privilégios do usuário atual novamente.

4

Durante um tempo limitado, você não precisa inserir a senha de root novamente.

Dica
Dica: Redirecionamento de E/S

O redirecionamento de E/S não funciona conforme você deve esperar:

tux >  sudo echo s > /proc/sysrq-trigger
bash: /proc/sysrq-trigger: Permission denied
tux >  sudo cat < /proc/1/maps
bash: /proc/1/maps: Permission denied

Apenas o binário echo/cat é executado com privilégios elevados, enquanto o redirecionamento é executado pelo shell do usuário com os privilégios do usuário. Você pode iniciar um shell como na Seção 2.1.2, “Iniciando um shell” ou usar o utilitário dd:

echo s | sudo dd of=/proc/sysrq-trigger
sudo dd if=/proc/1/maps | cat

2.1.2 Iniciando um shell

Anexar o sudo a cada comando pode ser trabalhoso. Embora seja possível especificar um shell como um comando sudo bash, é recomendável usar um dos mecanismos incorporados para iniciar um shell:

sudo -s (<comando>)

Inicia um shell especificado pela variável de ambiente SHELL ou o shell padrão do usuário de destino. Se um comando for especificado, ele será passado para o shell (com a opção -c), do contrário, o shell será executado no modo interativo.

tux:~ > sudo -i
root's password:
root:/home/tux # exit
tux:~ > 
sudo -i (<comando>)

Igual ao -s, mas inicia o shell como login. Isso significa que os arquivos de inicialização do shell (.profile, etc.) são processados e o diretório de trabalho atual é definido como o diretório pessoal do usuário de destino.

tux:~ > sudo -i
root's password:
root:~ # exit
tux:~ > 

2.1.3 Variáveis de ambiente

Por padrão, o sudo não propaga as variáveis de ambiente:

tux > ENVVAR=test env | grep ENVVAR
ENVVAR=test
tux > ENVVAR=test sudo env | grep ENVVAR
root's password:
1
tux > 

1

A saída vazia mostra que a variável de ambiente ENVVAR não existia no contexto do comando executado com o sudo.

É possível mudar esse comportamento com a opção env_reset. Consulte a Tabela 2.1, “Opções e flags úteis”.

2.2 Configurando o sudo

O sudo é uma ferramenta muito flexível com uma configuração extensa.

Nota
Nota: Comando sudo bloqueado

Se você bloqueou o comando sudo por engano, pode usar su - e a senha de root para obter um shell de root e executar visudo para corrigir o erro.

2.2.1 Editando os arquivos de configuração

O arquivo de configuração de política principal do sudo é /etc/sudoers. Já que é possível se bloquear fora do sistema em caso de erros no arquivo, é altamente recomendável usar visudo para edição. Ele impede mudanças simultâneas no arquivo aberto e verifica se há erros de sintaxe antes de gravar.

Apesar do nome, você também pode usar editores diferentes do vi definindo a variável de ambiente EDITOR, por exemplo:

sudo EDITOR=/usr/bin/nano visudo

No entanto, o próprio arquivo /etc/sudoers é fornecido por pacotes do sistema, e as modificações podem falhar durante atualizações. Portanto, é recomendável inserir a configuração personalizada nos arquivos no diretório /etc/sudoers.d/. Qualquer arquivo nesse diretório é incluído automaticamente. Para criar ou editar um arquivo nesse subdiretório, execute:

sudo visudo -f /etc/sudoers.d/NAME

Se preferir, use um editor diferente (por exemplo, nano):

sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
Nota
Nota: Arquivos ignorados em /etc/sudoers.d

O comando #includedir em /etc/sudoers, usado para /etc/sudoers.d, ignora os arquivos que terminam em ~ (til) ou que contêm . (ponto).

Para obter mais informações sobre o comando visudo, execute man 8 visudo.

2.2.2 Sintaxe de configuração básica de sudoers

Nos arquivos de configuração sudoers, há dois tipos de opções: strings e flags. Enquanto as strings podem conter qualquer valor, os flags podem ser ON ou OFF. As construções de sintaxe mais importantes dos arquivos de configuração sudoers são:

# Everything on a line after a # gets ignored 1
Defaults !insults # Disable the insults flag 2
Defaults env_keep += "DISPLAY HOME" # Add DISPLAY and HOME to env_keep
tux ALL = NOPASSWD: /usr/bin/frobnicate, PASSWD: /usr/bin/journalctl 3

1

Há duas exceções: #include e #includedir são comandos normais. Seguidos por dígitos, eles especificam um UID.

2

Remova ! para definir o flag especificado como ON.

3

Consulte a Seção 2.2.3, “Regras em sudoers”.

Tabela 2.1 Opções e flags úteis

Nome da opção

Descrição

Exemplo

targetpw

Esse flag controla se o usuário que faz a chamada deve digitar a senha do usuário de destino (ON) (por exemplo root) ou do usuário que faz a chamada (OFF).

Defaults targetpw # Turn targetpw flag ON
rootpw

Se definido, o sudo solicitará a senha de root em vez da senha do usuário de destino ou do chamador. O padrão é OFF.

Defaults !rootpw # Turn rootpw flag OFF
env_reset

Se definido, o sudo construirá um ambiente mínimo apenas com TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, USERNAME e SUDO_* definidos. Além disso, as variáveis listadas em env_keep são importadas do ambiente de chamada. O padrão é ON.

Defaults env_reset # Turn env_reset flag ON
env_keep

Lista de variáveis de ambiente para manter quando o flag env_reset é ON.

# Set env_keep to contain EDITOR and PROMPT
Defaults env_keep = "EDITOR PROMPT"
Defaults env_keep += "JRE_HOME" # Add JRE_HOME
Defaults env_keep -= "JRE_HOME" # Remove JRE_HOME
env_delete

Lista de variáveis de ambiente para remover quando o flag env_reset é OFF.

# Set env_delete to contain EDITOR and PROMPT
Defaults env_delete = "EDITOR PROMPT"
Defaults env_delete += "JRE_HOME" # Add JRE_HOME
Defaults env_delete -= "JRE_HOME" # Remove JRE_HOME

É possível também usar o token Defaults para criar álias para uma coleção de usuários, hosts e comandos. Além disso, é possível aplicar uma opção apenas a um conjunto específico de usuários.

Para obter informações detalhadas sobre o arquivo de configuração /etc/sudoers, consulte man 5 sudoers.

2.2.3 Regras em sudoers

As regras referentes à configuração sudoers podem ser muito complexas, portanto, esta seção abordará apenas os princípios básicos. Cada regra segue o esquema básico ([] marca as partes opcionais):

#Who      Where         As whom      Tag                What
User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
Sintaxe para as regras de sudoers
User_List

Um ou mais identificadores (separados por ,): Um nome de usuário, um grupo no formato %GROUPNAME ou um ID de usuário no formato #UID. A negação pode ser executada com ! prefixo.

Host_List

Um ou mais identificadores (separados por ,): Um nome (completo) do host ou um endereço IP. A negação pode ser executada com ! prefixo. ALL é a opção comum para Host_List.

NOPASSWD:|PASSWD:

Não será solicitada uma senha para o usuário ao executar comandos correspondentes a CMDSPEC após NOPASSWD:.

O padrão é PASSWD, ela apenas deve ser especificada quando ambas estão na mesma linha:

tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List

Um ou mais especificadores (separados por ,): Um caminho para um executável seguido de argumentos permitidos ou nada.

/usr/bin/foo     # Anything allowed
/usr/bin/foo bar # Only "/usr/bin/foo bar" allowed
/usr/bin/foo ""  # No arguments allowed

É possível usar ALL como User_List, Host_List e Cmnd_List.

Uma regra que permite que o tux execute todos os comandos como root sem digitar uma senha:

tux ALL = NOPASSWD: ALL

Uma regra que permite que o tux execute systemctl restart apache2:

tux ALL = /usr/bin/systemctl restart apache2

Uma regra que permite que o tux execute wall como admin sem argumentos:

tux ALL = (admin) /usr/bin/wall ""
Atenção
Atenção: Construções perigosas

Construções do tipo

ALL ALL = ALL

não devem ser usadas sem Defaults targetpw, do contrário, qualquer pessoa poderá executar comandos como root.

2.3 Casos de uso comuns

Embora a configuração padrão geralmente seja suficiente para instalações e ambientes de área de trabalho simples, as configurações personalizadas podem ser muito úteis.

2.3.1 Usando o sudo sem senha de root

Em casos com restrições especiais (o usuário X apenas pode executar o comando Y como root), isso não é possível. Em outros casos, ainda convém ter algum tipo de separação. Por convenção, os membros do grupo wheel podem executar todos os comandos com sudo como root.

  1. Adicione você mesmo ao grupo wheel.

    Se a sua conta do usuário ainda não é membro do grupo wheel, adicione-a executando sudo usermod -a -G wheel NOMEDEUSUÁRIO e efetuando logout e login novamente. Verifique se a mudança foi bem-sucedida executando groups NOMEDEUSUÁRIO.

  2. Defina como padrão a autenticação com a senha do usuário que faz a chamada.

    Crie o arquivo /etc/sudoers.d/userpw com visudo (consulte a Seção 2.2.1, “Editando os arquivos de configuração”) e adicione:

    Defaults !targetpw
  3. Selecione uma nova regra padrão.

    Se os usuários tiverem que digitar as senhas novamente, remova o comentário da linha específica em /etc/sudoers e comente a regra padrão.

    ## Uncomment to allow members of group wheel to execute any command
    # %wheel ALL=(ALL) ALL
    
    ## Same thing without a password
    # %wheel ALL=(ALL) NOPASSWD: ALL
  4. Torne a regra padrão mais restritiva.

    Comente ou remova a regra allow-everything em /etc/sudoers:

    ALL     ALL=(ALL) ALL   # WARNING! Only use this together with 'Defaults targetpw'!
    Atenção
    Atenção: Regra perigosa em sudoers

    Não se esqueça desta etapa, do contrário, qualquer usuário poderá executar qualquer comando como root!

  5. Teste a configuração.

    Tente executar sudo como membro e não membro de wheel.

    tux:~ > groups
    users wheel
    tux:~ > sudo id -un
    tux's password:
    root
    wilber:~ > groups
    users
    wilber:~ > sudo id -un
    wilber is not in the sudoers file.  This incident will be reported.

2.3.2 Usando o sudo com aplicativos X.Org

Ao iniciar os aplicativos gráficos com o sudo, você encontra o seguinte erro:

tux > sudo xterm
xterm: Xt error: Can't open display: %s
xterm: DISPLAY is not set

O YaST selecionará a interface ncurses em vez da interface gráfica.

Para usar o X.Org em aplicativos iniciados com o sudo, as variáveis de ambiente DISPLAY e XAUTHORITY precisam ser propagadas. Para fazer essa configuração, crie o arquivo /etc/sudoers.d/xorg, (consulte a Seção 2.2.1, “Editando os arquivos de configuração”) e adicione a seguinte linha:

Defaults env_keep += "DISPLAY XAUTHORITY"

Se ainda não foi definida, defina a variável XAUTHORITY da seguinte maneira:

export XAUTHORITY=~/.Xauthority

Agora é possível executar os aplicativos X.Org como de costume:

sudo yast2

2.4 Mais informações

Uma rápida visão geral sobre os switches de linha de comando disponíveis pode ser recuperada por sudo --help. Uma explicação e outras informações importantes estão disponíveis na página de manual: man 8 sudo, enquanto a configuração está documentada em man 5 sudoers.

Imprimir esta página