Linux e Unix
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. Caso queira mais informações sobre o comando su, acesse o link a seguir:
http://www.planetaunix.com.br/2014/08/comando-su-o-comando-su-substitute-user.html
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
Caso não esteja instalado, instale-o com um dos comandos a seguir (tem de ser root):
apt-get install sudo # sistemas Debian / Ubuntu
ou
yum install sudo # sistemas Red Hat / CentOS / Fedora
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 queira 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
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
Parece ter funcionado. Vamos ver se a partição foi realmente montada:
S df -h | grep /backup
Perfeito! Partição montada com sucesso!
Vamos desmontá-la agora (ainda como renata):
$ sudo umount -t ext4 /backup
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
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
Ela não consegue. Vamos então criar o grupo redes e adicionar a renata a esse grupo:
$ su
$ groupadd redes
$ adduser renata redes
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
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
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
Agora o usuário marcos consegue montar e desmontar partições como se fosse root.
Para saber mais sobre o utilitário sudo e o arquivo sudoers, consulte as páginas de manual correspondentes.
Até a próxima!
Sobre Fábio dos Reis
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 Astronomia, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.
loading...
-
Comando Sudo - 02 - Atribuindo Privilégios Aos Usuários Com Visudo No Linux
Comando sudo - Atribuindo privilégios aos usuários com visudo no Linux Neste vídeo vamos mostrar como atribuir privilégios de acesso aos usuários do Linux no arquivo sudoers, com o comando visudo. Este vídeo é parte integrante do Curso de Linux...
-
Comando Sudo - 03 - Usando Aliases E Grupos Com O Visudo No Linux
Comando sudo - Usando aliases e grupos com o visudo no Linux Vamos aprender neste vídeo a usar aliases (nomes alternativos) e grupos no arquivo de sudoers, com o comando visudo. Este vídeo é parte integrante do Curso de Linux Completo / Certificação...
-
Criando E Excluindo Usuários No Mac Os X Pelo Terminal (linha De Comandos)
Vamos aprender a criar um usuário e seus atributos usando o Terminal no Mac OS X. Primeiramente, precisamos descobrir os uids dos usuários do sistema. Os UIDs dos usuários comuns começam a ser contados a partir de 501. Precisamos descobrir o uid...
-
Comando At - Agendamento De Comandos - Linux
O utilitário at lê comandos a partir da entrada padrão ou de um arquivo especificado, os quais serão executados em um período futuro, usando-se /bin/sh. A configuração é feita em um prompt interativo. Sintaxe:at hora_do_dia hora_do_dia pode...
-
Montando Partições Formatadas No Linux
Na terceira parte de nosso tutorial sobre instalação de discos no Linux, veremos o processo de montagem de partições. No tutorial Formatação de Partições no Linux nós preparamos as partições que serão montadas nesse tutorial.Montar uma partição,...
Linux e Unix