はじめに
SSH (Secure Shell) キーは、リモートサーバーへの認証を安全に行うための方法であり、パスワードベースのログインよりも堅牢な代替手段を提供します。セキュリティを強化するために、SSH の秘密鍵はパスフレーズで暗号化できます。攻撃者が秘密鍵ファイルにアクセスできたとしても、それを使用するにはパスフレーズが必要になります。
しかし、弱いパスフレーズは重大な脆弱性となり得ます。この実験では、セキュリティアナリストの立場になり、このリスクを理解します。ここでは、強力なオープンソースのパスワードクラッキングツールである John the Ripper を使用して、SSH 秘密鍵のパスフレーズをクラックする方法を学びます。この演習は、強力なパスフレーズを使用することの重要性を強調するための教育目的で行われます。
パスワード保護された SSH 秘密鍵の生成
このステップでは、新しい SSH キーペアを生成します。秘密鍵は、簡単で推測しやすいパスフレーズで保護されます。この鍵は、後続のステップでのクラッキング演習のターゲットとして使用されます。
ssh-keygen コマンドを使用して鍵を作成します。鍵の種類、ビットサイズ、およびファイル名を指定して、プロジェクトディレクトリ内に作成されるようにします。
RSA SSH キーペアを生成するには、次のコマンドを実行してください。パスフレーズを求められたら、labex と入力します。
ssh-keygen -t rsa -b 2048 -f ./my_ssh_key -C "labex@labex.io"
パスフレーズの入力と確認を求められます。両方のプロンプトで labex と入力して Enter キーを押してください。
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): labex
Enter same passphrase again: labex
Your identification has been saved in ./my_ssh_key
Your public key has been saved in ./my_ssh_key.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx labex@labex.io
The key's randomart image is:
+---[RSA 2048]----+
| . |
| . . |
| . . |
| . . . . |
| . . S . |
| . . . o |
| . . . + . |
| . . . =.o.o |
|.. .oo*+E+ |
+----[SHA256]-----+
次に、現在のディレクトリのファイルを一覧表示して、新しく作成されたキーペア(秘密鍵 my_ssh_key と公開鍵 my_ssh_key.pub)を確認します。
ls -l
total 12
-rw------- 1 labex labex 1823 Jan 01 12:00 my_ssh_key
-rw-r--r-- 1 labex labex 401 Jan 01 12:00 my_ssh_key.pub
-rw-r--r-- 1 labex labex 48 Jan 01 12:00 wordlist.txt
パスワードで保護された SSH 秘密鍵の作成に成功しました。
ssh2john を使用して SSH キーからハッシュを抽出する
John the Ripper は、SSH キーファイル形式を直接扱うことはできません。暗号化されたパスフレーズを表す特定のハッシュ形式が必要です。このハッシュを取得するために、John the Ripper スイートに含まれている ssh2john というユーティリティを使用します。
このステップでは、作成した秘密鍵 (my_ssh_key) に対して ssh2john を実行し、その出力を新しいファイルに保存します。このファイルには、john がクラックを試みることができるハッシュが含まれます。
ハッシュを抽出し、ssh_hash.txt という名前のファイルに保存するには、次のコマンドを実行します。
ssh2john my_ssh_key > ssh_hash.txt
このコマンドは、> 演算子を使用して出力を ssh_hash.txt ファイルにリダイレクトしたため、ターミナルに何も出力されません。
生成されたハッシュファイルの内容を表示するには、cat コマンドを使用します。
cat ssh_hash.txt
長い文字列が表示されます。これが、キーのパスフレーズのハッシュ表現です。以下のような形式になります。
my_ssh_key:$ssh2$0$16$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx$1040$xxxxxxxx...
これで、クラッキングプロセスに使用できるハッシュファイルが準備できました。
John the Ripper で SSH キーハッシュをクラックする
ハッシュが抽出されたので、John the Ripper を使用してクラックする時間です。「辞書攻撃」を実行します。これは、john が指定された単語リストの各単語をパスフレーズの候補として試す方法です。この実験では、環境に事前に作成された wordlist.txt ファイルを使用します。
実際のシナリオでは、攻撃者は数百万もの一般的なパスワード、名前、辞書単語を含む巨大な単語リストを使用します。私たちのシンプルな単語リストには正しいパスフレーズである labex が含まれているため、このデモンストレーションではクラックは成功します。
単語リストとハッシュファイルを指定して john コマンドを実行します。
john --wordlist=wordlist.txt ssh_hash.txt
John はクラッキングプロセスを開始します。パスフレーズは短い単語リストに含まれているため、ほぼ瞬時に見つかります。
Using default input encoding: UTF-8
Loaded 1 password hash (SSH [RSA/DSA/EC/OPENSSH private keys ssh2john])
Cost 1 (KDF/cipher) is 0 for all loaded hashes
Cost 2 (iteration count) is 16 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
labex (my_ssh_key)
1g 0:00:00:00 DONE (2023-01-01 12:05) 12.50g/s 12.50p/s 12.50c/s 12.50C/s sunshine..labex
Use the "--show" option to display all of the cracked passwords reliably
Session completed
成功しました!出力行 labex (my_ssh_key) は、キー my_ssh_key のパスフレーズ labex が正常に復旧されたことを示しています。
John the Ripper は、クラックされたパスワードを「pot ファイル」(デフォルトでは ~/.john/john.pot)に保存します。攻撃を再実行せずにクラックされたパスワードを再度表示するには、--show オプションを使用できます。
john --show ssh_hash.txt
my_ssh_key:labex
1 password hash cracked, 0 left
これにより、クラックされたパスフレーズが確認されます。これで、SSH キーの弱いパスフレーズを正常にクラックできました。
SSH キーのセキュリティを理解する
この実験では、重要な点を実証します。パスフレーズで保護された SSH キーのセキュリティは、パスフレーズ自体の強度と同じくらいしか強くありません。SSH キーのセキュリティの構成要素を分解してみましょう。
キーの強度 (暗号化): これは、キーの生成に使用されるアルゴリズム (例:RSA、ECDSA、Ed25519) およびキーサイズ (例:2048、4096 ビット) を指します。キーサイズが大きいほど、攻撃者が総当たり攻撃によって基盤となる暗号化を破ることは指数関数的に困難になります。これは、公開キーから秘密キーを導き出そうとする攻撃から保護します。
パスフレーズの強度 (暗号化): これは、秘密キーファイル自体を保護します。パスフレーズを設定すると、秘密キーファイルは暗号化されます。誰かがこのファイルを盗んだ場合、最初に復号化しないと使用できません。ご覧のとおり、弱く、一般的で、辞書に基づいたパスフレーズは簡単にクラックされる可能性があります。強力なパスフレーズは、長く、複雑で、ユニークであるべきであり、辞書攻撃や総当たり攻撃を計算上実行不可能にします。
ファイルパーミッション (アクセス制御): オペレーティングシステムのファイルパーミッションは、最初の防御線を提供します。秘密キーファイルは、常に所有者のみにアクセスを制限するパーミッション (例:
600または-rw-------) を持つ必要があります。これにより、同じシステム上の他のユーザーがキーファイルを読み取ることを防ぎます。
この実験では、攻撃ベクトルが暗号化自体ではなく、ファイルを暗号化するために使用された弱いパスフレーズであったため、キーの暗号化強度は関係ありませんでした。
SSH キー管理のベストプラクティス
リスクを理解することが第一歩です。それらを軽減する方法は、ベストプラクティスを適用することです。ここでは、実際の環境で SSH キーを安全に管理するための必須ルールを紹介します。
強力でユニークなパスフレーズを使用する:
- 一般的な単語、名前、または単純なパターンは絶対に使用しないでください。
- 強力なパスフレーズは、長く (15 文字以上) 、大文字、小文字、数字、記号を組み合わせたものであるべきです。
- パスワードマネージャーを使用して、非常に複雑なパスフレーズを生成および保存することを検討してください。
最新のアルゴリズムと適切なキーサイズを使用する:
- 古い RSA よりも、Ed25519 や ECDSA のような最新のアルゴリズムを優先してください。これらは、より優れたセキュリティとパフォーマンスを提供します。
- RSA を使用する場合は、少なくとも 2048 ビットのキーサイズを確保し、長期的なセキュリティのためには 4096 ビットが推奨されます。
秘密キーファイルを保護する:
- 秘密キーファイル (例:
~/.ssh/id_rsa) には、常に厳格なファイルパーミッションを設定してください。chmod 600を使用して、ユーザーのみが読み取り/書き込みアクセスできるようにします。
- 秘密キーファイル (例:
SSH エージェントを使用する:
- SSH エージェント (
ssh-agent) は、メモリ内に復号化された秘密キーをキャッシュするバックグラウンドプログラムです。エージェントにキーを追加するときにパスフレーズを一度入力すると、セッション中は再度入力する必要がなくなります。これは便利で安全であり、パスフレーズが繰り返し入力されたりディスクに保存されたりすることはありません。
- SSH エージェント (
定期的にキーをローテーションする:
- 定期的に新しい SSH キーペアを生成し、古いキーを廃止してください。これにより、古いキーが侵害された場合に攻撃者が悪用できる期間を制限します。
秘密キーを共有しない:
- 秘密キーは秘密です。それはあなたのユニークなアイデンティティです。メール、チャット、その他の媒体で送信しないでください。他の人がアクセスする必要がある場合は、その人が独自のキーペアを生成し、あなたの公開キーを提供する必要があります。
まとめ
この実験では、一般的なセキュリティ監査タスクを実際に体験しました。以下のことを成功させました。
- パスフレーズで保護された新しい SSH キーペアを生成しました。
ssh2johnユーティリティを使用して、秘密キーファイルからクラック可能なハッシュを抽出しました。- John the Ripper を使用して辞書攻撃を実行し、弱いパスフレーズをクラックしました。
- 暗号化強度とパスフレーズ強度のそれぞれの役割を含む、SSH キーセキュリティの基本原則を学びました。
- 安全な SSH キー管理のための必須ベストプラクティスを確認しました。
この演習は、強力な暗号化ツールでさえ、弱い人的プラクティスによって損なわれる可能性があることを示しています。デジタルアイデンティティの整合性を確保するために、常に強力でユニークなパスフレーズで SSH キーを保護してください。


