Jak dodać zakres adresów IP do znanych hostów?

15

Wiele usług (takich jak GitHub) używa szerokiej gamy adresów IP i oczywiście tego samego klucza publicznego.

Jak mogę dodać zakres adresów IP (najlepiej w jednym) do pliku znanego_hosta?

W przykładzie GitHub używa następujących zakresów:

  • 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

Kluczem jest:

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

RSFalcon7
źródło
1
te adresy IP są tutaj
RSFalcon7

Odpowiedzi:

11

Jak zauważono w innych odpowiedziach, znane_hosty nie obsługują zakresów adresów IP. Obsługuje jednak symbole wieloznaczne. Oczywiście symbole wieloznaczne to nie to samo, więc musisz bardzo uważać na to, jak używasz ich w adresach IP, ale w konkretnym przypadku Github można to zrobić bezpiecznie.

Wydaje się, że sytuacja stała się prostsza od momentu zadania pytania. Według oficjalnej dokumentacji Github używany jest tylko jeden zakres adresów IP (przynajmniej jeśli chodzi o IPv4). Jest to zakres 192.30.252.0/22. To daje 1020 możliwych adresów IP, które dogodnie obejmują cały możliwy zakres ostatniego oktetu w zaledwie czterech różnych blokach C.

Od man 8 sshdtego musimy współpracować w znanych_hostach:

Nazwy hostów to rozdzielona przecinkami lista wzorców ( *' and? 'Działają jak symbole wieloznaczne); każdy wzorzec z kolei jest dopasowywany do kanonicznej nazwy hosta (podczas uwierzytelniania klienta) lub do nazwy podanej przez użytkownika (podczas uwierzytelniania serwera). Wzorzec może być również poprzedzony !' 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['i ]' brackets then followed by:' oraz niestandardowym numerem portu.

Korzystając z tych informacji, możemy skonstruować wpis z użyciem symbolu wieloznacznego * dla ostatniego oktetu, który pasuje do wszystkich możliwych punktów końcowych Github (i TYLKO tych punktów końcowych), w taki sposób:

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

Jeśli zakres IP, który musiałeś skonstruować, nie wypełniał pełnego bloku C, a zatem wszystkich możliwych wartości dla oktetu, nie byłoby możliwe użycie symboli wieloznacznych dla tak dokładnego dopasowania.

Caleb
źródło
8

Nie sądzę, że można łatwo dodawać zakresy, ale myślę (nie mogę teraz tego przetestować), że ten sam efekt można osiągnąć, dodając do .ssh / ssh_config:

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

Następnie dodasz klucz do pliku znane_hosty pod nazwą github-server-pool.github.com.

Założenie: host github-server-pool.github.com nie istnieje lub nigdy nie jest podłączony przez SSH.

Chodzi o to, że ssh użyje klucza github-server-pool.github.com jako klucza do wyszukiwania klucza publicznego hosta dla wszystkich hostów domeny github.com.

Vincent De Baere
źródło
To świetna odpowiedź i łatwiejsza niż oryginał.
kael
4

known_hostsPlik nie obsługuje zestawów adresów IP . Będziesz musiał mieć jedną linię na adres.

Chociaż część wpisów dotyczących nazwy hosta jest domyślnie zakodowana, służy to tylko prywatności, aby ktoś, kto ją .known_hostsprzejmie, nie byłby w stanie łatwo dowiedzieć się, z którymi hostami się łączysz. (Nadal mogą weryfikować domysły.) Możesz użyć zwykłej nazwy hosta lub adresu 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

Pamiętaj, że może to dodawać duplikaty.

Gilles „SO- przestań być zły”
źródło
naprawiono, ale działa tylko dla sieci do 0.0.0.0/24
RSFalcon7 14.10.13
@ RSFalcon7 Rzeczywiście. Arytmetyka adresu IP jest denerwująca. Zrobiłem szybkie i brudne obejście ... Jeśli potrzebujesz obsługi większych sieci, przekonwertuj adres IP na 32-bitowy numer przed wykonaniem wyliczenia.
Gilles „SO- przestań być zły”
0

Wydaje się, że SSH nie ma pojęcia o zakresach adresów IP dla znanych hostów. Myślę, że założenie jest takie, że każdy host miałby unikalny klucz ze względów bezpieczeństwa.

Dwa sposoby, w jaki mogę wstępnie wypełnić twoje znane hosty:

  1. ssh-keyscan- Napisz krótki skrypt, aby iterować po wszystkich tych adresach i albo podaj go, ssh-keyscanalbo plik ssh-keyscando przeczytania. ssh-keyscanmoże skanować wiele hostów na każde wywołanie, albo poprzez podanie w jednym wierszu, albo przez podanie listy hostów.

  2. Wypełnij known_hostssię skryptem lub edytorem. Format jest dość prosty, jeśli używasz wersji nieszyfrowanej. To jest:

    nazwa hosta, adres IP klucz klucza ssh

hostnameto nazwa hosta, z którym się kontaktujesz, i byłaby taka sama dla wszystkich adresów GitHub. IP addressbyłoby to, przez co iterowałby skrypt. keyto klucz, który podałeś powyżej.

Żadne nie jest eleganckie, ale myślę, że ludzie SSH założyli, że nikt nie zrobiłby tego, co robi GitHub.

kurtm
źródło
Nikt nie powinien robić tego, co robi github. Jest to klucz hosta, a nie klucz „grupy podobnych hostów”.
@ WumpusQ.Wumbley Zgadzam się. Ale wątpię, aby GitHub zmienił moje zdanie.
kurtm
0

Cześć Znalazłem skrypt od Gillesa całkiem przydatny, ale praca tylko dla sieci 0.0.0.0/24była ograniczeniem, rozszerzyłem skrypt do pracy z większymi sieciami, 0.0.0.0/16być może przyda się komuś innemu.

#!/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
źródło