Como gerenciar meu arquivo .ssh / known_hosts


47

Eu corro um desktop Ubuntu com vários servidores virtuais no Virtual Box para testar coisas, etc. No passado, eu também estava me conectando a outros tipos de caixas VPS Linux remotas. Atualmente, meu .ssh/known_hostsarquivo tem um monte de chaves, a maioria das quais não está mais sendo usada.

Quero limpar meu .ssh/known_hostsarquivo, mas como sei qual chave pertence a qual host? Ou seja, como sei quais chaves posso remover com segurança e quais devo deixar em paz?

Respostas:


64

Para descobrir qual entrada é para um nome de host conhecido em known_hosts:

 # ssh-keygen -H  -F <hostname or IP address>

Para excluir uma única entrada de known_hosts:

 # ssh-keygen -R <hostname or IP address>

27

Se você tiver uma lista de todos os seus hosts, poderá fazer algo como

ssh-keyscan -t rsa,dsa -f list_of_hosts > ~/.ssh/known_hosts

Isso substituirá o arquivo .ssh / known_hosts por um arquivo recém-gerado, com base na verificação dos hosts.

E também faça o que o outro receber sugerir; HashKnownHosts é mais chato do que ajuda aqui.


ssh-keyscanpossui regras de formatação muito rígidas para o list_of_hostsarquivo. Precisa ser apenas os endereços e nenhum outro espaço em branco, em seguida, LF após cada endereço. Isso inclui LF após o último endereço. Caso contrário, você terá muito lixo no arquivo gerado.
Nux

21

Com dificuldade...

O Ubuntu, por padrão, faz o hash de nomes de host do arquivo known_hosts (esse não é o comportamento padrão do openssh), para dificultar que qualquer pessoa que esteja lendo o arquivo saiba quais sistemas você acessa.

Se você realmente deseja limpar o arquivo, a opção mais simples provavelmente é apenas excluí-lo e verificar as chaves dos servidores que você conhece à medida que surgem, mas, na verdade, eu apenas deixaria o know_hosts em paz.

Você pode impedir que novas entradas de hosts sejam hash comentando a opção em / etc / ssh / ssh_config

#HashKnownHosts yes

Limpar ~ / .ssh / known_hosts também ajuda quando a configuração do host remoto é alterada e o ssh mostra um aviso. No entanto, é preciso ter cuidado com isso e ignorar a advertência apenas para hosts confiáveis.
2828 Alex

6
Uma opção melhor pode ser explicar como gerar o hash para um nome de host específico, permitindo que ele pesquise esse hash em known_hosts para que ele possa atualizá-lo.
Cerin

11
Após a alteração acima, basta adicionar uma nova entrada, por exemplo, conectando-se ao novo servidor com ssh root@something-new-or-new-dns-alias. Isso atualizará o known_hostsarquivo original e criptografará os nomes de host / IPs.
Nux

2

Eu tinha mais de 300 entradas antigas obsoletas no meu arquivo known_hosts. Não tenho certeza de que funcionará para todos os sistemas (ou mesmo para a maioria dos sistemas), mas aqui está o meu script de Q&D. Pode ser necessário ajustar as seqüências ou o local correspondente.

#!/bin/sh
list=`cat ~/.ssh/known_hosts | awk '{print $1}' |sed -e 's/,/ /g' | sort -u `

listsorted=$(printf "%s\n" ${list[@]} | sort -u)
echo $listsorted
#listsorted="10.2.10.1"
echo > /tmp/sshstat.txt
for host in $listsorted ;
do
echo $host 
ssh -oBatchMode=yes -oConnectTimeout=2  root@${host} "exit" >/tmp/sshstat.txt 2>&1 
ret=$?
if [ $ret -ne 0 ]; then
     echo "Failed: $host"
     echo sed -i.bak \"/$host/d\" "~/.ssh/known_hosts" | sh
else
    grep "Offending RSA" /tmp/sshstat.txt |  sed -e 's/:/ /g' | awk '{printf "sed -i.bak -e \"%dd\" %s  \n", $6, "~/.ssh/known_hosts" }' | sh
   fi
done
#echo $list

Isso não funciona em um known_hostsarquivo com hash e, como o interlocutor pergunta: "como sei qual chave pertence a qual host", acho que é muito provável que o arquivo seja hash. Ele diz que está no Ubuntu e, como theotherreceivediz, o Ubuntu faz hashes por padrão.
Neil Mayhew
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.