Come aggiungere un intervallo ip a known_hosts?


15

Molti servizi (come GitHub) utilizzano una vasta gamma di IP, e ovviamente la stessa chiave pubblica.

Come posso aggiungere un intervallo IP (preferibilmente in un singolo) al file known_hosts?

Per l'esempio di GitHub, utilizza i seguenti intervalli:

  • 207.97.227.224/27
  • 173.203.140.192/27
  • 204.232.175.64/27
  • 72.4.117.96/27
  • 192.30.252.0/22

E la chiave è:

AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa + PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31 / YMF + Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB + weqqUUmpaaasXVal72J + UX2B + 2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi / w4yCE6gbODqnTWlg7 + wC604ydGXA8VJiS5ap43JXiUFFAaQ ==


1
questi IP sono completamente pubblici qui
RSFalcon7

Risposte:


11

Come notato in altre risposte, known_hosts non supporta gli intervalli di indirizzi IP. Tuttavia, supporta i caratteri jolly. Naturalmente i caratteri jolly non sono la stessa cosa, quindi devi stare molto attento a come li usi negli indirizzi IP, ma nel caso particolare di Github questo può essere fatto in modo sicuro.

La situazione sembra essere diventata più semplice da quando è stata posta la domanda. Secondo la documentazione ufficiale di Github esiste solo un intervallo di indirizzi IP in uso (almeno per quanto riguarda IPv4). Questa è la gamma 192.30.252.0/22. Ciò rende possibili 1020 indirizzi IP che coprono comodamente l'intero intervallo possibile per l'ultimo ottetto in soli quattro diversi blocchi C.

Da man 8 sshd, questo è ciò con cui dobbiamo lavorare in known_hosts:

I nomi host sono un elenco separato da virgole di modelli ( *' and? 'Fungono da caratteri jolly); ogni modello a sua volta viene confrontato con il nome host canonico (durante l'autenticazione di un client) o con il nome fornito dall'utente (durante l'autenticazione di un server). Un modello può anche essere preceduto da !' to indicate negation: if the host name matches a negated pattern, it is not accepted (by that line) even if it matched another pattern on the line. A hostname or address may optionally be enclosed within['e ]' brackets then followed by:' e un numero di porta non standard.

Usando queste informazioni, possiamo costruire una voce usando il carattere jolly * per l'ultimo ottetto che corrisponde a tutti i possibili endpoint Github (e SOLO quegli endpoint) in questo modo:

github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

Se l'intervallo IP necessario per costruire non riempisse un blocco C completo e quindi tutti i possibili valori per un ottetto, sarebbe impossibile usare i caratteri jolly per una corrispondenza così accurata.


8

Non penso che puoi facilmente aggiungere gli intervalli, ma penso (non posso provarlo adesso) che lo stesso effetto può essere ottenuto aggiungendo quanto segue a .ssh / ssh_config:

Host *.github.com
HostKeyAlias github-server-pool.github.com

Successivamente, aggiungere la chiave al file known_hosts sotto il nome github-server-pool.github.com.

Presupposto: l'host github-server-pool.github.com non esiste o non è mai collegato tramite SSH.

L'idea alla base è che ssh utilizzerà la chiave github-server-pool.github.com come chiave per cercare la chiave host pubblica per tutti gli host del dominio github.com.


Questa è un'ottima risposta e più semplice dell'originale.
Kael,

4

Non esiste supporto per i set di indirizzi IP nel known_hostsfile. Dovrai avere una riga per indirizzo.

Sebbene la parte del nome host delle voci sia sottoposta a hash di default, questo è solo per la privacy in modo tale che qualcuno che si impossesserà della tua .known_hostsnon sia in grado di scoprire facilmente a quali host ti stai collegando. (Possono ancora verificare ipotesi.) È possibile utilizzare un semplice nome host o indirizzo IP.

for net in 207.97.227.224/27 173.203.140.192/27 204.232.175.64/27 72.4.117.96/27 192.30.252.0/24 192.30.252.1/24 192.30.252.2/24 192.30.252.3/24; do
  base=${net%/*}; d=${base##*.}; abc=${base%.*}
  bits=$((32 - ${net#*/}))
  e=0
  while [ $e -lt $((2 ** bits) ]; do
    echo "$abc.$((d + e)) ssh-rsa AAAAB3NzaC1yc…" >>~/.ssh/known_hosts
    e=$((e + 1))
  done
done

Si noti che ciò può aggiungere duplicati.


risolto, ma funzionante solo per reti fino a 0.0.0.0/24
RSFalcon7

@ RSFalcon7 Effettivamente. L'aritmetica dell'indirizzo IP è fastidiosa. Ho fatto una soluzione rapida e sporca ... Se hai bisogno di supporto per reti più grandi, converti l'indirizzo IP in un numero a 32 bit prima di eseguire l'enumerazione.
Gilles 'SO- smetti di essere malvagio' il

0

SSH sembra non avere alcun concetto di intervalli IP per known_hosts. Penso che il presupposto sia che ogni host avrebbe una chiave unica per motivi di sicurezza.

Due modi che posso vedere per precompilare i tuoi known_hosts:

  1. ssh-keyscan- Scrivere un breve script per scorrere tutti quegli indirizzi e inviarlo ssh-keyscano un file ssh-keyscanda leggere. ssh-keyscanpuò eseguire la scansione di più host per invocazione, specificando su una riga o specificando un elenco di host.

  2. Popolati known_hostscon uno script o un editor. Il formato è abbastanza semplice se si utilizza la versione senza hash. È:

    nome host, indirizzo IP chiave ssh-keytype

hostnameè il nome host che contatti e sarebbe lo stesso per tutti gli indirizzi GitHub. IP addresssarebbe ciò che una sceneggiatura avrebbe ripetuto. keyè la chiave che hai fornito sopra.

Né è elegante, ma penso che la gente di SSH abbia pensato che nessuno avrebbe fatto quello che GitHub stava facendo.


Nessuno dovrebbe fare quello che sta facendo Github. È una chiave host, non una chiave "gruppo di host simili".

@ WumpusQ.Wumbley sono d'accordo. Ma dubito che GitHub cambierà sulla mia opinione.
Kurtm,

0

Ciao, ho trovato la sceneggiatura di Gilles abbastanza utile, ma lavorare solo per le reti fino a questo è 0.0.0.0/24stato un limite, ho esteso la sceneggiatura per lavorare con reti più grandi fino a 0.0.0.0/16forse sarà utile per qualcun altro.

#!/bin/sh
# http://unix.stackexchange.com/questions/94448/how-to-add-an-ip-range-to-known-hosts
# answered Oct 11 '13 at 0:21  Gilles
# only working for networks up to 0.0.0.0/24
# Declan Forde - Increased the range up to 0.0.0.0/16 networks


NETWORKS="127.0.0.0/30 127.0.0.0/29 127.0.0.0/28 127.0.0.0/27 127.0.0.0/26 127.0.0.0/25 127.0.0.0/24 127.0.0.0/23 127.0.0.0/22 127.0.0.0/21 127.0.0.0/16"

for net in ${NETWORKS}
do
  base=${net%/*}
  bits=$((32 - ${net#*/}))

  abc=${base%.*}
  ab=${abc%.*}
  c=${abc##*.}
  d=${base##*.}

  if [ $bits -gt 8 ] && [ $bits -le 16 ]
  then
    netbits=$((bits - 8))
    bits=8
  else
    netbits=0
  fi

  netcount=0
  while [ $netcount -lt $((2 ** netbits)) ]
  do
    count=0
    while [ $count -lt $((2 ** bits)) ]
    do
      echo "$ab.$c.$((d + count))"
      echo "$ab.$c.$((d + count)) ssh-rsa AAAAB3NzaC1yc." >>~/.ssh/known_hosts
    count=$((count + 1))
    done
    netcount=$((netcount + 1))
    c=$((c + 1))
  done
done
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.