A separação de privilégios é um dos paradigmas de segurança fundamentais implementados em sistemas operacionais do tipo Linux e Unix. Os usuários regulares operam com privilégios limitados para reduzir o escopo de sua influência em seu próprio ambiente, e não no sistema operacional como um todo.
Um usuário especial, chamado root, possui privilégios de superusuário. Essa é uma conta administrativa sem as restrições presentes em usuários normais. Os usuários podem executar comandos com privilégios de superusuário ou root de várias maneiras diferentes.
Neste artigo, vamos discutir como obter privilégios de root de uma maneira correta e segura, dando um foco especial na edição do arquivo /etc/sudoers
.
Vamos completar esses passos em um servidor Ubuntu 20.04, mas a maioria das distribuições do Linux modernas, como o Debian e o CentOS, devem operar de maneira similar.
Este guia considera que você já completou a configuração inicial de servidor discutida aqui. Faça login no seu servidor como um usuário não raiz e continue abaixo.
Nota: este tutorial aborda com profundidade a escalação de privilégios e o arquivo sudoers
. Se quiser apenas adicionar privilégios sudo
a um usuário, verifique nossos tutoriais de início rápido Como criar um novo usuário habilitado para sudo para o Ubuntu e CentOS.
Há três maneiras básicas de obter privilégios de root, que variam em seu nível de sofisticação.
O método mais simples e direto de se obter privilégios de root é fazendo login diretamente em seu servidor como um usuário root.
Se você estiver fazendo login em uma máquina local (ou usando uma característica de acesso de console fora de banda em um servidor virtual), digite root
como seu nome de usuário no prompt de login e digite a senha root solicitada.
Caso esteja fazendo login via SSH, especifique o usuário root antes do endereço IP ou nome de domínio em sua string de conexão via protocolo SSH:
- ssh root@server_domain_or_ip
Se você não tiver configurado chaves SSH para o usuário root, digite a senha de root solicitada.
su
para tornar-se rootFazer login diretamente como root não é recomendado, pois é fácil começar a usar o sistema para tarefas não administrativas, o que é uma atividade perigosa.
A próxima maneira de obter privilégios de superusuário permite que você se torne um usuário root a qualquer momento, conforme necessário.
Podemos fazer isso invocando o comando su
, que significa “substituir usuário”. Para obter privilégios de root, digite:
- su
A senha do usuário root será solicitada e, depois disso, você será levado a uma sessão de shell root.
Quando terminar as tarefas que necessitam de privilégios de root, retorne ao seu shell padrão digitando:
- exit
sudo
para executar comandos como rootA maneira final de obter privilégios de root que vamos discutir é com o comando sudo
.
O comando sudo
permite que sejam executados comandos únicos com privilégios de root, sem a necessidade de gerar um novo shell. Ele é executado desta forma:
- sudo command_to_execute
Ao contrário do su
, o comando sudo
solicitará a senha do usuário atual, não a senha do root.
Devido às suas implicações de segurança, o acesso sudo
não é concedido a usuários por padrão e deve ser configurado antes de funcionar corretamente. Verifique nossos tutoriais de início rápido Como criar um novo usuário habilitado para sudo para o Ubuntu
e CentOS para aprender como configurar um usuário habilitado para sudo.
Na seção seguinte, vamos discutir como modificar a configuração do sudo
mais detalhadamente.
O comando sudo
é configurado através de um arquivo localizado em /etc/sudoers
.
Aviso: nunca edite este arquivo com um editor de texto normal! Use sempre o comando visudo
em vez disso!
Considerando que uma sintaxe inadequada no arquivo /etc/sudoers
pode tornar o seu sistema defeituoso, onde é impossível obter privilégios elevados, é importante usar o comando visudo
para editar o arquivo.
O comando visudo
abre um editor de texto aparentemente normal, com a diferença que ele valida a sintaxe do arquivo no momento de salvar. Isso impede que erros de configuração bloqueiem as operações do sudo
, que pode ser a única maneira disponível para obter privilégios de root.
Tradicionalmente, o visudo
abre o arquivo /etc/sudoers
com o editor de texto vi
. No entanto, o Ubuntu configurou o visudo
para usar o editor de texto nano
ao invés disso.
Se quiser alterá-lo de volta para o vi
, emita o seguinte comando:
- sudo update-alternatives --config editor
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, é possível alterar esse valor adicionando a seguinte linha ao seu ~/.bashrc
:
- export EDITOR=`which name_of_editor`
Habilite o arquivo para implementar as alterações:
- . ~/.bashrc
Após ter configurado o visudo
, execute o comando para acessar o arquivo /etc/sudoers
:
- sudo visudo
O arquivo /etc/sudoers
será apresentado no seu editor de texto selecionado.
O arquivo foi copiado e colado do Ubuntu 18.04, com comentários removidos. O arquivo /etc/sudoers
do CentOS possui muitas linhas a mais, algumas das quais não vamos discutir neste guia.
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.
A primeira linha, “Defaults env_reset”, reinicia o ambiente de terminal para remover qualquer variável de usuário. Essa é uma medida de segurança usada para limpar variáveis de ambiente potencialmente nocivas na sessão sudo
.
A segunda linha, Defaults mail_badpass
, diz ao sistema para enviar e-mails ao usuário mailto
configurado informando sobre tentativas de senha incorretas do sudo
. Por padrão, ela é a conta root.
A terceira linha, que começa com “Defaults secure_path=…”, especifica o PATH
(os lugares no sistema de arquivos em que o sistema operacional irá procurar aplicativos) que será usado para as operações sudo
. Isso impede o uso de caminhos de usuário que possam ser nocivos.
A quarta linha, que dita 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 do 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
Esse “ALL” indica que o usuário root pode executar comandos como todos os usuários.
root ALL=(ALL:ALL) ALL
Esse “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 o usuário root pode executar qualquer comando usando o sudo
, desde que forneçam sua senha.
As duas linhas seguintes são semelhantes às linhas de privilégio de usuário, mas especificam as regras sudo
para grupos.
Os nomes que começam com um %
indicam nomes de grupo.
Aqui, vemos que o grupo admin pode executar qualquer comando como qualquer usuário em qualquer host. De maneira similar, o grupo sudo possui os mesmos privilégios, mas também pode executar como qualquer grupo.
A última linha aparentemente é um comentário à primeira vista:
. . .
#includedir /etc/sudoers.d
Ele realmente começa com um #
, que geralmente indica um comentário. No entanto, essa linha, na realidade, indica que os arquivos dentro do diretório /etc/sudoers.d
também serão fornecidos e aplicados.
Os arquivos dentro desse diretório seguem as mesmas regras do arquivo /etc/sudoers
em si. Qualquer arquivo que não termine em ~
, nem tenha um .
nele será lido e anexado à configuração do sudo
.
Isso existe principalmente para os aplicativos alterarem privilégios sudo
na instalação. Colocar todas as regras associadas dentro de 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 reverter credenciais facilmente sem precisar tentar manipular o arquivo /etc/sudoers
diretamente.
Assim como o arquivo /etc/sudoers
, é recomendado sempre editar arquivos dentro do diretório /etc/sudoers.d
com o visudo
. A sintaxe para editar esses arquivos seria:
- sudo visudo -f /etc/sudoers.d/file_to_edit
A operação mais comum requisitada pelos usuários ao gerenciar permissões sudo
é conceder o acesso sudo
geral a um novo usuário. Isso é útil se você quiser conceder a uma conta o acesso administrativo total ao sistema.
A maneira mais fácil de fazer isso em um sistema configurado com um grupo de administração de fins gerais, como o sistema Ubuntu neste guia, é adicionando o usuário em questão a esse grupo.
Por exemplo, no Ubuntu 20.04, o grupo sudo
possui privilégios completos de administrador. Podemos conceder esses mesmos privilégios a um usuário adicionando ele ao grupo desta forma:
- sudo usermod -aG sudo username
O comando gpasswd
também pode ser usado:
- sudo gpasswd -a username sudo
Ambos alcançarão o mesmo resultado.
No CentOS, o grupo em questão é geralmente o wheel
ao invés do grupo sudo
:
- sudo usermod -aG wheel username
Ou, é possível usar o gpasswd
:
- sudo gpasswd -a username wheel
No CentOS, se adicionar o usuário ao grupo não funcionar imediatamente, pode ser necessário editar o arquivo /etc/sudoers
para descomentar o nome do grupo:
- sudo visudo
. . .
%wheel ALL=(ALL) ALL
. . .
Agora que nos familiarizamos com a sintaxe geral do arquivo, vamos criar algumas novas regras.
O arquivo sudoers
pode ser organizado mais facilmente agrupando coisas com vários tipos de “pseudônimos”, ou ”aliases”.
Por exemplo, é possível criar três grupos diferentes de usuários, com associações coincidentes:
. . .
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. Então, podemos permitir que 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 o comando, como acima, o sudo
utiliza o usuário root como padrão.
Podemos permitir que membros do GROUPTHREE
desliguem e reinicializem a máquina criando um “pseudônimo de comando” e usando ele em uma regra para o GROUPTHREE
:
. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .
Criamos um pseudônimo de comando chamado POWER
que contém comandos para desligar e reinicializar a máquina. Em seguida, permitimos que os membros do GROUPTHREE
executem esses comandos.
Também podemos criar pseudônimos “Executar como”, que podem substituir a parte da regra que especifica o usuário com o qual será executado o comando:
. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .
Isso permitirá que qualquer membro do GROUPONE
execute comandos como o usuário www-data
ou o usuário apache
.
Lembre-se apenas que as regras posteriores irão substituir regras mais antigas quando houver um conflito entre elas.
Há várias maneiras de ganhar mais controle sobre como o sudo
reage a uma chamada.
O comando updatedb
associado ao pacote mlocate
é relativamente inofensivo em um sistema com um único usuário. Se quisermos permitir que os usuários o executem com privilégios de root sem precisar digitar uma senha, podemos criar uma regra como esta:
. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .
O NOPASSWD
é uma “etiqueta”, que significa que nenhuma senha será solicitada. Ele possui um comando companheiro chamado PASSWD
, que é o comportamento padrão. Uma etiqueta é relevante para o resto da regra, a menos que seja anulada por sua etiqueta “gêmea” mais tarde no processo.
Por exemplo, podemos ter uma linha como esta:
. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .
Outra etiqueta útil é a NOEXEC
, que pode ser usada para evitar um comportamento perigoso em certos programas.
Por exemplo, alguns programas, como o less
, podem gerar outros comandos digitando isto a partir de sua interface:
!command_to_run
Isso executa basicamente qualquer comando dado pelo usuário com as mesmas permissões nas quais less
está sendo executado, o que pode ser bastante perigoso.
Para restringir isso, poderíamos usar uma linha como esta:
. . .
username ALL = NOEXEC: /usr/bin/less
. . .
Há mais algumas informações que podem ser úteis ao lidar com o sudo
.
Se você especificou um usuário ou grupo para “executar como” no arquivo de configuração, é possível executar comandos como esses usuários usando os sinalizadores -u
e -g
, respectivamente:
- sudo -u run_as_user command
- sudo -g run_as_group command
Por conveniência, o sudo
salvará por padrão seus detalhes de autenticação por uma certa quantidade de tempo em um terminal. Isso significa que não será necessário digitar sua senha novamente até que esse temporizador se esgote.
Por fins de segurança, se quiser limpar esse temporizador quando terminar de executar comandos administrativos, execute:
- sudo -k
Se, por outro lado, quiser “preparar” o comando sudo
para que você não seja solicitado mais tarde, ou renovar seu lease do sudo
, digite:
- sudo -v
A sua senha será solicitada e então colocada em cache para utilização posterior do sudo
, até que o intervalo de tempo do sudo
expire.
Se quiser apenas saber quais tipos de privilégios estão definidos para seu nome de usuário, digite:
- sudo -l
Isso irá listar todas as regras no arquivo /etc/sudoers
que se aplicam ao seu usuário. Isso dá uma boa ideia do que será ou não permitido fazer com o sudo
como qualquer usuário.
Haverá muitas vezes em que você executará um comando e ele falhará por ter esquecido de iniciá-lo com o sudo
. Para evitar ter que digitar novamente o comando, utilize uma funcionalidade bash que significa “repetir o último comando”:
- sudo !!
O ponto de exclamação duplo repetirá o último comando. Adicionamos o sudo
no início para alterar rapidamente o comando não privilegiado para um comando privilegiado.
Para se divertir um pouco, adicione a linha a seguir ao seu arquivo /etc/sudoers
com o visudo
:
- sudo visudo
. . .
Defaults insults
. . .
Isso fará com que o sudo
retorne um insulto bobo quando um usuário digitar uma senha incorreta para o sudo
. Podemos usar o sudo -k
para limpar a senha sudo
anterior em cache para testar essa funcionalidade:
- sudo -k
- sudo ls
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.
Agora, você deve ter um conhecimento básico sobre como ler e modificar o arquivo sudoers
, e uma noção acerca dos vários métodos que podem ser usados para se obter privilégios de root.
Lembre-se: os privilégios de superusuário não são dados a usuários comuns por um motivo. É essencial que você compreenda o que cada comando que você executa com privilégios de root faz. Não deixe de levar a sério toda a responsabilidade existente. Aprenda a melhor maneira de usar essas ferramentas para o seu caso de uso e bloqueie todas as funcionalidades que não sejam necessárias.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!
Awesome article, the
sudo -u
configuration hint insudoers
file helped me a lot. Thank you.