2 Conceitos básicos sobre o sudo
#
A execução de determinados comandos exige privilégios de root. No entanto, por questões de segurança e para evitar erros, não é recomendável efetuar login como root
. Uma abordagem mais segura é efetuar login como usuário comum e, em seguida, utilizar o sudo
para executar comandos com privilégios elevados.
No SUSE Linux Enterprise Desktop, o sudo
é configurado para funcionar de modo parecido com o su
. No entanto, o sudo
oferece um mecanismo flexível que permite aos usuários executar comandos com privilégios de qualquer outro usuário. 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 users
executem um comando com os privilégios do usuário wilber
. É possível restringir ainda mais o acesso ao comando quando você não permite nenhuma opção de 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 significa que os usuários não precisam compartilhar a senha de root
, o que reforça a segurança.
2.1 Uso básico do sudo
#
O capítulo a seguir apresenta uma introdução ao uso básico do sudo
.
2.1.1 Executando um único comando #
Como usuário comum, você pode executar qualquer comando como root
inserindo sudo
antes do comando. Isso solicitará que você forneça a senha de root. Se a autenticação for bem-sucedida, o comando será executado como root
:
>
id -un
1 tux>
sudo
id -un
root's password:2 root>
id -un
tux3>
sudo
id -un
4 root
O comando | |
A senha não aparece ao ser digitada, nem como texto sem criptografia nem como caracteres de mascaramento. | |
Apenas os comandos que começam com | |
Os privilégios elevados são mantidos por um determinado período, portanto, você não precisa inserir a senha de |
Ao usar o sudo
, o redirecionamento de E/S não funciona:
>
sudo
echo s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission denied>
sudo
cat < /proc/1/maps bash: /proc/1/maps: Permission denied
No exemplo acima, apenas os comandos echo
e cat
são executados com privilégios elevados. O redirecionamento é realizado pelo shell do usuário com os privilégios do usuário. Para realizar o redirecionamento com privilégios elevados, inicie um shell conforme explicado na Seção 2.1.2, “Iniciando um shell” ou use 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 #
Nem sempre é prático usar o sudo
toda vez para executar um comando com privilégios elevados. Embora você possa usar o comando sudo
bash
, é recomendável usar um dos mecanismos incorporados para iniciar um shell:
sudo -s (<command>)
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 -s root's password:root:/home/tux #
exittux:~ >
sudo -i (<command>)
Semelhante a
-s
, mas inicia o shell como um shell de 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:~ #
exittux:~ >
Por padrão, o sudo
não propaga as variáveis de ambiente. É possível mudar esse comportamento com a opção env_reset
(consulte Opções e flags úteis).
2.2 Configurando sudo
#
O sudo
oferece uma ampla variedade de opções configuráveis.
Se você se bloqueou por engano fora do sudo
, use su
-
e a senha de root
para iniciar um shell de root. Para corrigir o erro, execute visudo
.
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 se o arquivo estiver incorreto, é altamente recomendável usar o visudo
para edição. Ele evita conflitos de edição e verifica se há erros de sintaxe antes de gravar as modificações.
Você pode definir a varável de ambiente EDITOR
para usar outro editor no lugar do vi, por exemplo:
sudo EDITOR=/usr/bin/nano visudo
Lembre-se de que o arquivo /etc/sudoers
está incluído nos pacotes de sistema, e as modificações feitas diretamente no arquivo podem danificar as atualizações. Portanto, é recomendável inserir a configuração personalizada nos arquivos no diretório /etc/sudoers.d/
. Use o seguinte comando para criar ou editar um arquivo:
sudo visudo -f /etc/sudoers.d/NAME
O comando a seguir abre o arquivo usando um editor diferente (neste caso, nano
):
sudo EDITOR=/usr/bin/nano visudo -f /etc/sudoers.d/NAME
/etc/sudoers.d
A diretiva #includedir
em /etc/sudoers
ignora os arquivos que terminam com o caractere ~
(til) ou que contêm o caractere .
(ponto).
Para obter mais informações sobre o comando visudo
, execute man 8 visudo
.
2.2.2 Sintaxe de configuração básica do sudoers #
Os arquivos de configuração sudoers contêm dois tipos de opções: strings e flags. Enquanto as strings podem conter qualquer valor, os flags podem ser ON ou OFF. Veja a seguir as construções de sintaxe mais importantes para os arquivos de configuração sudoers:
# Everything on a line after # is 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
Há duas exceções: | |
Remova o caractere | |
Consulte Seção 2.2.3, “Regras básicas do sudoers”. |
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 deroot
. O padrão é OFF.Defaults !rootpw # Turn rootpw flag OFF
env_reset
Se definido,
sudo
cria um ambiente mínimo comTERM
,PATH
,HOME
,MAIL
,SHELL
,LOGNAME
,USER
,USERNAME
eSUDO_*
. Além disso, as variáveis listadas emenv_keep
serã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 básicas do sudoers #
Cada regra segue o esquema abaixo ([]
marca as partes opcionais):
#Who Where As whom Tag What User_List Host_List = [(User_List)] [NOPASSWD:|PASSWD:] Cmnd_List
User_List
Um ou vários identificadores (separados por vírgula): um nome de usuário, um grupo no formato
%GROUPNAME
ou um ID de usuário no formato#UID
. A negação pode ser especificada com o prefixo!
.Host_List
Um ou vários identificadores (separados por vírgula): um nome (completo) do host ou um endereço IP. A negação pode ser especificada com o prefixo
!
.ALL
é a opção comum paraHost_List
.NOPASSWD:|PASSWD:
Não é solicitada uma senha para o usuário ao executar comandos correspondentes a
Cmd_List
apósNOPASSWD:
.PASSWD
é o padrão. Ele precisa ser especificado apenas quando ambosPASSWD
eNOPASSWD
estão na mesma linha:tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_List
Um ou vários especificadores (separados por vírgula): um caminho para um executável, seguido de um argumento opcional permitido.
/usr/bin/foo # Anything allowed /usr/bin/foo bar # Only "/usr/bin/foo bar" allowed /usr/bin/foo "" # No arguments allowed
ALL
pode ser usado 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 ""
Não use regras como ALL ALL =
ALL
sem Defaults targetpw
. Do contrário, qualquer pessoa pode executar comandos como root
.
Ao especificar o nome do grupo no arquivo sudoers
, use o nome do domínio NetBIOS em vez do domínio Kerberos, por exemplo:
%DOMAIN\\GROUP_NAME ALL = (ALL) ALL
Ao usar o winbindd, lembre-se de que o formato também depende da opção winbind separator
no arquivo smb.conf
. O padrão é \
. Por exemplo, se ele for mudado para +
, o formato da conta no arquivo sudoers
deverá ser DOMAIN+GROUP_NAME
.
2.3 Casos de uso do sudo
#
Embora a configuração padrão funcione em cenários de uso padrão, é possível personalizá-la de forma a atender às suas necessidades específicas.
2.3.1 Usando o sudo
sem senha de root
#
Por concepção, os membros do grupo wheel
podem executar todos os comandos com o sudo
como root. O procedimento a seguir explica como adicionar uma conta do usuário ao grupo wheel
.
Verifique se o grupo
wheel
existe:>
getent group wheel
Se o comando anterior não retornou nenhum resultado, instale o pacote system-group-wheel que cria o grupo
wheel
:>
sudo
zypper install system-group-wheel
Adicione sua conta do usuário ao grupo
wheel
.Se a sua conta do usuário ainda não é membro do grupo
wheel
, adicione-a usando o comandosudo usermod -a -G wheel USERNAME
. Efetue logout e login novamente para habilitar a mudança. Verifique se a mudança foi bem-sucedida executando o comandogroups USERNAME
.Autentique-se com a senha normal da conta do usuário.
Crie o arquivo
/etc/sudoers.d/userpw
usando o comandovisudo
(consulte a Seção 2.2.1, “Editando os arquivos de configuração”) e adicione o seguinte:Defaults !targetpw
Selecione uma nova regra padrão.
Se os usuários tiverem que digitar as senhas novamente, remova o comentário da linha apropriada 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
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: Regra perigosa em sudoersNão ignore esta etapa. Do contrário, qualquer usuário poderá executar qualquer comando como
root
!Teste a configuração.
Execute o
sudo
como membro e não membro do grupowheel
.tux:~ >
groups users wheeltux:~ >
sudo id -un tux's password: rootwilber:~ >
groups userswilber:~ >
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 #
Normalmente, ocorre o seguinte erro ao iniciar aplicativos gráficos com sudo
:
>
sudo
xterm xterm: Xt error: Can't open display: %s xterm: DISPLAY is not set
Uma solução alternativa simples é usar o xhost para permitir temporariamente que o usuário root acesse a sessão X do usuário local. Para fazer isso, execute o seguinte comando:
xhost si:localuser:root
O comando a seguir remove o acesso concedido:
xhost -si:localuser:root
A execução de aplicativos gráficos com privilégios de root tem implicações de segurança. É recomendável habilitar o acesso de root para um aplicativo gráfico apenas como uma exceção. Também é recomendável revogar o acesso de root concedido logo após fechar o aplicativo gráfico.
2.4 Mais informações #
O comando sudo --help
oferece uma breve visão geral das opções de linha de comando disponíveis. O comando man sudoers
fornece informações detalhadas sobre o sudoers
e sua configuração.