quinta-feira, 10 de outubro de 2013

O comando "visudo" permite editar o ficheiro "sudoers" ...

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ê:

  • Diminui muito a eficácia do método de autenticação utilizando senhas já que você não sabe o cuidado que essas outras pessoas terão com esta senha (e se eles passarem esta senha para outra pessoa em quem você não confia?);
  • Não tem como rastrear quem fez o que no sistema já que todos estão usando a mesma conta para fazer o que quer que seja no sistema. Por exemplo, embora os usuários A, B e C tenham usado a conta do root ontem, os logs vão registar apenas que o root executou o comando X e não que o usuário A usou a conta de root para executar tal comando. Isso é um grande problema.

Nestes casos você pode utilizar a que talvez seja a ferramenta mais ignorada pelos administradores de sistemas: o sudo! Algumas vantagens do sudo:

  • Você não precisa passar a senha de root para outras pessoas. A senha que deve ser utilizada com o sudo é a do próprio usuário;
  • É mais rápido usar o sudo que o su;
  • Você pode cortar o acesso de uma conta aos poderes de root sem ter que mudar a senha de root. Basta alterar o /etc/sudoers (como veremos mais à frente) e o usuário já perde o acesso à conta root;
  • Você sabe exatamente quais contas tem acesso root e pode controlar mais facilmente este acesso.

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 editar o arquivo de configuração /etc/sudoers

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:

  • Verificações de segurança;
  • Procura por erros no arquivo;
  • Evita que vários usuários editem o arquivo /etc/sudoers ao mesmo tempo.

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:

  • h: move o cursor um caracter para a esquerda;
  • j: move o cursor uma linha para baixo;
  • k: move o cursor uma linha para cima;
  • l: move o cursor um caracter para a direita;
  • i: coloca o Vi no modo de edição. Assim você consegue editar o arquivo;
  • Esc: coloca o Vi no modo de comandos. É neste modo que você usa os comandos h, j, k, l, m, etc.;
  • :wq: salva as alterações e sai do editor. Note que você deve digitar o “:” antes do “wq”.

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

 

Como criar um alias no /etc/sudoers

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:

  • User_alias: é um comando para o sudo reconhecer um alias que contém nomes de usuários (para hosts é uma outra palavra chave discutida mais à frente);
  • ADMINISTRADORES: é o nome do alias (você também pode considerar isso com o nome de um grupo que contém os usuários, porém que só tem validade no sudo);
  • Depois do “=” você deve inserir os nomes de usuários que fazem parte deste alias que você está criando. Aqui você deve usar os nomes de usuário que existem no sistema, caso contrário isto não irá funcionar.

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).

Definindo o que cada usuário pode fazer

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.

Se protegendo contra problemas de segurança

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.

Conclusão

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.

0 comentários :

Enviar um comentário