Artigos
Entrar
| SSH sem senha: autenticação através de certificados RSA |
|
|
|
| Seg, 21 de Dezembro de 2009 08:11 |
|
O OpenSSH é talvez a ferramenta mais utilizada por administradores de sistemas atualmente. Quando de seu desenvolvimento, o objetivo dele foi substituir ferramentas inseguras como telnet, rlogin, etc. Ele permite que você se conecte de forma segura a qualquer dispositivo (como switches, roteadores, servidores Linux, FreeBSD, OpenBSD, Solaris, etc.) que esteja executando um servidor SSH com suporte aos protocolos 1 ou 2. Aqui vamos ver como configurar o SSH para se autenticar utilizando certificados, para deixar o acesso ao seu servidor mais prático e mais simples. Todos os passos descritos aqui não dependem de distribuição X ou Y: você pode executar este procedimento em qualquer distribuição e tudo irá funcionar tranquilamente. O problemaSempre antes de você se conectar a um servidor via SSH, uma tentativa de estabelecer a identidade desta máquina é feita. Quando não é possível estabelecer a identidade, um aviso como o seguinte é exibido: The authenticity of host ‘192.168.1.104 (192.168.1.104)’ can’t be established. Basicamente, o que essa mensagem quer te dizer é que não foi possível garantir que o host com IP 192.168.1.104 é realmente o host 192.168.1.104 ao qual você queria se conectar (alguém pode ter derrubado a máquina 192.168.1.104 e substituido por outra, com um software que grava todos os usuários e senhas digitados enquanto simula um diálogo do SSH). Também é fornecida para você a chave RSA do host, para que você confira (alguém faz isso? Para resolver este problema, você pode utilizar certificados que garantem a autenticidade tanto do cliente quanto do servidor. Além disso, como é praticamente impossível alguém conseguir o seu certificado sem acesso à sua máquina, você nem vai precisar utilizar senhas para se conectar (o que é excelente quando se usa muito o SCP para copiar arquivos entre hosts). Também existe o problema do brute-force. Neste tipo de ataque, serão testadas várias combinações de usuários/senhas. É uma forma garantida de que, em um determinado momento, o atacante irá conseguir encontrar uma combinação de usuário/senha válidos. Veja bem, em momento algum eu disse que é rápido e/ou viável, disse que é possível e muito comum na Internet. Para melhorar a segurança dele neste ponto, você tem pelo menos duas alternativas:
Embora softwares de monitoramento de logs sejam bastante efetivos, eles muito provavelmente não funcionam em dispositivos como switches, roteadores, etc., além disso é mais fácil que eles possuam algum bug do que a autenticação através de certificados que já foi extensivamente testada e provada por milhares de pessoas. Por isso, recomendo que você utilize a segunda opção em todos os seus dispositivos que possuam SSH habilitado. O melhor de tudo isso, é que implantar esse tipo de autenticação é extremamente simples. Vamos lá! A configuraçãoA autenticação vai acontecer assim:
Para isso, vamos começar gerando o certificado do cliente. Para isso execute o seguinte comando: # ssh-keygen -t rsa -b 2048 O “ssh-keygen” não precisa necessariamente ser executado como root. Se a chave criada para o usuário “x” for reconhecida pelo servidor, o usuário “x” poderá logar como “root” no servidor, explico isso mais com mais detalhes adiante. Executando o “ssh-keygen” será gerada uma chave RSA de 2048 bits (eu especifiquei na linha comando, mas não é necessário já que este é o padrão). O mínimo para o RSA é de 768 bits. Algumas perguntas serão feitas para você. Os valores exibidos entre “()” são os valores padrão e, se quiser mantê-los, basta pressionar “enter”, não precisa escrever a opção novamente:
Agora, temos que falar para o servidor que ele deverá aceitar esse certificado. Para isso, transferimos o certificado para o servidor de forma segura: # scp /root/.ssh/id_rsa.pub Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :/root Isso irá copiar a chave pública do cliente para o servidor, no diretório /root. Agora, temos que adicionar esse certificado ao banco de dados que contém os certificados aceitos por esse servidor. No servidor, execute: # cat id_rsa.pub >> /root/.ssh/authorized_keys Vale lembrar que o diretório “.ssh” só existirá se você tiver utilizado o SSH pelo menos 1 vez, anteriormente (se ele não existir, pode criá-lo na mão). Caso o arquivo authorized_keys não exista, basta executar o comando citado acima. Pronto! Agora você já pode se conectar ao servidor de uma forma absolutamente segura, sem medo que roubem a sua senha (já que você não a envia através da rede) e sem medo de ataques brute force (que são totalmente inofensivos contra autenticação baseada em certificados RSA). Com qual usuário eu vou logar?A autenticação via certificados pode ser utilizada para qualquer usuário válido no servidor, não apenas para o usuário root. Seguindo os passos descritos anteriormente, você poderá logar sem senha como root utilizando o seguinte comando: $ ssh Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. Isso, considerando que você não esteja executando este comando como root. Se estiver, basta: # ssh 192.168.1.104 Isso acontece pois, quando você não especifica um usuário, o SSH entende que o login a ser utilizado para logar no servidor remoto é o mesmo do usuário que executou o comando. Portanto, se você executou o comando acima como root, você não precisa da parte “root@” do comando. Isso acontece com qualquer usuário, mas dois detalhes devem ser observados:
Além disso, é necessário que o usuário especificado tenha acesso de leitura e escrita ao “authorized_keys”. Resumindo, se a sua chave pública está presente no arquivo “authorized_keys” do usuário “x” mas não do usuário “y”, você poderá fazer o login como usuário “x” mas não como “y”. Esta regra é a mesma para todos os usuários do sistema. Como fazer isso no cliente Windows? Acesse o site de download do PuTTy (http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) e faça o download dos arquivos “putty.exe”, “puttygen.exe” e “pageant.exe”. Primeiro, vamos executar o “puttygen.exe” para gerarmos os certificados do cliente Windows. A tela inicial do PuTTyGen é assim:
Para enviar o arquivo para o servidor seguramente, você pode utilizar o WinSCP (http://winscp.net/eng/download.php) ou o PSCP (desenvolvido pelo mesmo time que desenvolveu o PuTTy). Utilizando o PSCP: C:\>pscp.exe caminho\para\arquivo-do\certificado\windows Este endereço de e-mail está protegido contra spambots. Você deve habilitar o JavaScript para visualizá-lo. :/root Isso irá copiar a chave que você gerou através do PuTTyGen para o servidor 192.168.1.104 no diretório /root. No servidor, você deve executar os mesmo passos descritos anteriormente para a chave do cliente Linux. Tenha certeza de utilizar “>>” para não sobrescrever o arquivo de chaves do servidor, apagando todos as outras chaves que eram aceitas. O certificado privado nunca é exibido pelo PuTTyGen em lugar nenhum de sua janela: você deve salvá-lo direto em um arquivo com extensão “.ppk” (a extensão é obrigatória para a chave privada); e também não deve em hipótese alguma ser copiado para outras máquinas. Porém, antes de salvar a chave privada, você deve definir uma senha para ela. Esta senha é requisitada sempre que você utilizar este certificado para se conectar ao servidor (ela pode e deve ser diferente da senha especificada no servidor). Ou seja, neste ponto ao invés de ter que digitar a senha do servidor você teria que digitar a senha do seu certificado! Trocamos 6 por meia-dúzia já que a senha do seu certificado também deve ser complexa, por motivos óbvios. Para resolver esse “problema”, vamos utilizar o Pageant. Ele é um programa que irá salvar a senha do seu certificado, assim você não vai precisar digitar senha alguma enquanto se autentica no servidor. Inicie o Pageant com um clique-duplo no arquivo que baixamos do site do PuTTy e depois no ícone dele que fica próximo ao relógio do sistema. Abaixo está a tela incial:
Para fazer com que o PuTTy utilize o certificado que você criou (e adicionou ao banco de dados do servidor), primeiro crie um perfil para que possamos salvar todas as modificações que faremos (para que não precisemos fazer isso todas as vezes). Para criar o perfil, primeiro digite o IP ou nome DNS do servidor ao qual você vai se conectar na caixa de texto “Host name (or IP address)” da tela inicial do PuTTy. Depois, digite um nome qualquer (pode ser o nome DNS, o IP ou um nome como “Servidor de e-mails”) em “Saved sessions”. Clique em “Save” e o perfil será criado e exibido na lista de servidores salvos do PuTTy. Para ter certeza de que está alterando o perfil correto, selecione o perfil que você acabou de salvar e clique em “Load”. Agora, você terá que acessar as opções oferecidas no menu à esquerda da janela do PuTTy. Neste menu, você irá encontrar uma opção chamada “Connection” e, logo abaixo dela, uma opção chamada “Data”, clique nela. Em “Auto-login username” digite o nome do usuário que você quer utilizar para se conectar ao servidor. No meu exemplo, digitei “root” mesmo.
É, a configuração é bem mais simples no Linux! Toque final no servidorAgora, você não vai mais precisar que o SSH permita que os usuários tentem autenticar-se através de senhas. Por isso, você pode desabilitar esta opção editando o arqivo /etc/ssh/sshd_config. Procure a linha: PasswordAuthentication yes E troque o “yes” por “no”: PasswordAuthentication no Se houver um “#” no início dessa linha, remova-o para que a opção surta efeito. Agora salve o arquivo e reinicie o daemon do SSH. No CentOS # service sshd restart No Debian: # /etc/init.d/ssh restart ATENÇÃO: só faça isso depois de testar e garantir que a autenticação através de certificados está funcionando corretamente! Se houver algum problema, você pode ficar sem acesso ao servidor. ConclusãoEsta configuração além de ser prática, aumenta em muito a segurança do seu servidor eliminando o ponto fraco da maioria dos sistemas: senhas fracas. Uma boa idéia é gerar um certificado para cada usuário (recomendo que gere certificados de 2048 bits), assim você elimina completamente as chances de usuários utilizarem senhas fracas. Você utiliza alguma técnica diferente? O que você faz? Deixe a sua dica nos comentários! Aproveite também e me mande suas sugestões e críticas! Se você gostou deste post, também vai gostar do post “SSH Port Forwarding” onde eu mostro como você pode acessar um recurso de uma rede remota fazendo uma VPN com SSH bem rápido.
Fonte: http://www.pedropereira.net/ssh-sem-senha-autenticacao-atraves-de-certificados-rsa/ |
| Última atualização em Dom, 28 de Março de 2010 21:17 |








