known_hosts に IP 範囲を追加するにはどうすればいいですか?

known_hosts に IP 範囲を追加するにはどうすればいいですか?

多くのサービス (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+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5 QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

答え1

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

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

からman 8 sshd、これが私たちが取り組むべきことです既知のホスト:

Hostnamesは、カンマで区切られたパターンのリストです (*と は?ワイルドカードとして機能します)。各パターンは、順番に正規のホスト名 (クライアントの認証時) またはユーザー指定の名前 (サーバーの認証時) と照合されます。パターンの前に を!付けて否定を示すこともできます。ホスト名が否定されたパターンに一致する場合、その行の別のパターンに一致したとしても、そのホスト名は (その行では) 受け入れられません。ホスト名またはアドレスは、オプションで と の[括弧で囲み]、その後に:と非標準のポート番号を続けることができます。

*この情報を使用して、最後のオクテットにワイルドカードを使用して、すべての可能な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 ブロック (つまり、オクテットのすべての可能な値) を満たしていない場合、ワイルドカードを使用してそのような正確な一致を得ることは不可能です。

答え2

範囲を簡単に追加できるとは思いませんが、.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 ドメインのすべてのホストの公開ホスト キーを検索するというものです。

答え3

ファイル内の IP アドレス セットはサポートされていませんknown_hosts。アドレスごとに 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

重複が追加される可能性があることに注意してください。

答え4

github_known_hosts私は、GitHubが公開しているIPアドレスの範囲を拡張できる小さなRubyスクリプトを書きました。メタAPIエンドポイントhttps://api.github.com/meta)。

#!/usr/bin/env ruby

require "ipaddr"
require "json"

pubkey = "AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ=="
ips    = JSON.parse(STDIN.read)["git"].flat_map { |net| IPAddr.new(net.chomp).to_range.map(&:to_s) }

puts "github.com,gist.github.com,#{ips.join(',')} ssh-rsa #{pubkey}"

これを次のように使用すると、ファイルに挿入できる非常に長い行が生成されます~/.ssh/known_hosts

curl --silent https://api.github.com/meta | github_known_hosts >> ~/.ssh/known_hosts

関連情報