SSH Com Chave Pública
Recentemente, decidimos utilizar a classe Robot do AWT em associação com o fest para automatizar os testes da interface gráfica. Falarei sobre a implementação do teste automatizado em outro artigo. Nesse artigo falarei sobre um problema que tive com a autenticação do SSH e como resolvi utilizando chave pública e privada.
SSH
Alguns módulos do nosso sistema rodam em servidores remotos. Para que algumas ações possam ser realizadas por um usuário (no caso dos testes automatizados o usuário é o próprio Robot), outras ações – esplícitas, dependentes de terceiros ou dependentes de temporização – devem ocorrer nos servidores. Para simular as chamadas “ações de terceiros”, precisamos executar scripts nos servidores via SSH.
O SSH (Secure Shell) é um protocolo de rede que permite a troca de dados entre dois dispositivos de rede através de um canal seguro. Servidores SSH necessitam de usuário e senha. Como nossos servidores utilizam um usuário fixo e os scripts que rodam lá dependem de permissões atribuídas a esse usuário, não seria a melhor escolha criar um usuário para cada desenvolvedor em cada servidor. Para emular um login automático, decidimos utilizar chave pública e privada. De acordo com a wikipedia:
A criptografia de chave pública ou criptografia assimétrica é um método de criptografia que utiliza um par de chaves: uma chave pública e uma chave privada. A chave pública é distribuída livremente, enquanto a chave privada deve ser conhecida apenas pelo seu dono.
Basicamente, quem detém a chave pública – criada no mesmo momento que a chave privada – pode acessar o dispositivo de rede, que é o detentor da chave privada.
Abaixo, segue o processo para criação do par de chaves pública e privada. Não é necessário repetir esse processo para cada host remoto. Basta fazer apenas uma vez e copiar a chave privada para o diretório .ssh de cada host remoto. Detalhe: segurança não é nosso objetivo :).
Passos Para Criação das Chaves Pública e Privada
1. Autenticar no ssh server
$ ssh -l [USER] [HOST_NAME]
2. Criar o par de chaves pública/privada
$ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/atc/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/atc/.ssh/id_rsa Your public key has been saved in /home/atc/.ssh/id_rsa.pub $ cd ~/.ssh $ cat id_rsa.pub >> authorized_keys $ chmod 600 authorized_keys
Obs.: Não utilize passphrase.
3. Faça log out e crie, caso não exista, o diretório .ssh
$ cd ~ $ mkdir .ssh $ chmod 700 .ssh
4. Copie o arquivo id_rsa gerado no servidor para o diretório local .ssh
$ cd ~/.ssh $ rcp atc@[HOST_NAME]:/home/atc/.ssh/id_rsa .
5. Faça o login via ssh
$ ssh -l [USER] [HOST_NAME]
Agora não é mais necessário fornecer o password.
Resolvendo Problemas
Caso você enfrente algum problema, faça a autenticação em modo debug para ter o mínimo de informações:
$ ssh -v -l [USER] [HOST_NAME]
Caso esteja tudo certo, algo assim será exibido no terminal:
debug1: Authentications that can continue: publickey,password,keyboard-interactive debug1: Next authentication method: publickey debug1: Offering public key: /Users/res/.ssh/res-rsa debug1: Server accepts key: pkalg ssh-rsa blen 151 debug1: PEM_read_PrivateKey failed debug1: read PEM private key done: type Enter passphrase for key '/Users/res/.ssh/res-rsa': debug1: read PEM private key done: type RSA debug1: Authentication succeeded (publickey).
Enfrentei dois problemas na primeira vez em que tentei gerar as chaves: falta da permissão 700 no diretório .ssh do servidor e falta da permissão 600 no conteúdo do diretório .ssh. No processo para criação das chaves já coloquei os passos para alteração de permissão.
Referências
http://www.snailbook.com/faq/publickey-userauth.auto.html
http://magicmonster.com/kb/net/ssh/auto_login.html
http://www.linuxquestions.org/questions/linux-security-4/ssh-public-private-key-authentication-problems-454445/
Otimo post, obrigado. Adiciono a este um outro problema que enfrentei:
O diretório do home user no server remoto não pode estar com FULL permissão ( 777)
Altere esta permissao para 755 (chmod 755 )
Valeu a dica Rodrigo, o meu serviço SSH havia parado de repente, e foi exatamente a falta da permissão 600 que estava atrapalhando o serviço.
Obrigado pela dica e parabéns pelo post.
Achei algumas dicas sobre o uso de SSH:
http://server.dzone.com/articles/9-ssh-do