known_hostsにIP範囲を追加する方法は?


15

多くのサービス(GitHubなど)は、広範囲のIPを使用し、明らかに同じ公開キーを使用します。

known_hostsファイルにIP範囲(できれば1つ)を追加するにはどうすればよいですか?

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


1
これらのIPはここで
-RSFalcon7

回答:


11

他の回答で述べたように、known_hostsはIPアドレス範囲をサポートしていません。ただし、ワイルドカードはサポートしています。もちろん、ワイルドカードはまったく同じものではないので、IPアドレスでのワイルドカードの使用方法に十分注意する必要がありますが、Githubの特定のケースではこれを安全に行うことができます。

質問がされてから状況はより単純になったようです。Githubの公式ドキュメントによると、使用中のIPアドレス範囲は1つだけです(少なくともIPv4に関しては)。これは192.30.252.0/22の範囲です。これにより、4つの異なるCブロックで最後のオクテットの可能な範囲全体に都合よく広がる1020のIPアドレスが作成されます。

から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

次に、github-server-pool.github.comという名前でknown_hostsファイルにキーを追加します。

前提:ホストgithub-server-pool.github.comが存在しないか、SSH経由で接続されていない。

その背後にある考え方は、sshがキーgithub-server-pool.github.comをキーとして使用して、github.comドメインのすべてのホストの公開ホストキーを検索することです。


これは素晴らしい答えであり、オリジナルよりも簡単です。
kael

4

known_hostsファイル内のIPアドレスセットのサポートはありません。アドレスごとに1行が必要です。

エントリのホスト名部分はデフォルトでハッシュ化されますが、これはプライバシーのためだけであるため、誰かがあなた.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ビットの数値に変換します。
ジル 'SO-悪である停止'

0

SSHには、known_hostsのIP範囲の概念はないようです。セキュリティ上の理由から、各ホストには一意のキーが割り当てられると仮定しています。

known_hostsを事前設定するために確認できる2つの方法:

  1. ssh-keyscan-簡単なスクリプトを作成して、これらすべてのアドレスを反復処理ssh-keyscanssh-keyscan、読み取り専用のファイルまたはファイルをフィードします。 ssh-keyscan1行で指定するか、ホストのリストを指定することにより、呼び出しごとに複数のホストをスキャンできます。

  2. 移入known_hostsスクリプトやエディタを自分で。ハッシュされていないバージョンを使用する場合、形式は非常に簡単です。それは:

    ホスト名、IPアドレスssh-keytypeキー

hostname連絡先のホスト名であり、すべてのGitHubアドレスで同じです。 IP addressスクリプトが繰り返し処理するものです。 key上記で提供したキーです。

どちらもエレガントではありませんが、GitHubがしていることを誰もやらないとSSHの人々は思っていたと思います。


githubがやっていることを誰もやってはいけません。これは「類似ホストのグループ」キーではなく、ホストキーです。

@ WumpusQ.Wumbley同意します。しかし、GitHubが私の言う通りに変わるとは思いません。
kurtm

0

こんにちは、Gillesのスクリプトは非常に便利であることがわかりましたが、ネットワークでのみ機能すること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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.