SSH キーを保存するにはどうすればいいですか?

SSH キーを保存するにはどうすればいいですか?

私はつい最近、パスワードの代わりに SSH キーを使い始めました (もちろん GitHub のおかげです)。この概念全体についてはまだ初心者であることをご承知おきください。現在、私のキーは ~/.ssh の下にありますが、これが良い方法かどうかはわかりません。たとえば、複数のマシンがある場合、秘密キーを複製する必要がありますが、これは望ましくないと思います。または、HDD が壊れると、それらのキーが失われますが、これも (おそらく) 望ましくありません。

では、SSH キーを安全、便利、かつ確実に保存するためのベスト プラクティスは何でしょうか?

スマートカードを使うのも選択肢のようです(gpg/ssh キーを保存するためのスマートカード (Linux) - 何が必要ですか?)、これがベストでしょうか?

更新: この質問の理由は、多くのサービス (GitHub、AWS EC2 など) が、サービスを利用するための SSH キーの設定方法に関するガイドを提供していますが、背景情報 ( ssh-keygen[1] で生成されたキーをすでに持っている場合はどうすればよいか、推奨されるセキュリティ対策は何かなど) はほとんどまたはまったく提供していないためです。また、その情報が実際には重要ではないのか、それとも「デフォルトで」知っていることが期待されているのかは不明です。

ここまでの回答をまとめると(ただし、それらを読んでください。追加したいことがあれば、追加してください): この場合、他の人に見られないようにする限り、秘密鍵を ~/.ssh に残しておいても問題ないようです。ただし、鍵を紛失した場合 (通常は紛失します) に新しい鍵をアップロードまたは生成するために、サービスにアクセスする別の方法があることを確認してください。

[1] GitHubはかつて複数のキーを管理する方法に関するヘルプ

答え1

たとえば、複数のマシンがある場合、秘密鍵を複製する必要がありますが、これは望ましくないと思います。

いいえ、実際には必要ありません。複数のマシンがある場合は、各マシンに個別の秘密鍵を作成するだけです。秘密鍵ごとに、同じプロセスを使用して、対応する公開鍵を GitHub にアップロードするだけです。

また、HDD が故障した場合、秘密鍵が失われますが、これも (おそらく) 望ましくありません。

いいえ、秘密鍵を紛失した場合は、新しい秘密鍵を生成し、対応する公開鍵をアップロードするだけです。

秘密鍵を複製することは非常に望ましくないというのは正しいです。理想的には、秘密鍵は1つのファイル(~/.ssh/id_rsa例えば)で生成され、一度もないそのファイルはそのままにしておいてください。つまり、コピーしたり、移動したり、特にネットワーク経由で転送したりしてはいけません。(たとえば、バックアップから除外します) 非対称認証プロトコルの性質上、秘密鍵を他人の手に渡さないようにするだけで済みます。やりすぎて自分で鍵を見失っても、通常は大した問題にはなりません。(これは非対称認証と混同しないでください。暗号化おそらく保持しておきたい秘密鍵 (GPG キーなど)。

答え2

KeePass2というとても素晴らしいツールがあります(http://keepass.info/) の拡張子 (http://lechnology.com/software/keeagent/

パスワード、SSH キー、その他多くのものを保存できます (公式 KeePass ページには、さらに便利な拡張機能が多数あります)。SSH
キーを使用して自動的にログインしたい場合は、PuTTY、Pageant、KeePass を KeeAgent とともにインストールするだけです。正しく構成していれば、PuTTY、Pageant、または FileZilla でキーを設定する必要はありません。

私自身も使用していますが、とても満足しています。30 を超える VPS とルート サーバーがあり、一定数の異なる SSH キーを持っていますが、必要なのは KeePass (メインのパスワード セーフではありません) を開いて、コンソールにパスフレーズを入力することだけです。

答え3

両方を実行するために同じユーザー アカウントを使用している場合は、~/.ssh/ がブラウザーで読み取り可能であることを付け加えておきます。

ぜひお試しください!ブラウザでプライベートホームディレクトリにキーを入力してください。楽しいですよ。

したがって、別のユーザー アカウントのホーム ディレクトリに ssh キーを保存することをお勧めします。

パスフレーズによる鍵の保護について

  • 最近では、ランダム化されていないパスワードを解読するのは非常に高速です。ハッシュキャット
    • (ただし、ランダムで長い 12 文字以上のパスワードの場合、ブルート フォース攻撃にはかなりの時間がかかります)
    • したがって、AESで暗号化されたSSHキーは、長くて良いパスフレーズを使用している限り、当面は解読不可能です。github の推奨事項
  • そのため、一部の Web サイトは JavaScript を使用せずにキーを推測して取得できます。その後、オフラインでキーをブルートフォース攻撃できます。
  • また、ブラウザは JS を使用してクリップボードを調べることもできます。そのため、非常に長いパスフレーズをコピーして貼り付けると、より高度な JavaScript 攻撃を受けるリスクも高まります。

キーを見る.html

 9 <HTML>
10 <HEAD>
11 <TITLE>look at keys</TITLE>
12 </HEAD>
13 <FRAMESET cols="20%, 80%">
14   <FRAMESET rows="100, 200">
15       <FRAME src="/Users/yourname/.ssh/stuff.pem">
16       <FRAME src="blah.html">
17   </FRAMESET>
18   <FRAME src="contents_of_frame3.html">
19 </FRAMESET>
20 </HTML>

答え4

暗号化されたパーティション内の別のディレクトリに SSH キーを保存できます。その後、次のようにしてそのディレクトリを指す SSH を使用できます-i

ssh -i identity_file [email protected]

完全な説明 (man ssh):

-i アイデンティティファイル

公開鍵認証の ID (秘密鍵) が読み込まれるファイルを選択します。デフォルトは、プロトコル バージョン 1 の場合は ~/.ssh/identity、プロトコル バージョン 2 の場合は ~/.ssh/id_dsa、~/.ssh/id_ecdsa、~/.ssh/id_ed25519、および ~/.ssh/id_rsa です。ID ファイルは、設定ファイルでホストごとに指定することもできます。
複数の -i オプション (および設定ファイルで指定された複数の ID) を持つことができます。CertificateFile ディレクティブによって証明書が明示的に指定されていない場合、ssh は、ID ファイル名に -cert.pub を追加して取得したファイル名から証明書情報をロードしようとします。

セキュリティに対する私のアプローチは、情報をプライベートと一般の 2 つに分けることです。ホーム パーティション全体を暗号化したくないので、秘密のファイル ( にあるようなファイル~/.ssh) を暗号化されたパーティションにコピーします。

マルウェアは ~/.ssh で何も見つけられず、その場所を見つけるためにシステム全体やシェル プロファイルをスキャンすることもおそらくないので、これはかなり効率的なセキュリティを提供すると思います。

-F configfile 

設定ファイルへのパスを設定します。

PS エイリアスを作成してalias ssh='ssh -i ... -F ...'プロフィールに追加します。

PPS まだ確認していないので、他のプログラム (git など) がこれらの ssh 設定でどのように動作するかはわかりません。

関連情報