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 é recomendado 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 -un1 tux>sudoid -unroot's password:2 root>id -untux3>sudoid -un4 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:
>sudoecho s > /proc/sysrq-trigger bash: /proc/sysrq-trigger: Permission denied>sudocat < /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
SHELLou 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 (.profileetc.) 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.
As regras de exemplo descritas abaixo são estritamente para fins de demonstração. Use-as para entender a sintaxe geral dos arquivos de configuração do sudo. Não as utilize em configurações reais, pois elas não refletem a complexidade desses ambientes.
2.2.1 Melhores práticas de configuração do sudo #
Antes de começar, veja a seguir algumas regras básicas para manter as configurações do sudo:
- Sempre usar o
visudopara editar arquivos de configuração dosudo As alterações na configuração do
sudodevem ser feitas usando o comandovisudo. Ovisudoé uma ferramenta personalizada que permite editar os arquivos de configuração dosudoe executa verificações de sintaxe básicas, garantindo que a configuração permaneça intacta e funcional. Uma configuração dosudoinválida pode fazer com que o usuário seja bloqueado do próprio sistema.- Sempre criar configurações personalizadas em
/etc/sudoers.d/ As configurações personalizadas devem residir em
/etc/sudoers.d/para serem extraídas pelosudo. As definições nos arquivos de configuração personalizada têm prioridade sobre aquelas na configuração padrão em/etc/sudoers.- Sempre prestar atenção à ordem de leitura das configurações
Para garantir que as configurações personalizadas sejam lidas na ordem correta, use números como prefixo. Inclua zeros à esquerda para estabelecer a ordem de leitura dos arquivos. Por exemplo,
01_myfirstconfigé analisado antes de10_myotherconfig. Se uma diretiva tiver sido definida em um arquivo que foi lido antes de outro arquivo que contém informações conflitantes, a diretiva que foi lida por último será aplicada.- Sempre usar nomes de arquivo descritivos
Use nomes de arquivo que indiquem o que o arquivo de configuração faz. Isso ajuda você a reconhecer a ação planejada da configuração do
sudo.
2.2.2 Criar um arquivo de configuração específico do usuário #
Crie um arquivo de configuração do sudo que permita a um usuário comum (tux) usar o comando useradd com sua própria senha, em vez da senha de root.
Como administrador do sistema (
root), crie um arquivo de configuração personalizado que inclua as novas diretivas específicas do usuário iniciando ovisudo. Use a numeração e um nome descritivo:#visudo -f /etc/sudoers.d/02_usermanagementCrie uma regra que permita ao
tuxexecutar o binário/usr/sbin/useraddem todo o ambiente ao qual esta configuração dosudoserá aplicada:tux1 ALL2 = /usr/sbin/useradd3
Especifique o usuário ou grupo. Liste os usuários por nome ou
#UIDe os grupos por%GROUPNAME. Separe vários itens com vírgulas. Para negar entradas, use!.Especifique um ou vários hosts (separados por vírgulas). Use nomes de host (completos e qualificados) ou endereços IP. Adicione
ALLpara impor essa configuração globalmente a todos os hosts. Use!para negações.Especifique um ou vários executáveis (separados por vírgulas). Ao especificá-los, lembre-se das seguintes regras:
/usr/sbin/useraddSem nenhuma opção adicional inserida, isso permite a execução de todos os comandos
useraddpossíveis./usr/sbin/useradd -cSe você especificar claramente uma opção, ela será a única permitida. Nada mais estará disponível para o usuário indicado acima.
/usr/sbin/useradd ""Esse procedimento apenas permitirá que o usuário invoque um simples
useraddsem nenhuma opção.
No exemplo acima, você talvez queira permitir todas as opções e os subcomandos ou limitá-los a alguns por motivos de segurança, mas proibir um usuário de especificar qualquer opção não faz sentido nesse contexto.
Para permitir que o usuário insira a própria senha em vez da senha de
root, adicione a seguinte linha:Defaults:tux !targetpw
Quando ativo, esse flag exige que o usuário insira a senha do usuário de destino, ou seja,
root. Esse flag está habilitado por padrão em qualquer sistema SUSE Linux Enterprise Desktop. Para negá-lo, use!para exigir que o usuário insira apenas a própria senha em vez da senha deroot.Grave a configuração, saia do editor e abra um segundo shell para testar se o
sudoestá seguindo sua nova configuração.
2.2.3 Criar configurações personalizadas agrupando itens #
Modifique a configuração do Exemplo 2.1, “Criar um arquivo de configuração específico do usuário” para que um grupo de usuários nomeados possa executar o comando useradd sem a necessidade da senha de root. Além disso, adicione usermod e userdel à lista de comandos disponíveis para esse grupo.
Para modificar a configuração de exemplo, abra-a como administrador do sistema com o
visudo:#visudo /etc/sudoers.d/02_usermanagementAdicione outros usuários à regra em uma lista separada por vírgulas:
tux, wilber ALL = /usr/sbin/useradd
Para permitir que os usuários relacionados executem uma lista de comandos, especifique os comandos como uma lista separada por vírgulas:
tux, wilber ALL = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
Para permitir que os usuários listados insiram a própria senha em vez da senha de
root, adicione a seguinte linha:Defaults:tux, wilber !targetpw
Quando ativo, esse flag exige que os usuários listados insiram a senha do usuário de destino, ou seja,
root. Esse flag está habilitado por padrão em qualquer sistema SUSE Linux Enterprise Desktop. Para negá-lo, use!para exigir que os usuários listados insiram apenas a própria senha em vez da senha deroot.Grave a configuração, saia do editor e abra um segundo shell para testar se o
sudoestá seguindo sua nova configuração.
2.2.4 Simplificar as configurações aplicando álias #
Use álias para simplificar ainda mais a configuração personalizada do Exemplo 2.2, “Criar configurações personalizadas agrupando itens”. O agrupamento de itens ajuda até certo ponto, mas o uso de álias globais para usuários, comandos e hosts é a maneira mais eficiente de manter a configuração do sudo clara e simples.
O uso de álias e grupos em vez de listas é uma maneira muito melhor de administrar as mudanças na configuração. Se um usuário sair, basta removê-lo da declaração global User_Alias no arquivo de declaração do álias, em vez de vasculhar todos os arquivos de configuração personalizados separados. O mesmo procedimento se aplica a qualquer outro tipo de álias (Host_Alias, Cmnd_Alias e Runas_Alias).
Crie um novo arquivo para armazenar suas definições de álias globais:
#visudo /etc/sudoers.d/01_aliasesAdicione a seguinte linha para criar o álias
TEAMLEADERS:User_Alias TEAMLEADERS = tux, wilber
Adicione a seguinte linha para criar o álias
USERMANAGEMENT:Cmnd_Alias USERMANAGEMENT = /usr/sbin/useradd, /usr/sbin/usermod, /usr/sbin/userdel
Grave suas mudanças e saia do
visudo.Como administrador do sistema, inicie o
visudopara editar o arquivo de configuração de exemplo:#visudo -f /etc/sudoers.d/02_usermanagementApague e substitua a regra anterior pela seguinte regra que usa os álias que você acabou de definir acima:
TEAMLEADERS ALL = USERMANAGEMENT
Para permitir que todos os usuários definidos por
User_Aliasinsiram a própria senha em vez da senha deroot, adicione a seguinte linha:Defaults:TEAMLEADERS !targetpw
Grave a configuração, saia do editor e abra um segundo shell para testar se o
sudoestá seguindo sua nova configuração.
2.2.5 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 o Seção 2.2.6, “Regras básicas do sudoers”. |
targetpwEsse 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
rootpwSe definido, o
sudosolicitará a senha deroot. O padrão é OFF.Defaults !rootpw # Turn rootpw flag OFF
env_resetSe definido,
sudoconstrói um ambiente mínimo comTERM,PATH,HOME,MAIL,SHELL,LOGNAME,USER,USERNAMEeSUDO_*. Além disso, as variáveis listadas emenv_keepserão importadas do ambiente de chamada. O padrão é ON.Defaults env_reset # Turn env_reset flag ON
env_keepLista 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_deleteLista 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 os arquivos de configuração sudoers, consulte man 5
sudoers.
2.2.6 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_ListUm ou vários identificadores (separados por vírgula): um nome de usuário, um grupo no formato
%GROUPNAMEou um ID de usuário no formato#UID. A negação pode ser especificada com o prefixo!.Host_ListUm 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é uma opção comum paraHost_List.NOPASSWD:|PASSWD:Não é solicitada uma senha para o usuário ao executar comandos correspondentes a
Cmd_ListapósNOPASSWD:.PASSWDé o padrão. Ele precisa ser especificado apenas quando ambosPASSWDeNOPASSWDestão na mesma linha:tux ALL = PASSWD: /usr/bin/foo, NOPASSWD: /usr/bin/bar
Cmnd_ListUm 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 Usando o sudo com aplicativos X.Org #
Normalmente, ocorre o seguinte erro ao iniciar aplicativos gráficos com sudo:
>sudoxterm 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.