Как добавить диапазон ip к известному_хосту?

15

Многие сервисы (например, GitHub) используют широкий диапазон IP-адресов и, очевидно, один и тот же открытый ключ.

Как добавить диапазон IP (желательно один) в файл known_hosts?

Для примера GitHub он использует следующие диапазоны:

  • 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

И ключ это:

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

RSFalcon7
источник
1
этот IP - адрес полностью общественность здесь
RSFalcon7

Ответы:

11

Как отмечено в других ответах, known_hosts не поддерживает диапазоны IP-адресов. Это, однако, поддерживает подстановочные знаки. Конечно, подстановочные знаки не совсем одно и то же, поэтому вам нужно быть очень осторожным с тем, как вы используете их в IP-адресах, но в конкретном случае с Github это можно сделать безопасно.

Ситуация, кажется, стала проще, так как вопрос был задан. Согласно официальной документации Github, используется только один диапазон IP-адресов (по крайней мере, для IPv4). Это диапазон 192.30.252.0/22. Это дает 1020 возможных IP-адресов, которые удобно охватывают весь возможный диапазон для последнего октета всего в четырех различных C-блоках.

От man 8 sshd, это то, с чем мы должны работать в known_hosts:

Имена хостов - это список шаблонов, разделенных запятыми ( *' and? 'Действуют как символы подстановки); каждый шаблон в свою очередь сопоставляется с каноническим именем хоста (при аутентификации клиента) или с предоставленным пользователем именем (при аутентификации сервера). Шаблону также может предшествовать !' 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['и ]' brackets then followed by:' и нестандартный номер порта.

Используя эту информацию, мы можем создать запись с использованием подстановочного знака * для последнего октета, который соответствует всем возможным конечным точкам Github (и ТОЛЬКО этим конечным точкам), следующим образом:

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

Если диапазон IP, который вы должны были построить, не заполнял полный блок C и, следовательно, все возможные значения для октета, было бы невозможно использовать подстановочные знаки для такого точного соответствия.

Калеб
источник
8

Я не думаю, что вы можете легко добавить диапазоны, но я думаю (не могу проверить это прямо сейчас), что тот же эффект может быть достигнут путем добавления следующего в .ssh / ssh_config:

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

Затем вы должны добавить ключ в файл known_hosts под именем github-server-pool.github.com.

Предположение: хост github-server-pool.github.com не существует или никогда не подключается через SSH.

Идея заключается в том, что ssh будет использовать ключ github-server-pool.github.com в качестве ключа для поиска открытого ключа хоста для всех хостов домена github.com.

Винсент Де Баер
источник
Это отличный ответ и проще, чем оригинал.
каэль
4

В known_hostsфайле отсутствует поддержка наборов IP-адресов . Вам придется иметь одну строку на адрес.

Хотя часть имени узла в записях по умолчанию хэшируется, это делается только для конфиденциальности, так что кто-то, кто завладеет вами .known_hosts, не сможет легко узнать, к каким узлам вы подключались. (Они все еще могут проверять догадки.) Вы можете использовать простое имя хоста или 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

Обратите внимание, что это может добавить дубликаты.

Жиль "ТАК - прекрати быть злым"
источник
исправлено, но работает только для сетей до 0.0.0.0/24
RSFalcon7
@ RSFalcon7 Действительно. Арифметика IP-адресов раздражает. Я сделал быстрый и грязный обходной путь ... Если вам нужна поддержка для больших сетей, преобразуйте IP-адрес в 32-разрядное число перед выполнением перечисления.
Жиль "ТАК - перестань быть злым"
0

Похоже, в SSH нет понятия диапазонов IP-адресов для known_hosts. Я думаю, что предполагается, что каждый хост будет иметь уникальный ключ по соображениям безопасности.

Два способа, которыми я могу воспользоваться, чтобы предварительно заполнить ваши известные_хосты:

  1. ssh-keyscan- Напишите краткий сценарий, чтобы перебрать все эти адреса и либо передать его, ssh-keyscanлибо файл для ssh-keyscanчтения. ssh-keyscanможет сканировать несколько хостов за вызов, либо указав в одной строке, либо указав список хостов.

  2. Заполните known_hostsсебя сценарием или редактором. Формат довольно прост, если вы используете версию без хеширования. Это:

    имя хоста, IP-адрес ssh-keytype key

hostnameимя хоста, с которым вы связываетесь, и будет одинаковым для всех адресов GitHub. IP addressбудет то, что скрипт будет проходить через. keyэто ключ, который вы предоставили выше.

Ни один из них не элегантен, но я думаю, что люди из SSH предположили, что никто не будет делать то, что делает GitHub.

kurtm
источник
Никто не должен делать то, что делает Github. Это ключ хоста, а не ключ «группа похожих хостов».
@ WumpusQ.Wumbley Я согласен. Но я сомневаюсь, что GitHub изменится, скажем так.
Куртм
0

Привет, я нашел сценарий от Жиля весьма полезным, но 0.0.0.0/24ограничение работало только до сетей , я расширил сценарий для работы с большими сетями, 0.0.0.0/16возможно, он будет полезен для кого-то еще.

#!/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
Деклан
источник