Bagaimana cara menambahkan rentang ip ke known_hosts?

15

Banyak layanan (seperti GitHub) menggunakan berbagai IP, dan jelas kunci publik yang sama.

Bagaimana saya bisa menambahkan rentang IP (sebaiknya dalam satu) ke file known_hosts?

Untuk contoh GitHub, ia menggunakan rentang berikut:

  • 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

Dan kuncinya adalah:

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

RSFalcon7
sumber
1
IP tersebut sepenuhnya publik di sini
RSFalcon7

Jawaban:

11

Seperti dicatat dalam jawaban lain, known_hosts tidak memiliki dukungan untuk rentang alamat IP. Namun, itu mendukung wildcard. Tentu saja wild-card bukan hal yang sama sehingga Anda harus benar-benar berhati-hati tentang bagaimana Anda menggunakannya di alamat IP, tetapi dalam kasus Github tertentu ini dapat dilakukan dengan aman.

Situasi tampaknya menjadi lebih sederhana sejak pertanyaan itu diajukan. Menurut dokumentasi resmi Github, hanya ada satu rentang alamat IP yang digunakan (setidaknya sejauh IPv4 berjalan). Ini adalah kisaran 192.30.252.0/22. Itu membuat 1020 kemungkinan alamat IP yang dengan mudah menjangkau seluruh rentang yang mungkin untuk oktet terakhir hanya dalam empat blok C yang berbeda.

Dari man 8 sshd, inilah yang harus kita kerjakan di known_hosts:

Nama host adalah daftar pola yang dipisahkan koma ( *' and? 'Bertindak sebagai wildcard); setiap pola pada gilirannya dicocokkan dengan nama host kanonik (saat mengautentikasi klien) atau terhadap nama yang disediakan pengguna (saat mengautentikasi server). Suatu pola juga dapat didahului oleh !' 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['dan ]' brackets then followed by:' dan nomor port yang tidak standar.

Menggunakan info ini, kita dapat membuat entri menggunakan * wildcard untuk oktet terakhir yang cocok dengan semua titik akhir Github yang mungkin (dan HANYA titik-titik akhir tersebut) seperti:

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

Jika rentang IP yang Anda butuhkan untuk membangun tidak mengisi blok C penuh dan dengan demikian semua nilai yang mungkin untuk satu oktet, tidak mungkin untuk menggunakan wildcard untuk kecocokan yang akurat.

Caleb
sumber
8

Saya tidak berpikir Anda dapat dengan mudah menambahkan rentang, tapi saya pikir (tidak dapat menguji ini sekarang) bahwa efek yang sama dapat dicapai dengan menambahkan berikut ini ke .ssh / ssh_config:

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

Selanjutnya, Anda akan menambahkan kunci ke file known_hosts di bawah nama github-server-pool.github.com.

Asumsi: host github-server-pool.github.com tidak ada atau tidak pernah terhubung melalui SSH.

Gagasan di baliknya, adalah ssh akan menggunakan kunci github-server-pool.github.com sebagai kunci untuk mencari kunci host publik untuk semua host domain github.com.

Vincent De Baere
sumber
Ini adalah jawaban yang bagus, dan lebih mudah daripada yang asli.
kael
4

Tidak ada dukungan untuk set alamat IP dalam known_hostsfile. Anda harus memiliki satu baris per alamat.

Meskipun bagian nama host dari entri di-hash secara default, ini hanya untuk privasi sehingga seseorang yang menguasai Anda .known_hoststidak akan dapat dengan mudah mengetahui host mana yang telah Anda sambungkan. (Mereka masih dapat memverifikasi tebakan.) Anda dapat menggunakan nama host atau alamat 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

Perhatikan bahwa ini dapat menambah duplikat.

Gilles 'SO- berhenti menjadi jahat'
sumber
diperbaiki, tetapi hanya berfungsi untuk jaringan hingga 0.0.0.0/24
RSFalcon7
@ RSFalcon7 Memang. Aritmatika alamat IP mengganggu. Saya membuat solusi cepat dan kotor ... Jika Anda memerlukan dukungan untuk jaringan yang lebih besar, konversikan alamat IP ke nomor 32-bit sebelum melakukan enumerasi.
Gilles 'SANGAT berhenti menjadi jahat'
0

SSH tampaknya tidak memiliki konsep rentang IP untuk known_hosts. Saya pikir asumsinya adalah bahwa setiap host akan memiliki kunci unik untuk alasan keamanan.

Dua cara yang dapat saya lihat untuk mempopulasikan host_surya Anda:

  1. ssh-keyscan- Tulis skrip singkat untuk beralih melalui semua alamat tersebut dan berikan feed ssh-keyscanatau file untuk ssh-keyscandibaca. ssh-keyscandapat memindai beberapa host per permintaan, baik dengan menentukan satu baris atau menentukan daftar host.

  2. Isi known_hostsdiri Anda dengan skrip atau editor. Formatnya cukup sederhana jika Anda menggunakan versi non-hash. Ini:

    nama host, alamat IP kunci ssh-keytype

hostnameadalah nama host yang Anda hubungi, dan akan sama untuk semua alamat GitHub. IP addressakan seperti apa yang akan diulangi skrip. keyadalah kunci yang Anda berikan di atas.

Tidak ada yang elegan, tapi saya pikir orang-orang SSH berasumsi tidak ada yang akan melakukan apa yang dilakukan GitHub.

kurtm
sumber
Tidak ada yang harus melakukan apa yang github lakukan. Ini adalah kunci host, bukan kunci "grup host serupa".
@ WumpusQ.Wumbley saya setuju. Tapi saya ragu GitHub akan berubah pada kata saya begitu.
kurtm
0

Hai Saya menemukan skrip dari Gilles cukup berguna, tetapi hanya bekerja untuk jaringan hingga 0.0.0.0/24batasan, saya telah memperluas skrip untuk bekerja dengan jaringan yang lebih besar hingga 0.0.0.0/16mungkin akan berguna bagi orang lain.

#!/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
Deklan
sumber