Introdução
A separação de privilégios é um dos paradigmas de segurança fundamentais implementados em sistemas operacionais Linux e Unix-like. Os usuários regulares operam com privilégios limitados para reduzir o escopo de sua influência ao seu próprio ambiente e não ao sistema operacional mais amplo.
A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users. Users can execute commands with super-user or root privileges in a number of different ways.
Neste artigo, discutiremos como obter corretamente e com segurança privilégios de root, com um foco especial na edição do arquivo /etc/sudoers
.
Realizaremos essas etapas em um servidor Ubuntu 20.04, mas a maioria das distribuições Linux modernas, como Debian e CentOS, deve operar de maneira semelhante.
Este guia assume que você já concluiu a configuração inicial do servidor discutida aqui. Faça login no seu servidor como um usuário regular, não root, e continue abaixo.sudoers
. Se você apenas deseja adicionar privilégios sudo
a um usuário, confira nossos tutoriais de início rápido sobre
Nota: Este tutorial aborda em profundidade a elevação de privilégios e o arquivo sudoers
. Se você deseja apenas adicionar privilégios sudo
a um usuário, confira nossos tutoriais rápidos Como Criar um Novo Usuário Habilitado para Sudo para Ubuntu e CentOS.
Como Obter Privilégios de Root
Existem três maneiras básicas de obter privilégios root, que variam em nível de sofisticação.
Fazendo Login Como Root
O método mais simples e direto de obter privilégios root é fazer login diretamente em seu servidor como o usuário root.
Se você estiver fazendo login em uma máquina local (ou usando um recurso de console fora da banda em um servidor virtual), digite root
como seu nome de usuário no prompt de login e insira a senha root quando solicitado.
Se você estiver se conectando via SSH, especifique o usuário root antes do endereço IP ou nome de domínio na sua cadeia de conexão SSH:
Se você não configurou chaves SSH para o usuário root, digite a senha root quando solicitado.
Usando su
para se tornar root
Conectar-se diretamente como root geralmente não é recomendado, porque é fácil começar a usar o sistema para tarefas não administrativas, o que é perigoso.
A próxima maneira de obter privilégios de superusuário permite que você se torne o usuário root a qualquer momento, conforme necessário.
Podemos fazer isso invocando o comando su
, que significa “usuário substituto”. Para obter privilégios root, digite:
Você será solicitado a senha do usuário root, após o que, você será redirecionado para uma sessão de shell root.
Quando você terminar as tarefas que exigem privilégios root, retorne à sua shell normal digitando:
Usando sudo
para executar comandos como root
O último método de obtenção de privilégios root que discutiremos é com o comando sudo
.
O comando sudo
permite que você execute comandos únicos com privilégios root, sem a necessidade de criar um novo shell. É executado assim:
Ao contrário do su
, o comando sudo
solicitará a senha do usuário atual, não a senha root.
Devido às implicações de segurança, o acesso ao sudo
não é concedido aos usuários por padrão e deve ser configurado antes de funcionar corretamente. Confira nossos tutoriais rápidos de Como Criar um Novo Usuário Habilitado para Sudo para Ubuntu e CentOS para aprender a configurar um usuário habilitado para sudo
.
Na seção a seguir, discutiremos como modificar a configuração do sudo
com mais detalhes.
O que é Visudo?
O comando sudo
é configurado por meio de um arquivo localizado em /etc/sudoers
.
Aviso: Nunca edite este arquivo com um editor de texto normal! Sempre use o comando visudo
em vez disso!
Porque a sintaxe imprópria no arquivo /etc/sudoers
pode deixar você com um sistema quebrado onde é impossível obter privilégios elevados, é importante usar o comando visudo
para editar o arquivo.
O comando visudo
abre um editor de texto como normalmente, mas valida a sintaxe do arquivo ao salvar. Isso evita erros de configuração que bloqueiam operações sudo
, que podem ser a sua única maneira de obter privilégios root.
Tradicionalmente, visudo
abre o arquivo /etc/sudoers
com o editor de texto vi
. No entanto, o Ubuntu configurou visudo
para usar o editor de texto nano
em vez disso.
Se você gostaria de alterá-lo de volta para vi
, emita o seguinte comando:
OutputThere are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 10 manual mode
Press <enter> to keep the current choice[*], or type selection number:
Selecione o número que corresponde à escolha que deseja fazer.
No CentOS, você pode alterar esse valor adicionando a seguinte linha ao seu ~/.bashrc
:
Faça o source do arquivo para implementar as alterações:
Depois de configurar o visudo
, execute o comando para acessar o arquivo /etc/sudoers
:
Como Modificar o Arquivo Sudoers
Você será apresentado com o arquivo /etc/sudoers
no editor de texto selecionado.
I have copied and pasted the file from Ubuntu 20.04, with comments removed. The CentOS /etc/sudoers
file has many more lines, some of which we will not discuss in this guide.
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d
Vamos dar uma olhada no que essas linhas fazem.
Linhas Padrão
A primeira linha, Defaults env_reset
, reinicia o ambiente do terminal para remover quaisquer variáveis de usuário. Esta é uma medida de segurança usada para limpar variáveis ambientais potencialmente prejudiciais da sessão sudo
.
A segunda linha, Defaults mail_badpass
, informa ao sistema para enviar avisos de tentativas de senha sudo
ruins para o usuário mailto
configurado. Por padrão, este é o root conta.
A terceira linha, que começa com Defaults secure_path=...
, especifica o PATH
(os lugares no sistema de arquivos que o sistema operacional procurará por aplicativos) que será usado para operações sudo
. Isso impede o uso de caminhos de usuário que podem ser prejudiciais.
Linhas de Privilégios do Usuário
A quarta linha, que determina os privilégios sudo
do usuário root, é diferente das linhas anteriores. Vamos dar uma olhada no que os diferentes campos significam:
-
root ALL=(ALL:ALL) ALL
O primeiro campo indica o nome de usuário ao qual a regra se aplicará (root). -
root ALL=(ALL:ALL) ALL
O primeiro “ALL” indica que essa regra se aplica a todos os hosts. -
root ALL=(ALL:ALL) ALL
Este “ALL” indica que o usuário root pode executar comandos como todos os usuários. -
root ALL=(ALL:ALL) ALL
Este “ALL” indica que o usuário root pode executar comandos como todos os grupos. -
root ALL=(ALL:ALL) ALL
O último “ALL” indica que essas regras se aplicam a todos os comandos.
Isso significa que nosso usuário root pode executar qualquer comando usando sudo
, desde que forneça sua senha.
Linhas de Privilégio de Grupo
As duas linhas seguintes são semelhantes às linhas de privilégio do usuário, mas especificam regras de sudo
para grupos.
Nomes que começam com um %
indicam nomes de grupos.
Aqui, vemos que o grupo admin pode executar qualquer comando como qualquer usuário em qualquer host. Da mesma forma, o grupo sudo tem os mesmos privilégios, mas também pode executar como qualquer grupo.
Linha incluída em /etc/sudoers.d
A última linha pode parecer um comentário à primeira vista:
. . .
#includedir /etc/sudoers.d
Ela realmente começa com um #
, que geralmente indica um comentário. No entanto, essa linha indica que os arquivos dentro do diretório /etc/sudoers.d
serão importados e aplicados também.
Os arquivos dentro desse diretório seguem as mesmas regras que o arquivo /etc/sudoers
em si. Qualquer arquivo que não termine em ~
e que não tenha um .
nele será lido e adicionado à configuração de sudo
.
Isso é principalmente destinado a aplicativos que alteram os privilégios do sudo
após a instalação. Colocar todas as regras associadas em um único arquivo no diretório /etc/sudoers.d
pode facilitar a visualização de quais privilégios estão associados a quais contas e a reversão de credenciais facilmente, sem ter que tentar manipular o arquivo /etc/sudoers
diretamente.
Como com o próprio arquivo /etc/sudoers
, você deve sempre editar arquivos dentro do diretório /etc/sudoers.d
com visudo
. A sintaxe para editar esses arquivos seria:
Como dar a um usuário privilégios sudo
A operação mais comum que os usuários desejam realizar ao gerenciar permissões do sudo
é conceder a um novo usuário acesso geral ao sudo
. Isso é útil se você deseja dar a uma conta acesso administrativo total ao sistema.
A maneira mais fácil de fazer isso em um sistema configurado com um grupo de administração de uso geral, como o sistema Ubuntu neste guia, é realmente adicionar o usuário em questão a esse grupo.
Por exemplo, no Ubuntu 20.04, o grupo sudo
tem privilégios de administração total. Podemos conceder ao usuário esses mesmos privilégios adicionando-o ao grupo assim:
O comando gpasswd
também pode ser usado:
Ambos farão a mesma coisa.
No CentOS, geralmente é o grupo wheel
em vez do grupo sudo
:
Ou, usando gpasswd
:
No CentOS, se adicionar o usuário ao grupo não funcionar imediatamente, talvez seja necessário editar o arquivo /etc/sudoers
para descomentar o nome do grupo:
. . .
%wheel ALL=(ALL) ALL
. . .
Como Configurar Regras Personalizadas
Agora que nos familiarizamos com a sintaxe geral do arquivo, vamos criar algumas novas regras.
Como Criar Alias
O arquivo sudoers
pode ser organizado de forma mais fácil agrupando coisas com vários tipos de “alias”.
Por exemplo, podemos criar três grupos diferentes de usuários, com associação sobreposta:
. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .
Os nomes de grupo devem começar com uma letra maiúscula. Podemos então permitir que os membros do GROUPTWO
atualizem o banco de dados apt
criando uma regra como esta:
. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .
Se não especificarmos um usuário/grupo para executar, como acima, sudo
assume o usuário root.
Podemos permitir que os membros do GROUPTHREE
desloquem e reiniciem a máquina criando um “alias de comando” e usando isso em uma regra para GROUPTHREE
:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
Criamos um alias de comando chamado POWER
que contém comandos para desligar e reiniciar a máquina. Em seguida, permitimos que os membros do GROUPTHREE
executem esses comandos.
Também podemos criar aliases de “Executar como”, que podem substituir a parte da regra que especifica o usuário para executar o comando:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Isso permitirá que qualquer um que seja membro do GROUPONE
execute comandos como o usuário www-data
ou o usuário apache
.
Lembre-se de que as regras posteriores substituirão as regras anteriores quando houver um conflito entre as duas.
Como Bloquear Regras
Existem várias maneiras de obter mais controle sobre como o sudo
reage a uma chamada.
O comando updatedb
associado ao pacote mlocate
é relativamente inofensivo em um sistema de usuário único. Se quisermos permitir que os usuários o executem com privilégios root sem ter que digitar uma senha, podemos fazer uma regra como esta:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
NOPASSWD
é uma “etiqueta” que significa que nenhuma senha será solicitada. Tem um comando companheiro chamado PASSWD
, que é o comportamento padrão. Uma tag é relevante para o restante da regra, a menos que seja anulado por sua “tag gêmea” mais adiante na linha.
Por exemplo, podemos ter uma linha como esta:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
Outro tag útil é NOEXEC
, que pode ser usado para impedir alguns comportamentos perigosos em certos programas.
Por exemplo, alguns programas, como less
, podem gerar outros comandos digitando isso a partir de dentro de sua interface:
!command_to_run
Isso basicamente executa qualquer comando que o usuário fornece com as mesmas permissões que less
está executando, o que pode ser bastante perigoso.
Para restringir isso, poderíamos usar uma linha como esta:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Informações Diversos
Existem algumas informações adicionais que podem ser úteis ao lidar com sudo
.
Se você especificou um usuário ou grupo para “executar como” no arquivo de configuração, você pode executar comandos como esses usuários usando as bandeiras -u
e -g
, respectivamente:
Por conveniência, por padrão, sudo
salvará seus detalhes de autenticação por um certo período de tempo em um terminal. Isso significa que você não terá que digitar sua senha novamente até que o temporizador expire.
Por motivos de segurança, se você deseja limpar esse temporizador quando terminar de executar comandos administrativos, pode executar:
Se, por outro lado, você deseja “preparar” o comando sudo
para que você não seja solicitado mais tarde, ou renovar sua locação sudo
, sempre pode digitar:
Você será solicitado a fornecer sua senha, que será armazenada em cache para usos posteriores de sudo
até que o período de tempo do sudo
expire.
Se você está simplesmente se perguntando que tipo de privilégios são definidos para seu nome de usuário, você pode digitar:
Isso listará todas as regras no arquivo /etc/sudoers
que se aplicam ao seu usuário. Isso lhe dá uma boa ideia do que você será ou não será autorizado a fazer com sudo
como qualquer usuário.
Há muitas vezes em que você executará um comando e ele falhará porque você esqueceu de prefaciá-lo com sudo
. Para evitar ter que reescrever o comando, você pode tirar vantagem de uma funcionalidade do bash que significa “repetir o último comando”:
O ponto de exclamação duplo repetirá o último comando. Nós o precedemos com sudo
para rapidamente mudar o comando não privilegiado para um comando privilegiado.
Para um pouco de diversão, você pode adicionar a seguinte linha ao seu arquivo /etc/sudoers
com visudo
:
. . .
Defaults insults
. . .
Isso fará com que sudo
retorne uma insulto bobo quando um usuário digitar uma senha incorreta para sudo
. Podemos usar sudo -k
para limpar a senha do sudo
armazenada em cache anterior para experimentá-lo:
Output[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn't been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.
Conclusão
Você agora deve ter uma compreensão básica de como ler e modificar o arquivo sudoers
, e um entendimento das várias maneiras que você pode usar para obter privilégios de root.
Lembre-se, privilégios de superusuário não são concedidos a usuários regulares por um motivo. É essencial que você entenda o que cada comando faz ao executá-lo com privilégios de root. Não leve a responsabilidade de forma leviana. Aprenda a melhor maneira de usar essas ferramentas para o seu caso de uso e restrinja qualquer funcionalidade que não seja necessária.
Source:
https://www.digitalocean.com/community/tutorials/how-to-edit-the-sudoers-file