Wie kann ich known_hosts einen IP-Bereich hinzufügen?

15

Viele Dienste (wie GitHub) verwenden eine Vielzahl von IP-Adressen und natürlich denselben öffentlichen Schlüssel.

Wie kann ich der Datei known_hosts einen IP-Bereich (vorzugsweise einen einzelnen) hinzufügen?

Für das GitHub-Beispiel werden die folgenden Bereiche verwendet:

  • 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

Und der Schlüssel ist:

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

RSFalcon7
quelle
1
dieser IPs ist vollständig öffentlich hier
RSFalcon7

Antworten:

11

Wie in anderen Antworten erwähnt, werden IP-Adressbereiche von known_hosts nicht unterstützt. Platzhalter werden jedoch unterstützt. Natürlich sind Wildcards nicht ganz dasselbe. Sie müssen also sehr vorsichtig sein, wie Sie sie in IP-Adressen verwenden, aber im speziellen Fall von Github können Sie dies sicher tun.

Die Situation scheint einfacher geworden zu sein, seitdem die Frage gestellt wurde. Laut der offiziellen Dokumentation von Github wird nur ein IP-Adressbereich verwendet (zumindest was IPv4 betrifft). Dies ist der Bereich 192.30.252.0/22. Das ergibt 1020 mögliche IP-Adressen, die bequemerweise den gesamten möglichen Bereich für das letzte Oktett in nur vier verschiedenen C-Blöcken abdecken.

Ab hier man 8 sshdmüssen wir in known_hosts mit Folgendem arbeiten:

Hostnamen ist eine durch Kommas getrennte Liste von Mustern ( *' and? 'Dienen als Platzhalter); Jedes Muster wird wiederum mit dem kanonischen Hostnamen (bei der Authentifizierung eines Clients) oder mit dem vom Benutzer angegebenen Namen (bei der Authentifizierung eines Servers) abgeglichen. Einem Muster können auch !' 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['und ]' brackets then followed by:' und eine nicht standardmäßige Portnummer vorangestellt werden .

Mit diesen Informationen können wir einen Eintrag mit dem Platzhalter * für das letzte Oktett erstellen, der mit allen möglichen Github-Endpunkten (und NUR diesen Endpunkten) wie folgt übereinstimmt:

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==

Wenn der IP-Bereich, den Sie erstellen mussten, nicht einen vollständigen C-Block und damit alle möglichen Werte für ein Oktett füllen würde, wäre es unmöglich, Platzhalter für eine so genaue Übereinstimmung zu verwenden.

Caleb
quelle
8

Ich glaube nicht, dass Sie die Bereiche einfach hinzufügen können, aber ich glaube (kann dies derzeit nicht testen), dass der gleiche Effekt erzielt werden kann, wenn Sie .ssh / ssh_config Folgendes hinzufügen:

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

Als nächstes würden Sie den Schlüssel zur Datei known_hosts unter dem Namen github-server-pool.github.com hinzufügen.

Annahme: Der Host github-server-pool.github.com existiert nicht oder ist nie über SSH verbunden.

Die Idee dahinter ist, dass ssh den Schlüssel github-server-pool.github.com als Schlüssel verwendet, um den öffentlichen Host-Schlüssel für alle Hosts der Domain github.com zu ermitteln.

Vincent De Baere
quelle
Dies ist eine großartige Antwort und einfacher als das Original.
kael
4

Es gibt keine Unterstützung für IP-Adressensätze in der known_hostsDatei. Sie müssen eine Zeile pro Adresse haben.

Obwohl der Hostnamen-Teil der Einträge standardmäßig mit einem Hash versehen ist, dient dies nur der Privatsphäre, sodass jemand, der Ihre Daten erfasst, .known_hostsnicht ohne Weiteres herausfinden kann, mit welchem ​​Host Sie eine Verbindung hergestellt haben. (Sie können weiterhin Vermutungen überprüfen.) Sie können einen einfachen Hostnamen oder eine IP-Adresse verwenden.

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

Beachten Sie, dass dadurch möglicherweise Duplikate hinzugefügt werden.

Gilles 'SO - hör auf böse zu sein'
quelle
Behoben,
funktioniert
@ RSFalcon7 In der Tat. Die IP-Adressberechnung ist ärgerlich. Ich habe eine schnelle und schmutzige Lösung gefunden. Wenn Sie Unterstützung für größere Netzwerke benötigen, konvertieren Sie die IP-Adresse in eine 32-Bit-Zahl, bevor Sie die Aufzählung durchführen.
Gilles 'SO- hör auf böse zu sein'
0

SSH scheint kein Konzept für IP-Bereiche für known_hosts zu haben. Ich gehe davon aus, dass jeder Host aus Sicherheitsgründen einen eindeutigen Schlüssel hat.

Ich habe zwei Möglichkeiten, um Ihre known_hosts vorab zu füllen:

  1. ssh-keyscan- Schreiben Sie ein kurzes Skript, um alle diese Adressen zu durchlaufen, und geben Sie es entweder in ssh-keyscaneine Datei ssh-keyscanzum Lesen ein. ssh-keyscanSie können mehrere Hosts pro Aufruf scannen, indem Sie entweder eine Zeile oder eine Liste der Hosts angeben.

  2. Füllen known_hostsSie sich mit einem Skript oder Editor. Das Format ist ziemlich einfach, wenn Sie die nicht gehashte Version verwenden. Es ist:

    Hostname, IP-Adresse ssh-keytype Schlüssel

hostnameist der Hostname, den Sie kontaktieren und der für alle GitHub-Adressen gleich ist. IP addresswäre das, was ein Skript durchlaufen würde. keyist der Schlüssel, den Sie oben angegeben haben.

Weder ist elegant, aber ich denke, die SSH-Leute gingen davon aus, dass niemand das tun würde, was GitHub tut.

Kurtm
quelle
Niemand sollte tun, was Github tut. Es ist ein Host-Schlüssel, keine "Gruppe ähnlicher Hosts".
@ WumpusQ.Wumbley da stimme ich zu. Aber ich bezweifle, dass GitHub sich nach meinem Dafürhalten ändern wird.
Kurtm
0

Hallo, ich fand das Skript von Gilles ziemlich nützlich, aber nur für Netzwerke zu arbeiten, 0.0.0.0/24war eine Einschränkung. Ich habe das Skript erweitert, um mit größeren Netzwerken zu arbeiten, bis es 0.0.0.0/16vielleicht für jemand anderen nützlich ist.

#!/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
Declan
quelle