¿Cómo agregar un rango de ip a known_hosts?

15

Muchos servicios (como GitHub) utilizan una amplia gama de IP y, obviamente, la misma clave pública.

¿Cómo puedo agregar un rango de IP (preferiblemente en un solo) al archivo known_hosts?

Para el ejemplo de GitHub, utiliza los siguientes rangos:

  • 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

Y la clave es:

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

RSFalcon7
fuente
1
esas IP son completamente públicas aquí
RSFalcon7

Respuestas:

11

Como se señaló en otras respuestas, known_hosts no tiene soporte para rangos de direcciones IP. Sin embargo, admite comodines. Por supuesto, los comodines no son exactamente lo mismo, por lo que debe tener mucho cuidado con la forma en que los usa en las direcciones IP, pero en el caso particular de Github, esto se puede hacer de manera segura.

La situación parece haberse vuelto más simple desde que se hizo la pregunta. Según la documentación oficial de Github, solo se utiliza un rango de direcciones IP (al menos en lo que respecta a IPv4). Este es el rango 192.30.252.0/22. Eso hace 1020 posibles direcciones IP que abarcan convenientemente todo el rango posible para el último octeto en solo cuatro bloques C diferentes.

De man 8 sshd, esto es con lo que tenemos que trabajar en known_hosts:

Hostnames es una lista de patrones separados por comas ( *' and? 'Actúan como comodines); cada patrón a su vez se compara con el nombre de host canónico (al autenticar un cliente) o con el nombre proporcionado por el usuario (al autenticar un servidor). Un patrón también puede estar precedido por !' 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['y ]' brackets then followed by:' y un número de puerto no estándar.

Usando esta información, podemos construir una entrada usando el comodín * para el último octeto que coincida con todos los puntos finales posibles de Github (y SOLO esos puntos finales) de esta manera:

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 el rango de IP que necesita construir no llenó un bloque C completo y, por lo tanto, todos los valores posibles para un octeto, sería imposible usar comodines para una coincidencia tan precisa.

Caleb
fuente
8

No creo que pueda agregar fácilmente los rangos, pero creo (no puedo probar esto en este momento) que se puede lograr el mismo efecto agregando lo siguiente a .ssh / ssh_config:

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

A continuación, agregaría la clave al archivo known_hosts con el nombre github-server-pool.github.com.

Supuesto: el host github-server-pool.github.com no existe o nunca está conectado a través de SSH.

La idea detrás de esto es que ssh usará la clave github-server-pool.github.com como la clave para buscar la clave de host pública para todos los hosts del dominio github.com.

Vincent De Baere
fuente
Esta es una gran respuesta, y más fácil que la original.
kael
4

No hay soporte para conjuntos de direcciones IP en el known_hostsarchivo. Tendrás que tener una línea por dirección.

Aunque la parte del nombre de host de las entradas está en hash de forma predeterminada, esto es solo por privacidad para que alguien que se apodere de usted .known_hostsno pueda descubrir fácilmente a qué hosts se ha conectado. (Todavía pueden verificar las suposiciones). Puede usar un nombre de host o una dirección 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

Tenga en cuenta que esto puede agregar duplicados.

Gilles 'SO- deja de ser malvado'
fuente
fijo, pero solo funciona para redes hasta 0.0.0.0/24
RSFalcon7
@ RSFalcon7 De hecho. La aritmética de la dirección IP es molesta. Hice una solución rápida y sucia ... Si necesita soporte para redes más grandes, convierta la dirección IP a un número de 32 bits antes de hacer la enumeración.
Gilles 'SO- deja de ser malvado'
0

SSH parece no tener un concepto de rangos de IP para los hosts conocidos. Creo que se supone que cada host tendría una clave única por razones de seguridad.

Puedo ver dos formas de rellenar previamente sus hosts_conocidos:

  1. ssh-keyscan- Escriba una secuencia de comandos breve para iterar a través de todas esas direcciones y alimentarla ssh-keyscano un archivo para ssh-keyscanleer. ssh-keyscanpuede escanear múltiples hosts por invocación, ya sea especificando en una línea o especificando una lista de los hosts.

  2. Poblar known_hosts con un guión o editor. El formato es bastante simple si usa la versión sin hash. Es:

    nombre de host, dirección IP ssh-keytype key

hostname es el nombre de host con el que contacta, y sería el mismo para todas las direcciones de GitHub. IP addresssería lo que un guión iteraría. keyes la clave que proporcionó anteriormente.

Tampoco es elegante, pero creo que la gente de SSH asumió que nadie haría lo que GitHub está haciendo.

kurtm
fuente
Nadie debería estar haciendo lo que Github está haciendo. Es una clave de host, no una clave de "grupo de hosts similares".
@ WumpusQ.Wumbley estoy de acuerdo. Pero dudo que GitHub cambie mi opinión.
kurtm
0

Hola, encontré que el script de Gilles era bastante útil, pero solo trabajar para redes 0.0.0.0/24era una limitación, extendí el script para que funcione con redes más grandes hasta que 0.0.0.0/16quizás sea útil para otra persona.

#!/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
fuente