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

29

Eu ssh regularmente em um computador que é um computador com OS X / Linux de inicialização dupla. As duas instâncias do SO não compartilham a mesma chave do host, portanto podem ser vistas como dois hosts compartilhando o mesmo IP e DNS. Digamos que o IP seja 192.168.0.9e os nomes sejam hostnameehostname.domainname

Até onde eu entendi, a solução para conectar-se aos dois hosts é adicioná-los ao ~/.ssh/know_hostsarquivo. No entanto, é mais fácil dizer do que fazer, porque o arquivo é hash, e tem provavelmente 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 known_hostsarquivo, mantendo os hashes. Por exemplo, como posso encontrar as linhas correspondentes a um determinado hostame? Como posso gerar os hashes para alguns hosts conhecidos?

A solução ideal seria permitir-me para ligar para perfeitamente a este computador com ssh, não importa se eu chamá-lo 192.168.0.9, hostnameou hostname.domainname, nem se ele usa sua HostKey Linux ou seu HostKey OSX. No entanto, ainda quero receber um aviso se houver um ataque real no meio, ou seja , se outra chave além dessas duas for usada.

Frédéric Grosshans
fonte
O que você quer fazer? Edite para quê?
Rhyuk
@Rhyuk: Edite para poder reconhecer como válido a chave de host OSX e linux para o endereço IP, o nome do host e o nome do host.domínio.
Frédéric Grosshans
@Rhyuk: Eu editei a pergunta. Está mais claro agora?
Frédéric Grosshans
2
Você simplesmente considerou fazer as duas instalações terem a mesma chave?
Zoredache
3
Existem alguns casos em que é razoável usar um endereço IP para acessar várias entidades (cada uma com chaves de host SSH individuais) e ainda manter um controle rigoroso de que APENAS essas chaves de host são as que são vistas pelo cliente SSH. Por exemplo, algumas configurações de alta disponibilidade nas quais um cluster de unidades é acessado usando um endereço IP compartilhado, mas onde (por algum motivo) a chave do host SSH vista pelos clientes muda, dependendo da unidade de cluster que está ativa no momento. Outro caso é quando vários hosts SSH estão atrás de um firewall NAT e acessados ​​de fora, todos eles parecem ter o mesmo IP.
precisa saber é o seguinte

Respostas:

12

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

jjlin
fonte
Eu preferiria uma versão do cliente, mas tentarei se não encontrar uma. A propósito, a localização OSX (não padrão) dos arquivos /private/etc/ssh_host*não é /etc/ssh/ssh_host*.
Frédéric Grosshans
Copiar os arquivos de uma máquina para outra (duas máquinas Linux) não funcionou para mim. Embora o conteúdo do arquivo fosse idêntico, o hash não era, e eu ainda estava tendo o problema (talvez o horário da modificação?). A solução abaixo é muito melhor.
Stav
sshdcarrega as chaves do host uma vez na inicialização, portanto, você provavelmente precisará reiniciar sshd. Vou acrescentar isso à resposta. Quanto a outras soluções serem melhores, isso depende da sua situação. Eu argumentaria que os principais profissionais desse método são que ele requer apenas uma configuração única e é mais provável que funcione com várias implementações de clientes SSH.
Jjlin 5/17
Curiosamente, parece que o meu relativamente recente OpenSSH 7.4p1 sshdcarrega chaves de host em cada nova conexão. Talvez tenha sido assim há muito tempo e eu apenas assumi que as chaves do host foram tratadas como outra sshdconfiguração. Enfim, isso pode ou não ser o seu problema.
Jjlin #
Seria uma má idéia fazer isso com dois hosts em um cluster que compartilham o mesmo endereço VRRP? No failover, o host que responder será diferente. Eu gostaria de não receber o aviso.
Colin 't Hart
26

Como o @Izzy sugeriu em um comentário acima, o ssh informa a linha incorreta e, removendo-a (salvando-a em outro lugar), aceitando a nova chave e copiando a linha removida, você termina com duas chaves para a mesma host e o ssh aceitará qualquer um.

(Você também pode usar ssh-keygen -H -F <hostname>para encontrar linhas no arquivo known_hosts que correspondam a esse nome de host. A execução após copiar a linha removida de volta deve listar duas entradas.)

Se alguém souber como fazer o PuTTY fazer a mesma coisa, eu ficaria muito interessado em ouvir sobre isso.

DaCheetah
fonte
4
Na verdade, se você possui um cliente linux, nem precisa remover a linha ofensiva, basta comentar com um caractere de hash ('#') na frente. Depois de aceitar a nova chave, você pode editar o arquivo known_hosts e descomentar a linha da chave antiga. Mas sim, isso também seria útil em Putty.
precisa saber é o seguinte
1
Se houver dois hosts com o mesmo nome, mas um endereço IP diferente e uma chave de host diferente, esta solução alternativa também funcionará: Comente (ou exclua temporariamente) as duas linhas desse host (a que se baseia no endereço IP e a que se baseia no host) nome), conecte-se ao host ainda não conhecido e adicione novamente as linhas que foram comentadas ou excluídas.
Kai Petzke
13

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

Fonte: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Crie um arquivo de configuração no diretório .ssh da seguinte maneira:

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

Explicação abaixo (de man ssh_config)

CheckHostIP

Se esse sinalizador estiver definido como "yes", o ssh (1) verificará adicionalmente o endereço IP do host no arquivo known_hosts. Isso permite que o ssh detecte se uma chave de host foi alterada devido à falsificação de DNS. Se a opção estiver definida como "não", a verificação não será executada. O padrão é "yes".

HostKeyAlias

Especifica um alias que deve ser usado em vez do nome do host real ao procurar ou salvar a chave do host nos arquivos de banco de dados de chaves do host. Essa opção é útil para encapsular conexões SSH ou para vários servidores em execução em um único host.

A linha Nome de usuário e Porta evita que você também precise fornecer essas opções na linha de comando, para que você possa usar:

% ssh server1
% ssh server2
Rhyuk
fonte
Eu vi esse artigo, mas ele não corresponde ao meu caso: os dois servidores são diferenciados pelo número da porta no artigo, não no meu caso. Além disso, eu gostaria de manter as camadas extras de segurança trazidas pelos hashes salgados em known_hostse CheckHostIP.
Frédéric Grosshans
1
@ FrédéricGrosshans, verifico. Você não precisa ter portas separadas, e a opção HashKnownHosts funciona bem com o HostKeyAlias.
Zoredache
O lado negativo disso, a menos que eu esteja errado, isso é configurado por cliente versus a resposta aceita é configurada apenas nos servidores ssh que aceitam.
FreeSoftwareServers
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 na 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 obteriam o mesmo endereço). Não vejo outra solução se você quiser manter as medidas de segurança (que eu também não deixaria de lado por esse pequeno "conforto").

Izzy
fonte
Na verdade, o endereço IP não 192.168.0.xxé e não é privado. É um endereço IPv4 'real', fornecido pela minha universidade, que não tenho a liberdade de alterar.
Frédéric Grosshans
Se você consultar a Wikipedia , verá 192.168.0.0 - 192.168.255.255 (sua pergunta foi especificada 192.168.0.9, que se enquadra nesse intervalo) pertence aos "espaços de endereço IPv4 privados". Então, por "privado", não me referi a você "o ​​dono", mas às especificações da IETF . Na sua pergunta, você não indicou que não pode alterar o IP, desculpe - mas com a entrada fornecida, minha resposta foi adequada.
Izzy
Desculpe pela pergunta mal formulada. Eu não voto negativo.
Frédéric Grosshans
Sem problemas e tnx por me informar - tornam o voto negativo menos desanimador. Mas outra idéia: não tenho certeza de onde o arquivo known_hosts retira o nome do host, inverte o DNS ou é oferecido pelo cliente. Você pode tentar renomear um dos seus "hosts" para que ele apresente um nome de host diferente. Ou para adicionar as duas chaves do host: ssh informa a "linha ofensiva" em seu arquivo known_hosts (quando o número 1 estiver contido e você se conectar ao número 2). Assim, você pode copiar essa linha para outro arquivo, removê-la de known_hosts, deixar o nº 2 conectar e adicionar sua linha e adicionar a linha removida de volta. Não tenho certeza se funciona, mas você pode tentar.
Izzy
2

Não encontro esse problema ao conectar-me a várias caixas VPS que compartilham o mesmo IP, pois cada uma possui uma porta SSH diferente (20022,30022, etc), portanto, elas são registradas como hosts conhecidos com chaves diferentes.

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

Pyheme
fonte
Olá @Pyheme, seja bem-vindo ao Super Usuário! Observe que esta pergunta tem quase 4 anos. Não há nada de errado em responder, mas lembre-se de que é possível que você não obtenha uma resposta.
Hewbot
Não tenho mais nenhuma máquina OS X, mas sua resposta pode ser útil para outra pessoa. Esse é o ponto de troca de pilha
Frédéric Grosshans
@ Hewbot ... na verdade, eu vejo isso agora. Não sei porque, ele apareceu na lista de perguntas recentes ...
Pyheme
1

Outro artigo , que descreve várias maneiras de lidar com seu problema:

O segundo método usa dois parâmetros openSSH:, StrictHostKeyCheckine UserKnownHostsFile. Esse método engana o SSH, configurando-o para usar um arquivo known_hosts vazio e NÃO para solicitar a confirmação da chave de identidade do host remoto.

afk
fonte
Este artigo trata da proibição da verificação de chaves. Quero manter a verificação de chave e não quero desabilitá-la sempre que hostnamefor reinicializada no Linut ou OSX
Frédéric Grosshans
1
Bem-vindo ao Super Usuário! Embora isso possa teoricamente responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência. Eu incluí uma parte pequena, mas pode não ser o que você queria ...
Tamara Wijsman
1

Como você deseja manter a verificação estrita da chave do host, gostaria que eles usassem known_hostsarquivos diferentes . Para fazer isso, configure seu ~/.ssh/configarquivo (ou o /etc/ssh/ssh_configarquivo, se necessário, para que ele funcione em várias contas de usuário local) 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 $REALHOSTNAMEpelo nome do host ou endereço IP real, é claro. (Não importa qual você escolher, contanto que você escolha algo após "Hostname" que resolveria o endereço IP, mas eu usaria o nome do host em preferência a um endereço IP, apenas por princípios gerais.)

Em seguida, ssh myserver.linuxe ssh myserver.osxpode, assim, ter chaves de host diferentes, mas você ainda obter a verificação. Se for o Linux instalado e você digitar o OS X (ou vice-versa), receberá o aviso (que acredito ser o efeito desejado).

Se eu tivesse esse problema, garantiria que houvesse algo completamente errado no known_hostsarquivo principal que não corresponda a nenhum dos dois, portanto, se você digitar em $REALHOSTNAMEvez de myserver.osxreceber o aviso. :-) eu faria isso colocando algo como

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

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

Jim
fonte