14 Sep
Postado por: Pedro Pereira em: Segurança
Gostaria da ajuda de um especialista? Entre em contato e peça um orçamento.
Muitas vezes você precisa executar um programa com as credenciais de um outro usuário do sistema (geralmente o root). Quando isso acontece você (ou qualquer outra pessoa que quer executar este programa com outras credenciais) deve saber a senha desta outra conta. Nos casos em que você precisa executar algo como root, você já começa a ter um problemão: você teria que começar a informar a senha de root para outras pessoas. Assim você:
Nestes casos você pode utilizar a que talvez seja a ferramenta mais ignorada pelos administradores de sistemas: o sudo! Algumas vantagens do sudo:
Neste post vou te ensinar a configurar o sudo para que um usuário normal possa executar comandos como se fosse o root sem precisar saber a senha de root. Tentei ser o mais completo possível mostrando várias opções que nem eu mesmo conhecia antes de escrever este texto! Se você encontrar algum erro ou tiver alguma dúvida sobre alguma opção que eu não citei aqui, deixe um comentário.
Como já não é mais um programa “novo” (está disponível há muito tempo) ele está disponível nos repositórios de todas as distribuições e você pode instalá-lo facilmente usando YUM, Apt-get, etc. Isso se ele já não estiver instalado na sua máquina por padrão (que é o mais comum). Para verificar se ele já está instalado:
O /etc/sudoers é o arquivo de configuração do sudo. Aqui você especifica em detalhes o que cada usuário poderá fazer utilizando esta ferramenta.
Embora ele seja um arquivo em texto puro, você nunca deve editá-lo utilizando um editor de textos qualquer. Sempre que você precisar de qualquer alteração no comportamento do sudo, você precisa utilizar um editor de textos especialmente feito para ele: o visudo. O visudo é o editor recomendado pois oferece algumas funcionalidades que podem te ajudar muito enquanto edita o arquivo:
Este editor usa o Vi como backend por padrão. Portanto, todos os comandos que você usa no Vi para editar texto irão funcionar sem a menor alteração aqui. Se você não conhece o Vi muito bem, aqui vão alguns comandos básicos:
O Vi é um editor de textos bastante complexo e que possui milhares de comandos diferentes. Se você precisar de mais ajuda para conseguir usá-lo faça uma busca no Google para encontrar textos que te ofereçam mais detalhes. Isso infelizmente foge muito do escopo deste post (além disso, o Vi merece um livro inteiro só pra ele hehe).
Para editar o /etc/sudoers com o visudo você não precisa especificar parâmetro nenhum, basta executar:
# visudo
Porém, você não é obrigado a usar o Vi como editor para o visudo. O visudo pega o editor especificado na variável de ambiente $VISUAL. Se você mudar o editor especificado nela, este será o editor utilizado para editar o arquivo. Por exemplo, para usar o Gedit como editor do /etc/sudoers:
# export VISUAL=/usr/bin/gedit
Agora, quando você digitar “visudo” no terminal (note que, embora você mude o editor, o nome do comando continua o mesmo), ele irá abrir uma janela do Gedit com o /etc/sudoers para você fazer a edição do arquivo. Você pode fazer a mesma coisa com qualquer editor de textos que você prefira, basta utilizar as opções corretas no $VISUAL. Para fazer o visudo voltar a usar o Vi como editor padrão, basta exportar a variável VISUAL sem valor algum:
# export VISUAL=
Lembrando que, obviamente, você precisa ser o root para poder editar o /etc/sudoers mesmo utilizando editores gráficos.
Um alias (o plural é aliases, por favor :D ) é uma forma de você se referir a vários usuários ou hosts utilizando um único “apelido” comum a eles, funciona mais ou menos como um grupo. Por exemplo, dentro do arquivo /etc/sudoers você pode criar o seguinte alias:
User_alias ADMINISTRADORES = joao, maria, manoel, joana
Explicando:
Você também pode criar um alias para reunir várias máquinas sob um mesmo apelido:
Host_Alias SERVIDORES = hammer, icarus, osiris
Definir os hosts onde certos comandos podem ser executados é importante algumas vezes quando se usa o sudo. A linha acima é exatamente igual à linha do User_alias, a única diferença é a keyword usada antes.
O alias que talvez seja o mais interessante é o alias para comandos. Com ele, você pode juntar comandos que sejam relacionados de alguma forma. Por exemplo, podem ser grupos de comandos para trabalhar com redes, podem ser os comandos permitidos para um determinado grupo de usuários, etc. A separação dos comandos fica a seu critério. Para criar um alias de comandos:
Cmnd_Alias REDE = /sbin/ifconfig, /sbin/route, /usr/bin/nc
Assim, se você quiser que um determinado usuário só execute os comandos ifconfig, route e nc você pode se referir ao alias REDE. Isso também facilita a sua vida quando você tiver que remover ou adicionar um comando na lista.
Vale lembrar que o nome de qualquer dos alias é sempre uma string de letras maiúsculas, números e “_” (underline ou underscore).
Agora que você já está mais íntimo do arquivo de configuração do sudo, nós podemos começar a definir o que cada usuário poderá fazer. Você também vai ver que o sudo também pode ser utilizado para outras contas que não o root.
Primeiro, vamos fazer com que o usuário pedro possa executar qualquer comando como root bastando digitar a sua própria senha. Para isso, vá até o final do /etc/sudoers e adicione a seguinte linha:
pedro ALL=(ALL) ALL
O primeiro argumento é o nome do usuário, neste caso o usuário pedro. O primeiro ALL se refere ao host onde o usuário tem permissão para executar o(s) comando(s) especificados, que geralmente não precisa ser modificado. O segundo ALL define quais usuários poderão ser impersonados pelo usuário pedro para executar comandos, ou seja, como quais usuários o usuário pedro poderá executar comandos. O terceiro ALL é a lista de comandos que o usuário pode executar. Se você não quer permitir que o usuário execute todos os comandos, apague o ALL e especifique cada um dos comandos (ou o alias, como explicado anteriormente).
Então, para permitir que o usuário pedro execute o comando ifconfig:
pedro ALL=(ALL) /sbin/ifconfig
Ou, definindo com o alias que criamos anteriormente:
pedro ALL=(ALL) REDE
Agora, se você quiser que o ifconfig seja executado APENAS como root:
pedro ALL=(root) /sbin/ifconfig
Lembre-se também que você pode restringir o uso dos comandos do sudo para apenas algumas máquinas. Para permitir que o usuário pedro execute o comando ifconfig como root apenas nos hosts definidos no alias SERVIDORES:
pedro SERVIDORES=(root) /sbin/ifconfig
E pronto. Acho que já deu pra pegar o jeito né? Depois que você define todos os alias com tudo bem discriminado você não tem dor de cabeça nenhuma pra configurar novos usuários ou mesmo fazer pequenas modificações nos comandos que podem ser executados. Agora, vamos ver algumas configurações para ajudar um pouco na segurança do próprio sudo.
Embora o sudo te ajude a melhorar a segurança do seu sistema, se você não tomar cuidado com as configurações dele você pode acabar criando alguns problemas de segurança. Claro que, como todo software, o próprio sudo tem problemas de segurança que podem acabar comprometendo o seu sistema. Por isso, sempre tenha certeza de que está usando a última versão no seu Linux.
Você também deve tomar o cuidado de NUNCA permitir um usuário executar comandos que permitam a ele executar outros comandos. Por exemplo, não permita que um usuário execute o BASH ou qualquer outro shell através do sudo ou eles simplesmente serão o root.
Além disso, você deve colocar um tempo curto para que a validade da autenticação do usuário termine logo. Sempre que você executa um comando com sudo e digita a sua senha, a sua autenticação fica em cache. Assim, se você usar o sudo novamente você não vai precisar redigitar a sua senha: o sistema já sabe qual é e já completa. Para evitar qualquer problema de segurança, esse cache deve ser removido em um tempo curto. Você pode fazer isso usando “sudo -k” para limpar esse cache a qualquer momento. Para fazer isso de modo automático você deve editar o /etc/sudoers. Abra o arquivo com o visudo e procure a linha “Defaults”. Adicione o seguinte no final desta linha:
,timestamp_timeout=X
onde X é o tempo em minutos para esta autenticação expirar e você precisar digitar novamente a sua senha para usar o sudo.
O sudo é talvez uma das ferramentas menos utilizadas pelos administradores atualmente. Se bem configurada, te ajuda a manter a ordem no servidor e também a manter informações importantes logadas para que você tenha um controle ainda melhor do seu ambiente.
Porém, você deve ter muito cuidado ao definir os comandos que poderão ser executados através do sudo para que não acabe criando uma brecha na sua segurança. Nunca permita que um usuário execute qualquer shell pelo sudo, ou seja, usar a linha “usuario ALL=(ALL) ALL” é uma péssima ideia. Considere também não permitir que qualquer usuário execute o sudo, restrinja para apenas aqueles que realmente necessitem do acesso.
Se você tem alguma dúvida ou encontrou um erro no meu texto, deixe um comentário!

Esta obra escrita por Pedro Augusto de Oliveira Pereira está licensiada sob a Creative Commons Atribuição-Uso Não-Comercial-Vedada a Criação de Obras Derivadas 3.0 Brasil License.
1 comentário
Davidson Paulo
14|Sep|2011 1O melhor texto sobre o sudo que já li até hoje. Mandou bem, Pedrão. Grande abraço!
Deixe seu comentário!