Como editar known_hosts quando vários hosts compartilham o mesmo nome IP e DNS?

23

Eu regularmente ssh em um computador que é dual-boot OS X / Linux. As duas instâncias do sistema operacional não compartilham a mesma chave de host, portanto, elas podem ser vistas como dois hosts que compartilham o mesmo IP e DNS. Digamos que o IP seja 192.168.0.9 e os nomes sejam hostname e hostname.domainname

Até onde eu entendi, a solução para se conectar aos dois hosts é adicioná-los ao arquivo ~/.ssh/know_hosts . No entanto, é mais fácil falar do que fazer, porque o arquivo está com hash e provavelmente tem várias entradas por host ( 192.168.0.9 , hostname , hostname.domainname ). Como consequência, tenho o seguinte aviso

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

Existe uma maneira fácil de editar o arquivo known_hosts , mantendo os hashes. Por exemplo, como posso encontrar as linhas correspondentes a um determinado nome de host? Como posso gerar os hashes para alguns hosts conhecidos?

A solução ideal permitir-me-ia ligar sem problemas a este computador com o ssh, não importa se o chamo 192.168.0.9 , hostname ou hostname.domainname , nem se usa o hostkey do Linux ou o hostkey do OSX. No entanto, eu ainda quero receber um aviso se houver um ataque man-in-the-middle real, ou seja, se outra chave diferente dessas for usada.

    
por Frédéric Grosshans 05.07.2012 / 14:32

7 respostas

11

A solução mais simples aqui é apenas usar as mesmas chaves de host para Linux e OS X. Ou seja, escolha um conjunto de arquivos /etc/ssh/ssh_host_*_key* e copie-os para o outro sistema operacional. Em seguida, a mesma chave de host será apresentada a um cliente SSH, independentemente do sistema operacional em que você tenha inicializado, e o cliente SSH não será mais sábio.

    
por 05.07.2012 / 18:40
25

Como @Izzy sugeriu em um comentário acima, ssh diz a linha ofensora, e removendo essa linha (salvando-a em outro lugar), aceitando a nova chave e copiando a linha removida de volta, você acaba com duas chaves para o mesmo host, e o ssh aceitará também.

(Você também pode usar ssh-keygen -H -F <hostname> para encontrar linhas em seu arquivo known_hosts que correspondam a esse nome de host. Executar isso depois de copiar a linha removida de volta deve listar duas entradas.)

Se alguém souber como fazer com que o PuTTY faça a mesma coisa, eu ficaria muito interessado em saber sobre isso.

    
por 07.01.2013 / 00:55
8

Encontrei isso que pode ajudá-lo com o que você deseja alcançar.

Fonte: link

Create a config file in your .ssh directory as follows:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

Explanation Below (from man ssh_config)

CheckHostIP

If this flag is set to "yes", ssh(1) will additionally check the host IP address in the known_hosts file. This allows ssh to detect if a host key changed due to DNS spoofing. If the option is set to "no", the check will not be executed. The default is "yes".

HostKeyAlias

Specifies an alias that should be used instead of the real host name when looking up or saving the host key in the host key database files. This option is useful for tunneling SSH connections or for multiple servers running on a single host.

The Username and Port line avoids you having to give those options on the command line, too, so you can just use:

% ssh server1
% ssh server2
    
por 05.07.2012 / 17:30
2

A maneira mais fácil de resolver seu problema é fornecer a cada host um endereço IP próprio / distinto. Com 253 endereços disponíveis em sua rede (privada) e IPv4, isso não deve ser grande coisa. Dê a eles IPs fixos (como um servidor DHCP identificaria a máquina com base no endereço MAC das placas de rede, e ambos receberiam o mesmo endereço). Eu não vejo nenhuma outra solução se você quiser manter as medidas de segurança (que eu não deixaria cair por esse pequeno "conforto").

    
por 05.07.2012 / 18:24
2

Não me deparo com esse problema quando me conecto a várias caixas VPS que compartilham o mesmo IP porque cada uma tem uma porta SSH diferente (20022,30022, etc) para que elas sejam registradas como hosts conhecidos com chaves diferentes.

Isso poderia ser uma solução para você?

    
por 09.04.2016 / 18:16
1

Outro artigo , que descreve várias formas para lidar com seu problema:

The second method uses two openSSH parameters: StrictHostKeyCheckin, and UserKnownHostsFile. This method tricks SSH by configuring it to use an empty known_hosts file, and NOT to ask you to confirm the remote host identity key.

    
por 05.07.2012 / 17:36
1

Como você deseja manter a verificação rigorosa da chave do host, eu gostaria que eles usassem arquivos known_hosts diferentes. Para fazer isso, configure seu arquivo ~/.ssh/config (ou o arquivo /etc/ssh/ssh_config se você precisar disso para trabalhar em várias contas de usuários locais) assim:

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

, substituindo $REALHOSTNAME pelo nome do host ou pelo endereço IP, é claro. (Não importa qual você escolher, contanto que você escolha algo depois de "Hostname" que resolveria para o endereço IP, mas eu usaria o nome do host de preferência para um endereço IP, apenas em princípios gerais.)

Em seguida, ssh myserver.linux e ssh myserver.osx podem ter chaves de host diferentes, mas você ainda recebe a verificação. Se é o Linux que está em cima e você digita o OS X (ou vice-versa), você receberá o aviso (que eu acredito ser o efeito desejado).

Se eu tivesse esse problema, verificaria se havia algo completamente errado no arquivo principal known_hosts que não corresponde a nenhum dos dois, de modo que, se você digitar $REALHOSTNAME em vez de myserver.osx , O aviso. :-) Eu faria isso colocando algo como

<ip-address-of-github.com> $REALHOSTNAME

no meu /etc/hosts , em seguida, fazendo um ssh $REALHOSTNAME e aceitando a nova chave, depois retirando essa entrada.

    
por 09.04.2016 / 17:34

Tags