Domine o `sudo` no Linux: Segurança e Controle de Acesso em Detalhes

Entendendo e Controlando o Comando Sudo no Linux

O comando `sudo` no Linux é uma ferramenta poderosa que permite executar comandos com os privilégios de outro usuário, geralmente o `root`. Além disso, ele oferece um controle granular sobre quem pode acessar esses recursos, concedendo acesso total ou apenas a um subconjunto de comandos. Vamos explorar como utilizar o `sudo` de forma eficaz.

`sudo` e Permissões de Root

No universo do Linux, a filosofia de que “tudo é um arquivo” é fundamental. Na verdade, a maioria dos componentes do sistema, como processos, arquivos, diretórios e conexões de rede, interagem com o kernel através de descritores de arquivo. Essa abordagem unificada para gerenciar recursos do sistema é uma marca registrada do Linux e sistemas operacionais similares.

Essa visão abrangente sobre arquivos no Linux torna as permissões de arquivos um elemento central na gestão de privilégios e direitos dos usuários. O proprietário de um arquivo ou diretório tem liberdade para realizar diversas ações, como editar, renomear, mover ou excluir. Além disso, o proprietário pode definir permissões para que outros usuários ou grupos possam ler, modificar ou executar esses arquivos. Todas as interações com o sistema são regidas por essas permissões.

Contudo, há uma exceção: o superusuário, conhecido como `root`. A conta `root` possui privilégios especiais, não estando vinculada às permissões dos objetos do sistema operacional. O `root` tem permissão para realizar qualquer ação, a qualquer momento, em qualquer parte do sistema.

O acesso à senha `root` concede esse poder a qualquer usuário. No entanto, o potencial para erros, seja por intenção maliciosa ou por equívoco, é alto. Até mesmo o usuário `root` pode cometer erros que prejudiquem o sistema. Essa vulnerabilidade torna o uso direto da conta `root` uma prática arriscada.

Por isso, a prática recomendada atualmente é evitar o login direto como `root`. Em vez disso, recomenda-se usar uma conta de usuário normal e utilizar o `sudo` para elevar temporariamente os privilégios quando necessário, frequentemente apenas para um único comando.

A Lista de `sudoers`

O `sudo` já vem instalado em diversas distribuições modernas, como Ubuntu, Manjaro e Fedora. Essa popularidade reflete sua longa história desde os anos 80, tornando-se o método padrão para operações de superusuário em quase todas as distribuições Linux.

Durante a instalação de uma nova distribuição, o usuário criado é automaticamente incluído na lista de `sudoers`, ou seja, usuários que podem usar o comando `sudo`. Com essa permissão, você pode adicionar outros usuários à lista `sudoers`.

No entanto, conceder acesso total de superusuário indiscriminadamente é arriscado. Por isso, a lista de `sudoers` permite especificar quais comandos cada usuário pode executar com `sudo`. Assim, é possível limitar o acesso sem restringir totalmente a capacidade de executar tarefas necessárias.

Executando Comandos como Outro Usuário

Inicialmente, o `sudo` era focado em ações de superusuário, permitindo executar comandos com esses privilégios. Contudo, seu escopo foi ampliado para permitir a execução de comandos como qualquer outro usuário. Essa nova funcionalidade levou a uma mudança no nome, passando de “superusuário faz” para “usuário substituto faz”.

Para executar um comando como outro usuário, usamos a opção `-u` seguida do nome do usuário. Por exemplo, para executar o comando `whoami` como o usuário `mary`, usamos `sudo -u mary whoami`. Se a opção `-u` for omitida, o comando será executado como `root`.

Como o `sudo` está sendo utilizado, a senha do usuário que está invocando o comando será solicitada.

sudo -u mary whoami

A saída de `whoami` confirma que o comando foi executado como `mary`.

Além disso, o `sudo` permite fazer login como outro usuário sem saber a senha desse usuário. A opção `-i` (login) é usada para isso, e a senha do próprio usuário que está invocando o comando será solicitada.

sudo -i -u mary
pwd
whoami
ls -hl
exit

Após o login, os arquivos de configuração de `mary` são carregados, como `.bashrc`, `.bash_aliases` e `.profile`. O prompt de comando reflete que é uma sessão de `mary`. O comando `pwd` indica o diretório home de `mary`, e `whoami` confirma que a sessão está utilizando a conta de `mary`. A listagem dos arquivos mostra que pertencem a esta conta. O comando `exit` finaliza a sessão de `mary` e retorna à sessão do usuário original.

Editando o Arquivo `sudoers`

Para adicionar ou editar os usuários que podem utilizar o `sudo`, é necessário editar o arquivo `sudoers`. É crucial utilizar o comando `visudo` para essa tarefa. O `visudo` evita que múltiplas edições ocorram simultaneamente e também realiza verificações de sintaxe e análise do conteúdo do arquivo ao ser salvo.

Caso as edições não passem nos testes, o arquivo não será salvo automaticamente. Nesse caso, é possível cancelar e descartar as alterações, voltar para editar novamente ou forçar o salvamento das edições incorretas. Esta última opção é desaconselhável, pois pode resultar em um sistema onde nenhum usuário consegue usar o `sudo`.

O `visudo` não é um editor de texto. Ele invoca um dos editores existentes no sistema. Em distribuições como Manjaro e Ubuntu, o `visudo` inicia o editor `nano`. Já no Fedora, ele inicia o `vim`.

Se você preferir o `nano` no Fedora, ele pode ser instalado e configurado. Para instalar, use:

sudo dnf install nano

E então, ao invocar o `visudo`, é possível especificar o editor desejado com este comando:

sudo EDITOR=nano visudo

O editor `nano` será aberto, carregando o arquivo `sudoers` para edição.

Adicionando Usuários ao Grupo `sudo`

Para adicionar um usuário à lista de quem pode usar o `sudo`, abra o arquivo `sudoers` com o comando `visudo` (ou o comando com editor especificado):

sudo visudo

Navegue até encontrar a definição do grupo `%sudo`.

O sinal de porcentagem indica que esta é uma definição de grupo. Em algumas distribuições, a linha `%sudo` pode estar comentada com um `#` no início. Nesse caso, remova o `#` e salve o arquivo.

A linha `%sudo` tem o seguinte formato:

`%sudo`: nome do grupo.
`ALL=`: regra aplicada a todos os hosts na rede.
`(ALL:ALL)`: membros do grupo podem executar comandos como qualquer usuário e grupo.
`ALL`: membros do grupo podem executar todos os comandos.

Resumindo, os membros deste grupo têm permissão para executar qualquer comando, como qualquer usuário ou grupo, tanto no computador local quanto em qualquer outro host na rede. Portanto, uma forma simples de conceder a alguém privilégios de `root` e a capacidade de usar o `sudo` é adicionar o usuário ao grupo `sudo`.

Vamos supor que temos dois usuários, `tom` e `mary`, e vamos adicionar o usuário `tom` ao grupo `sudo` com o comando `usermod`. A opção `-G` especifica o grupo a ser adicionado, e a opção `-a` garante que o usuário seja adicionado a esse grupo sem ser removido dos outros grupos existentes.

sudo usermod -a -G sudo tom

Vamos verificar os grupos aos quais `mary` pertence:

groups

O usuário `mary` pertence apenas ao grupo `mary`.

Vamos agora verificar os grupos de `tom`:

groups

O usuário `tom` pertence aos grupos `tom` e `sudo`.

Vamos tentar executar um comando que exige privilégios de `sudo` com o usuário `mary`:

sudo less /etc/shadow

O acesso de `mary` ao arquivo `/etc/shadow` é negado, pois ela não tem permissão para usar o `sudo`.

Agora vamos ver o resultado com `tom`:

sudo less /etc/shadow

Ao inserir sua senha, `tom` tem acesso ao arquivo `/etc/shadow`.

Ao ser adicionado ao grupo `sudo`, `tom` passou a ter acesso total aos comandos que utilizam `sudo`.

Concedendo Direitos Restritos de `sudo`

`Tom` agora possui privilégios totais de `sudo`, o que significa que ele pode realizar qualquer ação que `root` ou qualquer membro do grupo `sudo` possa realizar. Em alguns casos, é desejável permitir que um usuário execute funções que exigem privilégios de `root`, mas sem conceder acesso total ao `sudo`. Isso pode ser alcançado adicionando o usuário ao arquivo `sudoers` e listando os comandos específicos que ele poderá usar.

Vamos introduzir `harry`, um usuário sem privilégios de `sudo`:

groups

`Harry` precisa instalar softwares, mas não deve ter acesso total ao `sudo`. Para isso, vamos editar o arquivo com `visudo`:

sudo visudo

Navegue até as definições de grupo e adicione uma linha para `harry`. Como essa é uma definição de usuário, não é necessário usar o sinal de porcentagem `%` no início da linha.

A entrada para o usuário `harry` é:

harry    ALL=/usr/bin/apt-get

Observe que existe uma tabulação entre `harry` e `ALL=`.

Esta linha significa que o usuário `harry` pode executar os comandos listados em todos os hosts conectados a esta rede. A lista de comandos é composta por apenas um comando: `/usr/bin/apt-get`. Para adicionar mais comandos, basta separá-los por vírgulas.

Salve o arquivo. Se desejar verificar a sintaxe da linha adicionada, utilize a opção `-c` do `visudo`:

sudo visudo -c

O `visudo` irá verificar o arquivo e informar se está tudo correto. Agora, o usuário `harry` poderá usar o comando `apt-get` para instalar softwares, mas terá acesso negado a qualquer outro comando que exija `sudo`.

sudo apt-get install finger

Com o comando adequado, `harry` poderá instalar softwares.

O que acontece se `harry` tentar usar outro comando que exige `sudo`?

sudo shutdown now

`Harry` não tem permissão para executar este comando. Seu acesso foi restringido aos comandos especificados no arquivo `sudoers`.

Utilizando `User_Alias` no `sudoers`

Se desejarmos conceder os mesmos privilégios a `mary`, podemos adicionar uma linha para o usuário `mary` da mesma forma como fizemos com `harry`. Uma forma mais eficiente é utilizar `User_Alias`.

Em resumo, `User_Alias` contém uma lista de nomes de contas de usuários. O nome desse `User_Alias` pode ser utilizado em uma definição para representar todas as contas da lista. Ao modificar os privilégios, apenas uma linha necessitará ser editada.

Vamos criar um `User_Alias` e usá-lo no arquivo `sudoers`:

sudo visudo

Navegue no arquivo até a linha de especificação do `User_Alias`.

Adicione o `User_Alias` da seguinte forma:

User_Alias INSTALLERS = harry, mary

Os elementos são separados por espaços. A lógica é a seguinte:
`User_Alias`: indica ao `visudo` que é um `User_Alias`.
`INSTALLERS`: nome arbitrário para o alias.
`= harry, mary`: lista de usuários incluídos no alias.

Vamos editar a linha adicionada anteriormente para o usuário `harry`:

harry    ALL=/usr/bin/apt-get

Modifique-a para que fique:

INSTALLERS    ALL=/usr/bin/apt-get

Isto define que todas as contas de usuário que fazem parte do `User_Alias` “INSTALLERS” podem executar o comando `apt-get`. Vamos verificar com `mary`, que também deve ser capaz de instalar software:

sudo apt-get install colordiff

`Mary` agora pode instalar softwares pois está incluída no `User_Alias` “INSTALLERS”, que recebeu os direitos de uso do `apt-get`.

Três Atalhos Úteis do `sudo`

Se você esquecer de adicionar o `sudo` a um comando, digite:

sudo !!

O último comando será repetido com `sudo` no início da linha.

Após usar o `sudo` e autenticar com sua senha, você não precisará usar a senha novamente durante 15 minutos. Se quiser que sua autenticação seja removida imediatamente, use:

sudo -k

Curioso sobre onde verificar as tentativas de comando `sudo` que falharam? Elas são registradas no arquivo `/var/log/auth.log`. Para visualizar o arquivo, use:

less /var/log/auth.log

Neste arquivo, você pode encontrar informações sobre as tentativas de comando, como as da conta `mary`, que estava logada em `TTY pts/1` ao tentar usar o comando `shutdown` como usuário `root`.

Com Grande Poder…

…vem a capacidade de delegar partes dele a outras pessoas. Agora você aprendeu a habilitar outros usuários seletivamente.