Come modificare gli host noti quando più host condividono lo stesso nome IP e DNS?


28

Ssh regolarmente in un computer che è un computer OS X / Linux a doppio avvio. Le due istanze del sistema operativo non condividono la stessa chiave host, quindi possono essere viste come due host che condividono lo stesso IP e DNS. Diciamo che l'IP è 192.168.0.9e i nomi sono hostnameehostname.domainname

Per quanto ho capito, la soluzione per essere in grado di connettersi ai due host è di aggiungerli entrambi al ~/.ssh/know_hostsfile. Tuttavia, è più facile a dirsi che a farsi, perché il file è hash, e ha probabilmente diverse voci per host ( 192.168.0.9, hostname, hostname.domainname). Di conseguenza, ho il seguente avvertimento

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

C'è un modo semplice per modificare il known_hostsfile, mantenendo gli hash. Ad esempio, come posso trovare le righe corrispondenti a un determinato hostame? Come posso generare gli hash per alcuni host conosciuti?

La soluzione ideale mi consentirebbe di connettermi perfettamente a questo computer con ssh, indipendentemente dal fatto che io lo chiami 192.168.0.9, hostnameo hostname.domainname, se non usa la sua hostkey Linux o la sua hostkey OSX. Tuttavia, desidero comunque ricevere un avviso se esiste un vero attacco intermedio, ovvero se viene utilizzata una chiave diversa da queste due.


Cosa vuoi fare? Modificarlo per cosa?
Rhyuk,

@Rhyuk: modificalo per poter riconoscere come validi sia la chiave host OSX che quella Linux per l'indirizzo IP, il nome host e il nome host.dominio.
Frédéric Grosshans,

@Rhyuk: ho modificato la domanda. Adesso è più chiaro?
Frédéric Grosshans,

2
Hai semplicemente considerato di fare in modo che entrambe le installazioni abbiano la stessa chiave?
Zoredache,

3
Vi sono alcuni casi in cui è ragionevole utilizzare un indirizzo IP per accedere a più entità (ognuna con le singole chiavi host SSH) e mantenere comunque un controllo rigoroso sul fatto che SOLO quelle chiavi host sono quelle visualizzate dal client SSH. Ad esempio alcune configurazioni ad alta disponibilità in cui si accede a un cluster di unità utilizzando un indirizzo IP condiviso ma in cui (per qualche motivo) la chiave host SSH vista dai client cambia in base all'unità cluster attualmente attiva. Un altro caso è quando più host SSH si trovano dietro un firewall NAT e accedono dall'esterno, sembreranno tutti avere lo stesso IP.
IllvilJa

Risposte:


12

La soluzione più semplice qui è solo usare le stesse chiavi host per Linux e OS X. Cioè, selezionare un set di /etc/ssh/ssh_host_*_key*file e copiarli sull'altro sistema operativo. Quindi la stessa chiave host verrà presentata a un client SSH indipendentemente dal sistema operativo in cui è stato avviato e il client SSH non sarà il più saggio.


Preferirei una versione client, ma proverò questa se non la trovo. A proposito, la localizzazione OSX (non standard) dei file /private/etc/ssh_host*non lo è /etc/ssh/ssh_host*.
Frédéric Grosshans,

Copiare i file da una macchina all'altra (due macchine linux) non ha funzionato per me. Sebbene il contenuto del file fosse identico, l'hash non lo era, quindi stavo ancora riscontrando il problema (forse il tempo di modifica?). La soluzione di seguito è molto migliore.
Stav,

sshdcarica le chiavi host una volta all'avvio, quindi molto probabilmente dovrai riavviare sshd. Lo aggiungerò alla risposta. Per quanto riguarda altre soluzioni, dipende dalla tua situazione. Direi che i principali vantaggi di questo metodo è che richiede una sola configurazione ed è più probabile che funzioni con più implementazioni client SSH.
jjlin,

Curiosamente, sembra che il mio OpenSSH 7.4p1 relativamente recente sshdcarichi le chiavi host su ogni nuova connessione. Forse è stato così da molto tempo e ho appena pensato che le chiavi host fossero trattate come altre sshdconfigurazioni. Quindi comunque, questo potrebbe essere o meno il tuo problema.
jjlin,

Sarebbe una cattiva idea fare questo a due host in un cluster che condividono lo stesso indirizzo VRRP? In caso di failover, l'host che risponde sarà diverso. Vorrei non ricevere l'avviso.
Colin 't Hart,

26

Come suggerito da @Izzy in un commento sopra, ssh ti dice la linea offensiva e rimuovendo quella linea (salvandola altrove), accettando la nuova chiave e quindi copiando di nuovo la linea rimossa, ti ritrovi con due chiavi per lo stesso host e ssh accetterà entrambi.

(È inoltre possibile utilizzare ssh-keygen -H -F <hostname>per trovare le righe nel file known_hosts che corrispondono a quel nome host. L'esecuzione dopo aver copiato la riga rimossa dovrebbe elencare due voci.)

Se qualcuno sa come fare in modo che PuTTY faccia la stessa cosa, sarei molto interessato a saperlo.


4
In realtà, se hai un client Linux, non hai nemmeno bisogno di rimuovere la linea offensiva, devi solo commentarla con un carattere hash ('#') in primo piano. Quindi, una volta accettata la nuova chiave, è possibile modificare il file known_hosts e rimuovere il commento dalla riga con la vecchia chiave. Ma sì, questo sarebbe utile anche in Putty.
IllvilJa

1
Se sono presenti due host con lo stesso nome, ma indirizzo IP diverso e chiave host diversa, questa soluzione alternativa funziona anche: commentare (o eliminare temporaneamente) quindi entrambe le righe per quell'host (quello basato sull'indirizzo IP e quello basato sull'host nome), connettersi all'host non ancora noto, quindi aggiungere nuovamente le righe che sono state commentate o eliminate.
Kai Petzke,

10

Ho trovato questo che potrebbe aiutarti con ciò che vuoi ottenere.

Fonte: https://stackoverflow.com/questions/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Creare un file di configurazione nella directory .ssh come segue:

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

Spiegazione di seguito (da man ssh_config)

CheckHostIP

Se questo flag è impostato su "yes", ssh (1) verificherà inoltre l'indirizzo IP dell'host nel file known_hosts. Ciò consente a ssh di rilevare se una chiave host è cambiata a causa dello spoofing DNS. Se l'opzione è impostata su "no", il controllo non verrà eseguito. L'impostazione predefinita è "sì".

HostKeyAlias

Specifica un alias che deve essere utilizzato al posto del nome host reale quando si cerca o si salva la chiave host nei file del database delle chiavi host. Questa opzione è utile per il tunneling delle connessioni SSH o per più server in esecuzione su un singolo host.

Il nome utente e la linea di porta evitano di dover fornire anche quelle opzioni sulla riga di comando, quindi puoi semplicemente usare:

% ssh server1
% ssh server2

Ho visto questo articolo, ma non corrisponde al mio caso: i due server si distinguono per il numero di porta nell'articolo, non nel mio caso. Inoltre, vorrei mantenere gli strati extra di sicurezza introdotti dagli hash salati known_hostse CheckHostIP.
Frédéric Grosshans,

1
@ FrédéricGrosshans, controllo controllato. Non è necessario disporre di porte separate e l'opzione HashKnownHosts funziona perfettamente con HostKeyAlias.
Zoredache,

Il rovescio della medaglia a questo, a meno che non sia sbagliato, questo è configurato su una base per client vs la risposta accettata è configurata solo sui server ssh accettanti.
FreeSoftwareServers dal

2

Il modo più semplice per risolvere il problema è assegnare a ciascun host un indirizzo IP proprio / distinto. Con 253 indirizzi disponibili nella tua rete (privata) e IPv4, questo non dovrebbe essere un grosso problema. Assegna loro IP fissi (poiché un server DHCP identificherebbe la macchina in base all'indirizzo MAC delle schede di rete ed entrambi otterrebbero lo stesso indirizzo). Non vedo nessun'altra soluzione se vuoi mantenere le misure di sicurezza (che non abbandonerei nemmeno per quel piccolo "conforto").


In realtà, l'indirizzo IP non 192.168.0.xxè e non è privato. È un indirizzo IPv4 "reale", dato dalla mia università che non sono libero di cambiare.
Frédéric Grosshans,

Se controlli con Wikipedia , vedrai 192.168.0.0 - 192.168.255.255 (la tua domanda ha specificato 192.168.0.9, che rientra in questo intervallo) appartiene agli "spazi di indirizzi IPv4 privati". Quindi, per "privato" non mi riferivo a te "proprietario", ma alle specifiche della IETF . Nella tua domanda non hai indicato che non puoi cambiare l'IP, scusa - ma con l'input fornito, la mia risposta è stata adatta.
Izzy,

Ci scusiamo per la domanda mal formulata. Non ho votato a fondo.
Frédéric Grosshans,

Nessun problema, e grazie per avermi fatto sapere - rende il downvote meno scoraggiante. Ma un'altra idea: non sono sicuro da dove il file known_hosts prende il nome host, DNS inverso o offerto dal client. Potresti provare a rinominare uno dei tuoi "host" in modo che presenti un nome host diverso. Oppure per avere entrambe le chiavi host aggiunte: ssh ti dice la "linea offensiva" nel tuo file known_hosts (quando il numero 1 è contenuto e ti connetti con il numero 2). Quindi puoi quindi copiare quella linea in un altro file, rimuoverlo da known_hosts, lasciare che # 2 si connetta e aggiungere la sua linea e aggiungere nuovamente la linea rimossa. Non sono sicuro che funzioni, ma puoi provare.
Izzy,

2

Non ho riscontrato questo problema quando mi collego a varie scatole VPS che condividono lo stesso IP perché ognuna ha una porta SSH diversa (20022,30022, ecc.), Quindi sono registrate come host noti con chiavi diverse.

Potrebbe essere una soluzione alternativa per te?


Ciao @Pyheme, benvenuto in Super User! Si noti che questa domanda ha quasi 4 anni. Non c'è niente di sbagliato nel rispondere, ma tieni presente che è possibile che tu non abbia una risposta.
Hewbot

Non ho più alcuna macchina OS X, ma la tua risposta potrebbe essere utile per qualcun altro. Questo è il punto centrale dello scambio di stack
Frédéric Grosshans,

@Hewbot ... anzi, lo vedo ora. Non so perché, è apparso nell'elenco delle domande recenti ...
Pyheme,

1

Un altro articolo , che descrive diversi modi per gestire il problema:

Il secondo metodo utilizza due parametri openSSH:, StrictHostKeyCheckine UserKnownHostsFile. Questo metodo inganna SSH configurandolo per l'utilizzo di un file known_hosts vuoto e NON per chiedere di confermare la chiave di identità dell'host remoto.


Questo documento tratta di non consentire il controllo delle chiavi. Voglio mantenere il controllo delle chiavi e non voglio hostnamevietarlo ogni volta che viene riavviato in Linut o OSX
Frédéric Grosshans,

1
Benvenuto in Super User! Sebbene ciò possa teoricamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il collegamento come riferimento. Ho incluso una parte breve, ma potrebbe non essere quello che volevi ...
Tamara Wijsman,

1

Dato che vuoi mantenere il controllo rigoroso della chiave host, vorrei che usassero known_hostsfile diversi . Per fare ciò, imposta il tuo ~/.ssh/configfile (o il /etc/ssh/ssh_configfile se ne hai bisogno per lavorare su più account utente locali) in questo modo:

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

, sostituendo $REALHOSTNAMEcon il nome host o l'indirizzo IP effettivo, ovviamente. (Non importa quale si sceglie, purché si scelga qualcosa dopo "Nome host" che si risolva nell'indirizzo IP, ma utilizzerei il nome host preferibilmente a un indirizzo IP, solo su principi generali.)

Quindi ssh myserver.linuxe ssh myserver.osxpuò quindi avere diverse chiavi host, ma ottieni comunque il controllo. Se è Linux che funziona e digiti OS X (o viceversa), riceverai l'avvertimento (che credo sia l'effetto desiderato).

Se avessi questo problema, mi assicurerei che ci fosse qualcosa di completamente sbagliato nel known_hostsfile principale che non corrisponde a nessuno dei due, in modo che se si digita $REALHOSTNAMEinvece di myserver.osxricevere l'avviso. :-) Lo farei mettendo qualcosa di simile

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

nel mio /etc/hosts, quindi fare un ssh $REALHOSTNAMEe accettare la nuova chiave, quindi prendere quella voce.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.