Olá,
Da mesma série de posts sobre automatização de configurações da pasta do usuário (nossa, pra quem não postava, já esta até fazendo série de posts heheh). Iremos abordar uma configuração que muitas vezes nos trás muita dor de cabeça, aceitar todos fingerprints de chaves de servidor ssh.
Eu costumo utilizar o $HOME/.ssh/config para deixar todos meus hosts ssh configurados, pra quem não conhece isso, basta criar este arquivo, e ele usa o seguinte formato:
Host <nome servidor> HostName <host/ip> User <usuário>
realizando a configuração de um servidor fictício:
Host servidor HostName localhost User root
Feito isto, basta digitar: ssh servidor, que seria o equivalente a ssh root@localhost, isto facilita quando não se tem acesso ao /etc/hosts para guardar nome amigável para determinados ips, e quando se acessa diferentes servidores com diferentes nomes de usuários. Voltando ao nosso problema, eu tenho meu config, mas meu known_hosts esta desatualizado ou pior, vazio!
A cada nova conexão seria necessário aceitar cada chave do servidor, como a seguir:
The authenticity of host ’servidor (127.0.0.1)’ can’t be established.
RSA key fingerprint is bc:b1:8d:c3:61:6a:5b:9f:c1:b2:16:c5:e4:d2:b1:b2.
Are you sure you want to continue connecting (yes/no)?
O que torna cansativo, principalmente se tiver que executar um comando em cada servidor, então temos o seguinte script:
KNOWN_HOSTS=./ssh_known_hosts SSH_ARGS="-o StrictHostKeyChecking=no -o UserKnownHostsFile=$KNOWN_HOSTS" for host in `cat $HOME/.ssh/config |grep "^Host "|cut -d" " -f2`; do echo $host; ssh $host $SSH_ARGS echo ''; done cnt=1 for host in `cat $HOME/.ssh/config |grep "^Host "|cut -d" " -f2`; do linha1=`sed "${cnt}q;d" $KNOWN_HOSTS` echo $linha1 $host >> ${KNOWN_HOSTS}.tmp echo "" >> ${KNOWN_HOSTS}.tmp let cnt++ done mv ${KNOWN_HOSTS}.tmp ${KNOWN_HOSTS}
O que este script faz, nada mais é do que ler cada Host configurado no arquivo $HOME/.ssh/config e aceitar automaticamente a chave primária do mesmo através da opção -o StrictHostKeyChecking=no e salva no arquivo -o UserKnownHostsFile=$KNOWN_HOSTS (no nosso caso KNOWN_HOSTS=./ssh_known_hosts), fiz isso para não sobrescrever o seu arquivo known_hosts e ainda para facilitar a leitura do arquivo, ou pegar somente os hosts que lhe interessam, o segundo for do script coloca o valor do ‘Host’ como comentário em cada fingerprint.
Vale a pena lembrar que cada chave será automaticamente aceita, então cabe a você garantir que realmente cada chave pertence ao servidor em questão, e não esta ocorrendo nenhum tipo de ataque man-in-the-middle. E após executado o script, é só colocar os fingerprints no known_hosts e estamos prontos para conectar no servidor sem confirmação dos mesmos.
Até breve.
como utilizo caminho absoluto para ler o seu .ssh/config, este script pode ser salvo em qualquer lugar, e depois de executado ele irá gerar um arquivo ssh_know_hosts no diretório atual, qualquer dúvida, só perguntar
abraço
Link | novembro 25th, 2010 at 15:33
obrigado, ainda bem esta dica ajudou outras pessoas, pois realmente é muito chato ficar dando ‘yes’ toda vez que vai conectar em um host via ssh, principalmente quando faz parte da rotina conectar em diversas máquinas heheh
eu prefiro o grep e cut ao awk, devido a sua simplicidade, e o grep e cut é mais fácil a legibilidade, em relação ao awk, mas obrigado pela sugestão para aqueles que adoram fazer tudo com awk + sed
abraço
Link | novembro 25th, 2010 at 15:35