ホスト(GitHubなど)をSSH known_hostsファイルに安全に追加します


20

SSHキーにホストキーをknown_hosts安全に追加するにはどうすればよいですか?

開発マシンをセットアップしてgitいますがgithub.com、SSH を使用してリポジトリのクローンを作成するときにプロンプ​​トが表示されないようにしたいです。

私は使用できることを知っていますStrictHostKeyChecking=no(例:この回答)が、安全ではありません。

これまでのところ、私は見つけました...

  1. GitHubはhttps://help.github.com/articles/github-s-ssh-key-fingerprints/で SSHキーフィンガープリントを公開しています

  2. ssh-keyscanのホストキーを取得するために使用できますgithub.com

これらの事実をどのように組み合わせるのですか?事前に設定された指紋のリストが与えられた場合、出力をファイルにssh-keyscan追加できることを確認するにはどうすればよいknown_hostsですか?


私は次を尋ねていると思います:

によって返されるキーの指紋を取得するにはどうすればよいssh-keyscanですか?

すでにSSHのMITMを使用しているが、GitHub HTTPSページを信頼できると仮定しましょう(有効な証明書チェーンがあるため)。

これは、いくつかの(疑わしい)SSHホストキー(からssh-keyscan)といくつかの(信頼できる)キーフィンガープリントを持っていることを意味します。一方を他方に対して検証するにはどうすればよいですか?


関連:からの出力のホスト部分をハッシュするにはどうすればよいssh-keyscanですか?または、ハッシュされたホストとハッシュされていknown_hostsないホストを混在させることはできますか?


ユースケースで安全でないのはなぜですか?
quadruplebucky

StrictHostKeyChecking=noMITMに対して脆弱です。あるssh-keyscanMITMに対しては安全?
ロジャーリップスコム

ダウンロードして実行しようとしているコードを書くのに十分に信頼している、会ったことのない見知らぬ人になりすます誰かについて私が過度に心配している理由を理解できません
quadruplebucky

これはgithubのプライベートリポジトリにある私のソースコードであり、コミットをプッシュするときに悪意のある変更を導入するMITM(たとえば)が必要ないためです。それはほんの例です。
ロジャーリップスコム

私は(良くも悪くも)githubを信頼することを選択します。私と彼らの間のすべてのランダムなネットワークリンクを信頼することを選択しません。
ロジャーリップスコム

回答:


11

known_hostsファイルにキーを「安全に」追加する最も重要な部分は、サーバー管理者からキーフィンガープリントを取得することです。キーフィンガープリントは次のようになります。

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

GitHubの場合、通常、管理者と直接話すことはできません。ただし、Webページにキーを置いて、そこから情報を回復できるようにします。

手動キーインストール

1)サーバーからキーのコピーを取り、その指紋を取得します。注意:指紋を確認する前にこれを行ってください。

$ ssh-keyscan -t rsa github.com | tee github-key-temp | ssh-keygen -lf -
# github.com:22 SSH-2.0-babeld-f3847d63
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

2)サーバー管理者からキーフィンガープリントのコピーを取得します-この場合、github.comの情報を含むページに移動します

  1. github.comにアクセスします
  2. ヘルプページにアクセスします(ログインしている場合は右側のメニュー、それ以外の場合はホームページの下部にあります)。
  3. はじめに」セクションで、SSHを使用したGitHubへの接続に進みます
  4. 移動し、あなたのSSH接続のテスト
  5. 後で使用するために、SHA256フィンガープリントをそのページからテキストエディターにコピーします。

3) 2つのソースのキーを比較する

テキストエディターで上下に直接配置することで、何かが変更されたかどうかを簡単に確認できます

2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA) #key recovered from github website
2048 SHA256:nThbg6kXUpJ3Gl7E1InsaspRomtxdcArLviKaEsTGY8 github.com (RSA) #key recovered with keyscan

(2番目のキーは操作されていますが、元のキーと非常に似ていることに注意してください。このようなことが発生した場合、深刻な攻撃を受けているため、信頼できるセキュリティ専門家に連絡する必要があります。)

キーが異なる場合、手順を中止し、セキュリティの専門家に連絡してください

4)キーが正しく比較される場合、ダウンロードしたキーをインストールする必要があります

cat github-key-temp >> ~/.ssh/known_hosts

または、システム上のすべてのユーザーに(rootとして)インストールするには:

cat github-key-temp >> /etc/ssh/ssh_known_hosts

自動キーインストール

ビルドプロセス中にキーを追加する必要がある場合は、上記の手動プロセスのステップ1〜3に従う必要があります。

それが終わったら、github-key-tempファイルの内容を調べて、それらの内容を既知のホストファイルに追加するスクリプトを作成します。

if ! grep github.com ~/.ssh/known_hosts > /dev/null
then
     echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" >> ~/.ssh/known_hosts
fi

これで、無効になっているコマンドをすべて取り除く必要sshがありStrictHostKeyCheckingます。


17

known_hostsファイルには、ハッシュ化されたエントリとハッシュ化されていないエントリを混在させることができます。

したがって、githubキーを追加する場合は、次のようにします。

ssh-keyscan github.com >> ~/.ssh/known_hosts

ハッシュ化する場合は、-Hを追加します

ssh-keyscan -H github.com >> ~/.ssh/known_hosts


1
ハッシュ化/非ハッシュ化の違いは何ですか?ハッシュがこのコンテキストで適用される理由だけでなく、ハッシュが何であるかを知っています。
グレントーマス

3
エントリをハッシュすると、接続に使用しているホストに関する情報を隠すことができます。security.stackexchange.com/questions/56268/で
Wee

4
これは質問に答えません。ssh-keyscanを使用すると、中間者攻撃を受ける可能性があります。つまり、保存するキーは、システムに侵入しようとする攻撃者のキーである可能性があります。物事を確認する方法については私の答えをご覧ください。
マイケル

Att。離れている回答に注意を引くことは正しくありません - 「2つの上位の回答は実際には安全ではありません」
ピーターモーテンセン

6

最も簡単な方法は、を使用してキーを手動で取得ssh-keyscanすることです。

$ ssh-keyscan -t rsa github.com | ssh-keygen -lf -
# github.com:22 SSH-2.0-libssh-0.7.0
2048 SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8 github.com (RSA)

そして、それらをスクリプトに追加すると、「信頼できる」公開鍵が保持されます。


あなたが言ったようなキーを持っていますが、どのように「スクリプトに追加しますか?」
グレントーマス

別のファイルとして、またはスクリプト内の文字列として。
Jakuje

「手動で検証する」に隠されているのはまったく難しいプロセスなので、この答えは危険です。その方法を説明し、結果を安全に使用するための回答を以下に追加しました。
マイケル

Att。離れている回答に注意を引くことは正しくありません - 「2つの上位の回答は実際には安全ではありません」
ピーターモーテンセン

1
@RogerLipscombe答えは安全に解釈できることに同意します-「手動で検証する」は説明されていませんが、「sshのマニュアルページの指示に従う」ことを理解している場合は、おそらくそれで問題ありません。ここでのリスクは、誰かがそれを理解していない可能性があり、たとえば、サーバーにログインした後にキーをチェックするなどの安全でないことを試みる可能性があることです。だからこそ、この答えを「危険」と呼び、他の答えを「安全でない」と呼んだのです。手動で確認する方法の詳細が重要です。受け入れてくれてありがとう。
マイケル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.