Comment ajouter une plage d'adresses IP aux hôtes connus?

15

De nombreux services (comme GitHub) utilisent une large gamme d'adresses IP, et évidemment la même clé publique.

Comment puis-je ajouter une plage IP (de préférence en une seule) au fichier known_hosts?

Pour l'exemple GitHub, il utilise les plages suivantes:

  • 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

Et la clé est:

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

RSFalcon7
la source
1
ces adresses IP sont complètement publiques ici
RSFalcon7

Réponses:

11

Comme indiqué dans d'autres réponses, known_hosts ne prend pas en charge les plages d'adresses IP. Il prend cependant en charge les caractères génériques. Bien sûr, les caractères génériques ne sont pas tout à fait la même chose, vous devez donc faire très attention à la façon dont vous les utilisez dans les adresses IP, mais dans le cas particulier de Github, cela peut être fait en toute sécurité.

La situation semble s'être simplifiée depuis la question posée. Selon la documentation officielle de Github, il n'y a qu'une seule plage d'adresses IP utilisée (au moins en ce qui concerne IPv4). Il s'agit de la gamme 192.30.252.0/22. Cela donne 1020 adresses IP possibles qui couvrent commodément toute la plage possible pour le dernier octet en seulement quatre blocs C différents.

À partir de man 8 sshd, c'est ce avec quoi nous devons travailler dans known_hosts:

Les noms d'hôtes sont une liste de modèles séparés par des virgules ( *' and? 'Agissent comme des caractères génériques); chaque modèle à son tour est comparé au nom d'hôte canonique (lors de l'authentification d'un client) ou au nom fourni par l'utilisateur (lors de l'authentification d'un serveur). Un modèle peut également être précédé de !' 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['et ]' brackets then followed by:' et d'un numéro de port non standard.

En utilisant ces informations, nous pouvons construire une entrée en utilisant le caractère générique * pour le dernier octet qui correspond à tous les points d'extrémité Github possibles (et UNIQUEMENT ces points d'extrémité) comme ceci:

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

Si la plage IP que vous deviez construire ne remplissait pas un bloc C complet et donc toutes les valeurs possibles pour un octet, il serait impossible d'utiliser des caractères génériques pour une correspondance aussi précise.

Caleb
la source
8

Je ne pense pas que vous puissiez facilement ajouter les plages, mais je pense (ne peut pas tester cela pour le moment) que le même effet peut être obtenu en ajoutant ce qui suit à .ssh / ssh_config:

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

Ensuite, vous ajouteriez la clé au fichier known_hosts sous le nom github-server-pool.github.com.

Hypothèse: l'hôte github-server-pool.github.com n'existe pas ou n'est jamais connecté via SSH.

L'idée derrière cela est que ssh utilisera la clé github-server-pool.github.com comme clé pour rechercher la clé d'hôte publique pour tous les hôtes du domaine github.com.

Vincent De Baere
la source
C'est une excellente réponse, et plus facile que l'original.
kael
4

Le known_hostsfichier ne prend pas en charge les jeux d'adresses IP . Vous devrez avoir une ligne par adresse.

Bien que la partie du nom d'hôte des entrées soit hachée par défaut, ce n'est que pour la confidentialité afin que quelqu'un qui vous prenne la main .known_hostsne puisse pas facilement savoir à quels hôtes vous vous connectez. (Ils peuvent toujours vérifier les suppositions.) Vous pouvez utiliser un nom d'hôte simple ou une adresse 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

Notez que cela peut ajouter des doublons.

Gilles 'SO- arrête d'être méchant'
la source
fixe, mais ne fonctionne que pour les réseaux jusqu'à 0.0.0.0/24
RSFalcon7
@ RSFalcon7 En effet. L'arithmétique des adresses IP est ennuyeuse. J'ai fait une solution de contournement rapide et sale… Si vous avez besoin de prise en charge pour des réseaux plus importants, convertissez l'adresse IP en un nombre 32 bits avant de procéder à l'énumération.
Gilles 'SO- arrête d'être méchant'
0

SSH ne semble pas avoir de concept de plages IP pour les hôtes connus. Je pense que l'hypothèse est que chaque hôte aurait une clé unique pour des raisons de sécurité.

Je peux voir deux façons de préremplir vos hôtes connus:

  1. ssh-keyscan- Écrivez un bref script pour parcourir toutes ces adresses et alimentez-le ssh-keyscanou un fichier ssh-keyscanà lire. ssh-keyscanpeut analyser plusieurs hôtes par appel, soit en spécifiant sur une ligne ou en spécifiant une liste des hôtes.

  2. Remplissez- known_hostsvous avec un script ou un éditeur. Le format est assez simple si vous utilisez la version non hachée. Il est:

    nom d'hôte, adresse IP clé ssh-keytype

hostnameest le nom d'hôte que vous contactez et serait le même pour toutes les adresses GitHub. IP addressserait ce qu'un script parcourrait. keyest la clé que vous avez fournie ci-dessus.

Ni l'un ni l'autre n'est élégant, mais je pense que les gens de SSH ont supposé que personne ne ferait ce que fait GitHub.

kurtm
la source
Personne ne devrait faire ce que fait github. C'est une clé d'hôte, pas une clé de "groupe d'hôtes similaires".
@ WumpusQ.Wumbley, je suis d'accord. Mais je doute que GitHub changera selon moi.
kurtm
0

Salut, j'ai trouvé le script de Gilles assez utile, mais ne fonctionnant que pour les réseaux jusqu'à 0.0.0.0/24était une limitation, j'ai étendu le script pour travailler avec des réseaux plus importants jusqu'à 0.0.0.0/16peut-être qu'il sera utile pour quelqu'un d'autre.

#!/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
la source