Usando o comando sudo e arquivo sudoers no Linux

Usando o comando sudo e arquivo sudoers no Linux

Podemos rodar aplicações com privilégios administrativos de duas formas no Linux: usando o comando su para efetuar logon como usuário root, ou usando o sistema sudo. Neste artigo vamos trabalhar com o sudo.

A palavra sudo significa “substitute user do“. O sudo permite que um usuário rode programas como se fosse um outro usuário os rodando – geralmente como usuário root. Desta forma podemos atingir um nível de segurança muito maior no sistema – evitando que seja necessário efetuar logon como root para realizar tarefas administrativas, além é claro de poder especificar exatamente o que os usuários podem, ou não, fazer no sistema.

Vantagens do sudo

  • Quando usamos o sudo, é requisitada a senha do usuário logado, e não a senha do root
  • O utilitário sudo grava em log todos os comandos que ele executa. Assim, podemos posteriormente auditar nosso sistema e ver todos os comandos digitados pelos usuários que utilizaram o sudo.
  • O sudo também registra o nome de usuário que o utiliza para executar comandos
  • Com o sudo, podemos habilitar usuários específicos para executar comandos específicos
  • O uso do sudo dificulta a tarefa de um usuário malicioso que queira obter acesso ao sistema. Com ele, podemos bloquear a conta de root (alguns sistemas já o fazem por padrão), impedindo assim que alguém possa ter acesso irrestrito ao computador.

Segurança do sudo

Tanto o sudo quanto o comando su são baseados em segurança por senha, compartilhando os mesmos pontos fortes e fracos nesse quesito. Se a senha for comprometida, o sistema estará comprometido. Porém, se a senha de um usuário do sudo for comprometida, pode ser que não tenhamos um problema geral em nosso servidor – tudo vai depender do que exatamente o usuário era capaz de realizar no sistema com o sudo.

Além disso, usando o sudo para executar um comando único é muito mais seguro do que efetuar logon como root para realizar esse tipo de tarefa – podemos simplesmente esquecer de voltar para nossa conta de usuário comum, deixando o sistema vulnerável.

Vamos ver agora como utilizar o sudo.

Usando o sudo

Primeiramente, verifique se o pacote sudo está instalado em seu sistema com o comando a seguir:

$ which sudo

Comando sudo no Linux

Caso não esteja instalado, instale-o com um dos comandos a seguirem  sistemas Debian / Ubuntu (tem de ser root):

# apt-get install sudo

ou em sistemas Red Hat / CentOS / Oracle Linux

# yum install sudo

Para usar o sudo basta digitá-lo antes do comando que queremos executar. Por exemplo, quero executar o comando ifconfig no sistema com privilégios de usuário root usando o sudo:

$ sudo ifconfig

Opções do sudo

O comando sudo possui diversas opções que podem ser usadas, sendo as mais comuns as seguintes:

-u usuário Faz com que o sudo rode o comando especificado na sequência como o usuário listado, e não o root.

-b Faz com que o comando listado seja executado em background.

-l Sem especificar comandos para execução, a opção -l lista os comandos permitidos e proibidos para o usuário atual.

-v “validate”. Atualiza o timestamp do usuário, estendendo o timeout do sudo por mais 5 minutos (ou o valor especificado no arquivo sudoers) sem rodar nenhum comando.

-k “kill”. Invalida o timestamp do usuário de modo que da próxima vez que o sudo for usado, a senha será requerida. Essa opção não requer senha. Se for seguida de um comando, pedirá sempre a senha para executá-lo.

O sudo é configurado pela edição do arquivo de configuração /etc/sudoers, para que possamos dar aos usuários as permissões adequadas para rodar programas. Porém, não iremos editar diretamente esse arquivo – iremos usar o comando visudo para isso. O utilitário visudo trava, edita e verifica a gramática do arquivo sudoers; Por padrão, o visudo chama o editor vi (ou o nano, dependendo do sistema). Podemos alterar o editor de textos que será usado configurando as variáveis de ambiente SUDO_EDITOR, VISUAL ou EDITOR. Por exemplo, vamos ajustar o editor padrão da máquina para que seja usado o vi com o comando a seguir (tem de ser root):

$ export EDITOR=$(which vi)

Caso prefira usar o nano:

$ export EDITOR=$(which nano)

Sempre use o visudo para efetuar alterações no arquivo /etc/sudoers. Se houver algum erro neste arquivo você poderá ter problemas graves em seu sistema, e talvez tenha até de usar um cd de recuperação para conseguir se logar novamente.

Os comentários neste arquivo se iniciam sempre com o caractere #, como é comum nos arquivos de configuração do Linux.

Especificando Privilégios de Usuários

O formato básico de uma linha no arquivo sudoers que especifica os privilégios de usuários é o seguinte:

lista_usuários lista_hosts = (lista_runas) lista_comandos

Onde:

  • lista_usuários especifica os usuários aos quais a linha se aplica. Esta lista pode conter nomes de usuários, grupos (prefixados com um %) e aliases de usuários (veremos como criar aliases mais adiante). Podemos também usar o alias interno ALL, que significa “todos os usuários”.
  • lista_hosts especifica a quais hosts (máquinas) a linha de configuração se aplica. Essa lista pode conter hostnames, endereços IP ou aliases de hosts, além do alias interno ALL (todos os hosts que usam esse arquivo sudoers).
  • lista_runas especifica as identidades dos usuários sob os quais os comandos rodarão quando o sudo for chamado com a opção -u. Esta lista pode conter nomes de usuários, grupos (iniciados com %) e aliases. Esta opção deve estar entre parênteses para diferenciá-la das demais opções da linha. Se não for fornecido um nome de usuário, será assumido que o usuário quer rodar comandos como root. Podemos também usar o alias ALL, significando qualquer usuário ou grupo.
  • lista_comandos especifica a quais utilitários a linha de configuração se aplica. Os itens dessa lista deverão ser separados por vírgulas, e ela pode conter nomes de utilitários, nomes de diretórios que contenham programas e aliases de comandos, Os nomes de utilitários devem ser caminhos absolutos, e os nomes de diretórios devem terminar com o caractere /. Podemos excluir um comando (impedir sua execução) precedendo seu nome com o caractere !, e também podemos usar o alias interno ALL para significar “todos os comandos”.

Usando Aliases

Um alias nos permite renomear ou agrupar usuários, hosts ou comandos. O formato de uma definição de alias no arquivo sudoers é como segue:

tipo_alias nome_alias = lista_alias

Onde:

  • tipo_alias é o tipo do alias, o qual pode ser User_Alias, Runas_Alias, Host_Alias ou Cmnd_Alias;
  • nome_alias é o nome dado ao alias – por convenção, todo em letras maiúsculas;
  • lista_alias é uma lista de itens separados por vírgulas dos elementos que formam o alias. Precedendo um elemento com o símbolo ! o nega.

Tipos de aliases

User_Alias: a lista de alias para um User_Alias é o mesmo que a lista de usuários em uma especificação de privilégios. Por exemplo, as linhas a seguir definem três aliases de usuários: RH, ADMIN e ENGENHEIROS. O alias RH define três usuários (maria, rita e jorge); o alias ADMIN define o usuário fabio e os membros do grupo admins, e o alias ENGENHEIROS define o usuário fabio, membros do grupo admins exceto o usuário marcos:

User_Alias RH = maria, rita, jorge
User_Alias ADMIN = fabio, %admins
User_Alias ENGENHEIROS = fabio, %admins, !marcos

Runas_Alias: Alias para a lista de usuários como os quais rodamos os comandos especificados. Por exemplo, a seguinte linha especifica o alias FORMATAR que inclui os usuários fabio e ana, ambos com permissão de formatar discos:

Runas_Alias FORMATAR = fabio, ana

Host_Alias: Trata-se de uma lista de hosts onde os comandos poderão ser executados (desde que esses hosts referenciem o mesmo arquivo sudoers). Por exemplo, vamos definir um alias de host para as máquinas servidor01 e servidor02, de nome SERVIDORES:

Host_Alias SERVIDORES = servidor01, servidor02

Cmnd_Alias: Lista de comandos específicos. Por exemplo, a linha a seguir cria um alias de comandos para os comandos mount e umount, de nome MONTAGEM:

Cmnd_Alias MONTAGEM = /bin/mount, /bin/umount

Trabalhando com opções padrão: DEFAULTS

Podemos alterar algumas opções de configuração padrão usando a palavra chave Defaults. A maior parte dos valores nesta lista são flags booleanas (ligado/desligado) ou strings de texto. Para ligar uma flag basta nomeá-la em uma das linhas Defaults, e podemos desligar um flag precedendo-o com o símbolo !. Por exemplo, podemos ligar o flag tty_tickets e desligar o flag fqdn usando a seguinte linha:

Defaults tty_tickets,!fqdn

A tabela abaixo lista alguns flags comuns. A lista completa pode ser consultada nas páginas de manual do arquivo sudoers.

Flag Significado
env_reset Faz com que o sudo reconfigure as variáveis de ambiente para conter apenas as variáveis LOGNAME, SHELL, USER, USERNAME, MAIL e SUDO_*
fqdn Realiza lookups DNS em FQDNs (Fully Qualified Domain Names). Quando esta flag está ativa, podemos usar FQDNs no arquivo de sudoers. Porém, isso pode afetar negativamente a performance do sudo – principalmente se o servidor DNS não estiver funcionando corretamente.
insults Mostra “insultos” leves e humorísticos quando um usuário digita uma senha errada. Por padrão está desligado.
lecture=freq Controla quando o sudo mostra uma mensagem de aviso antes do prompt de senha. Os valores de freq podem ser never, once e always. O padrão é once.
mail_always Envia um email para o usuário listado em mailto toda vez que um usuário usar o sudo. Por padrão está desligada.
mail_badpass Envia um email para o usuário listado em mailto quando um usuário digita uma senha incorreta ao usar o sudo.
mailto=endereço Envia as mensagens de erro e avisos para o endereço (email, cujo padrão é o do root). Endereços de email que possuam caracteres especiais devem ser digitados entre aspas.
passwd_timeout=minutos Número de minutos antes que um prompt de senha do sudo dê time out (expire). O valor zero indica que a senha não expira. O padrão é 5 minutos.
passwd_tries=num Número (num) de vezes que um usuário pode digitar uma senha incorreta antes que o sudo feche. O padrão é 3 vezes.
tty_tickets Faz com que o sudo autentique os usuários com base em tty (terminal), e não com base em suas contas de usuário. O padrão é ligado.

Vamos ver agora alguns exemplos de configuração do arquivo /etc/sudoers:

Exemplos

1. Vamos dar à usuária ana permissão de executar qualquer comando, em qualquer computador, como se fosse qualquer usuário. Para isso, adicionamos a linha abaixo ao arquivo /etc/sudoers:

ana ALL=(ALL) ALL

2. Vamos dar ao usuário jorge o privilégio de executar qualquer programa em qualquer computador como se fosse o usuário root:

jorge ALL=(root) ALL

3. Agora, a usuária renata poderá apenas montar e desmontar partições usando os comandos mount e umount, em qualquer sistema, como usuário root:

renata ALL=(root) /bin/mount, /bin/umount

Testando: vamos tentar montar e desmontar a partição /dev/sdb1 no diretório /backup com o usuário marcos (não está no sudoers), usando o sudo:

$ su marcos
$ sudo mount -t ext 4 /dev/sdb1 /backup

comando sudo no Linux

Veja que não foi possível montar a partição. Vamos tentar então com a usuária renata:

$ exit
$ su renata
$ sudo mount -t ext 4 /dev/sdb1 /backup

Usando o comando sudo no Linux

Parece ter funcionado. Vamos ver se a partição foi realmente montada:

S df -h | grep /backup

Sudoers no Linux

Perfeito! Partição montada com sucesso!
Vamos desmontá-la agora (ainda como renata):

$ sudo umount -t ext4 /backup

arquivo de sudoers no Linux

Perfeito também – sem nenhum erro. Se desejar, verifique com df -h.

Vamos tentar também executar o comando apt-get update com o usuário renata (ela não tem essa permissão de acordo com o sudoers):

$ sudo apt-get update

Permissões com sudo no Linux

Esse comando ela não pode executar, pois não foi dada permissão no /etc/sudoers. Portanto, nossa configuração funcionou perfeitamente.

4. Trabalhando com grupos: vamos permitir que os usuários de um grupo chamado “redes” sejam capazes de executar o comando ifconfig, que por padrão só pode ser executado pelo root. Veja a usuária renata tentando executar o ifconfig, sem e com o sudo:

$ ifconfig
$ sudo ifconfig

ifconfig com sudo no Linux

Ela não consegue. Vamos então criar o grupo redes e adicionar a renata a esse grupo:

$ su
# groupadd redes
# adduser renata redes

permissões de acesso no linux com sudo e sudoers

E agora vamos editar o arquivo /etc/sudoers para dar permissão de execução do ifconfig a esse grupo. Para isso, edite o arquivo com visudo e acrescente a linha a seguir:

%redes ALL=(root) /sbin/ifconfig

Salve e saia do arquivo.

Agora vamos testar novamente o comando com a usuária renata e o sudo (será necessário efetuar logout e login no sistema novamente, ou reiniciá-lo, pois os membros dos grupos são avaliados durante o processo de login):

$ exit
# su renata
$ sudo ifconfig

logar como root com su no Linux

Agora ela conseguiu executar o ifconfig. Todos os usuários que forem membros do grupo redes também o conseguirão.

5. Vamos ver um exemplo com aliases agora. Criaremos um alias de comandos (Cmnd_Alias) chamado MONTAGEM para os comandos mount e umount, e aplicaremos esse alias ao usuário marcos. Acrescente as linhas a seguir ao arquivo /etc/sudoers (use o visudo):

Cmnd_Alias MONTAGEM = /bin/mount, /bin/umount
marcos ALL=(root) MONTAGEM

Comando sudo no linux e permissões

Após salvar e sair do arquivo de sudoers, faça logoff e logon no sistema, e vamos testar para ver se o marcos consegue montar e desmontar a partição /dev/sdb1 no ponto de montagem /backup:

$ su marcos
$ sudo mount -t ext4 /dev/sdb1 /backup
$ mount | grep sdb1

Aplicando permissões de administrador com sudo no Linux

Agora o usuário marcos consegue montar e desmontar partições como se fosse root.

Para saber mais sobre o comando sudo e o arquivo sudoers, consulte as páginas de manual correspondentes.

Até a próxima!

 

Sobre Fábio dos Reis (1273 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 25 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Unix, Linux e Open Source em geral, adora Eletrônica e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
Contato: Website

Escreva um comentário

Seu e-mail não será divulgado


*