SSH(Secure Shell)は、ネットワーク上で安全に通信を行うためのプロトコルです。特に、サーバーへのリモートログインやファイル転送などで広く利用されています。SSH接続では、認証方式として公開鍵認証がよく使われますが、この認証で用いる「秘密鍵」には、不正利用を防ぐためにパスフレーズを設定することが強く推奨されています。
しかし、設定したパスフレーズが単純だったり、短かったりすると、攻撃者によって容易に解読されてしまう可能性があります。もし秘密鍵が漏洩し、かつパスフレーズが破られてしまうと、その秘密鍵に対応するサーバーやサービスへの不正アクセスを許してしまいます。
そこで登場するのが、パスワードクラッキングツール John the Ripper (JtR) と、その補助ツールである ssh2john
です。ssh2john
は、SSH秘密鍵ファイルからパスフレーズを解析するために必要な情報(ハッシュ)を抽出するツールです。抽出したハッシュをJohn the Ripperに入力することで、設定されているパスフレーズの強度をテスト(クラッキング試行)できます。
このブログ記事では、ssh2john
の基本的な使い方から、John the Ripperと連携して実際にパスフレーズ解析を行う手順までを、初心者にも分かりやすく解説していきます。セキュリティ意識を高め、より安全なSSH鍵管理を目指しましょう! 💪
ssh2johnとは? 🤔
ssh2john
は、広く使われているオープンソースのパスワードクラッキングツール John the Ripper (JtR) スイートに含まれるユーティリティスクリプト(多くの場合Pythonスクリプト)です。その主な役割は、パスフレーズで保護されたSSH秘密鍵ファイルから、John the Ripperが解析できる形式のハッシュデータを抽出することです。
SSH秘密鍵には、RSA、DSA、ECDSA、Ed25519など、様々な形式や暗号化方式が存在します。ssh2john
は、これらの一般的な鍵形式に対応しており、鍵ファイル内部の暗号化された部分と、それを解読するためのヒント(ソルトや暗号化方式の情報など)を組み合わせ、John the Ripperが理解できる特定のフォーマット文字列に変換します。
具体的には、以下のような鍵形式に対応しています(バージョンによって対応状況が異なる場合があります):
- RSA (PEM形式, OpenSSH形式)
- DSA (PEM形式, OpenSSH形式)
- ECDSA (PEM形式, OpenSSH形式)
- Ed25519 (OpenSSH形式)
- OpenSSH形式の秘密鍵 (bcrypt KDFを使用しているものなど)
ただし、鍵の生成方法やOpenSSHのバージョンによっては、ssh2john
が正しく処理できない形式も存在します。特に、新しいOpenSSH形式の一部の鍵(特にEd25519のPEM形式など)は、ssh2john
のバージョンによっては完全に対応していない可能性があります。
抽出されたハッシュデータは、通常、以下のような形式になります(これはあくまで一例です):
keyfilename:$sshng$0*...*...*...
この文字列には、鍵の種類、暗号化アルゴリズム、ソルト、そして暗号化されたデータ本体などがエンコードされています。John the Ripperはこの情報を元に、様々な手法(辞書攻撃、総当たり攻撃など)を用いて元のパスフレーズを推測しようと試みます。
まとめると、ssh2john
はSSH秘密鍵とJohn the Ripperの間の「翻訳者」のような役割を果たし、パスフレーズで保護された秘密鍵のセキュリティ強度評価を可能にする重要なツールと言えます。
John the Ripper と ssh2john のインストール 💻
ssh2john
は単体で配布されているわけではなく、通常はJohn the Ripperのパッケージに含まれています。したがって、ssh2john
を利用するには、まずJohn the Ripperをインストールする必要があります。
John the Ripperのインストール方法は、お使いのオペレーティングシステムによって異なります。
Linux (Debian/Ubuntu系)
APTパッケージマネージャを使用してインストールするのが最も簡単です。
sudo apt update
sudo apt install john -y
インストール後、ssh2john
スクリプトの場所を確認する必要があるかもしれません。多くの場合、/usr/share/john/
や /usr/lib/john/
、あるいは /opt/john/run/
のようなディレクトリ内にPythonスクリプト (ssh2john.py
) として配置されています。古いバージョンや一部のディストリビューションでは /usr/sbin/ssh2john
などに実行ファイルとして存在する場合もあります。
見つからない場合は、find
コマンドで探すことができます。
sudo find / -name "ssh2john*" 2>/dev/null
もしくは、Kali Linuxのようなペネトレーションテスト用ディストリビューションでは、John the Ripperと関連ツールが標準でインストールされていることが多いです。
Linux (Fedora/CentOS/RHEL系)
YUMやDNFパッケージマネージャを使用してインストールできます。
sudo dnf update
sudo dnf install john -y
# または
sudo yum update
sudo yum install john -y
スクリプトの場所はDebian/Ubuntu系と同様に探してみてください。
macOS
Homebrew を使用してインストールするのが一般的です。
brew update
brew install john-jumbo
Homebrewでインストールした場合、ssh2john
は通常 $(brew --prefix)/share/john/ssh2john.py
のようなパスに配置されます。$(brew --prefix)
は通常 /usr/local
または /opt/homebrew
です。
Windows
Windowsの場合は、John the Ripperの公式サイト (https://www.openwall.com/john/) からWindows用のバイナリ(通常はZIPファイル)をダウンロードして展開します。
展開したディレクトリ内の run
フォルダに ssh2john.py
が含まれています。WindowsでPythonスクリプトを実行するには、Pythonの実行環境が別途必要になる場合があります。WSL (Windows Subsystem for Linux) を利用してLinux環境上でJohn the Ripperを使う方法も便利です。
ソースコードからビルド
最新版や特定の機能を利用したい場合は、GitHubリポジトリ (https://github.com/openwall/john) からソースコードをクローンして、自分でビルドすることも可能です。ビルド手順はリポジトリ内のドキュメント (INSTALL
や README
) を参照してください。
git clone https://github.com/openwall/john.git john-bleeding-jumbo
cd john-bleeding-jumbo/src/
./configure
make -s clean && make -sj4
ビルド後、ssh2john.py
は ../run/
ディレクトリに生成されます。
インストールが完了したら、ターミナル(コマンドプロンプト)で john
コマンドを実行して、バージョン情報やヘルプが表示されるか確認しましょう。
ssh2john の基本的な使い方 ⚙️
ssh2john
の基本的な使い方は非常にシンプルです。ターミナルで以下のように実行します。
[ssh2johnへのパス] [対象の秘密鍵ファイル] > [出力先のハッシュファイル]
各部分を説明します。
-
[ssh2johnへのパス]
: インストールしたssh2john
スクリプト(または実行ファイル)へのフルパス、または環境変数PATHが通っていれば単にssh2john
やpython ssh2john.py
と記述します。- 例:
/usr/share/john/ssh2john.py
- 例:
python /opt/john/run/ssh2john.py
- 例:
ssh2john
(PATHが通っている場合)
python
コマンドで明示的に実行する必要があります。 - 例:
-
[対象の秘密鍵ファイル]
: パスフレーズを解析したいSSH秘密鍵ファイル(例:id_rsa
,id_ed25519
など)のパスを指定します。 -
>
: これはリダイレクト演算子です。ssh2john
の標準出力をファイルに書き込むために使用します。 -
[出力先のハッシュファイル]
: 抽出されたハッシュデータを保存するファイル名を指定します。任意の名前で構いませんが、後で分かりやすいように、元の鍵ファイル名に関連付けた名前(例:id_rsa.hash
,key_hash.txt
)にするのが一般的です。
実行例
例として、カレントディレクトリにある秘密鍵ファイル my_key
からハッシュを抽出し、my_key.hash
というファイルに保存する場合を考えます。ssh2john.py
が /usr/share/john/
にあると仮定します。
python /usr/share/john/ssh2john.py my_key > my_key.hash
もし、ssh2john.py
がカレントディレクトリにある場合は、以下のようになります。
python ssh2john.py my_key > my_key.hash
実行後、my_key.hash
ファイルが生成され、その中にはJohn the Ripperが解析できる形式のハッシュ文字列が一行書き込まれているはずです。
cat my_key.hash
# 出力例:
# my_key:$sshng$0*...長い文字列...
注意点
- ファイル権限:
ssh2john
を実行するユーザーは、対象の秘密鍵ファイルを読み取る権限が必要です。 - 鍵の形式:
ssh2john
がサポートしていない形式の鍵ファイルや、破損している鍵ファイルを与えると、エラーが発生したり、正しくハッシュが抽出できない場合があります。 - パスフレーズ不要の鍵: パスフレーズが設定されていない秘密鍵に対して
ssh2john
を実行しても、意味のあるハッシュは生成されません(あるいはエラーになるか、パスフレーズ無しで扱える形式として出力されるかもしれません)。 - 出力ファイル: 出力ファイルは上書きされます。既存のファイル名を指定すると、その内容は失われるため注意が必要です。
ハッシュファイルが無事に生成できれば、次のステップとしてJohn the Ripperを使って実際のパスフレーズ解析に進むことができます。🎉
John the Ripperでの解析例 🕵️♀️
ssh2john
でSSH秘密鍵からハッシュファイルを生成したら、いよいよJohn the Ripper (JtR) を使ってパスフレーズの解析(クラッキング試行)を行います。John the Ripperにはいくつかの解析モードがありますが、ここでは代表的な「辞書攻撃モード」と「インクリメンタルモード(総当たり攻撃)」を紹介します。
準備: ハッシュファイルの生成
まず、解析対象の秘密鍵(例: id_rsa_test
)からハッシュファイルを生成しておきます。
# ssh2john.py が /usr/share/john/ にあると仮定
python /usr/share/john/ssh2john.py id_rsa_test > id_rsa_test.hash
モード1: 辞書攻撃 (Wordlist Mode)
辞書攻撃は、パスワードとしてよく使われる単語や文字列を集めたリスト(辞書ファイル)を使って、効率的にパスフレーズを試す方法です。強力な辞書ファイルを用意できれば、比較的短い時間で単純なパスフレーズを見つけられる可能性があります。
有名な辞書ファイルとしては rockyou.txt
があります(Kali Linuxなどには標準で含まれていることが多いです)。
コマンド例:
john --wordlist=/usr/share/wordlists/rockyou.txt id_rsa_test.hash
--wordlist=[辞書ファイルのパス]
: 使用する辞書ファイルを指定します。id_rsa_test.hash
:ssh2john
で生成したハッシュファイルを指定します。
John the Ripperは辞書ファイル内の単語を順番に試していきます。パスフレーズが見つかると、ターミナルに表示されます。
Using default input encoding: UTF-8
Loaded 1 password hash (SSH, SSH private key [RSA/DSA/EC/OPENSSH ED25519/ECDSA MGF1/SHA512])
Cost 1 (KDF/Cipher [0=bcrypt/AES-256-CTR 1=bcrypt/AES-256-CBC]) is 16 for all loaded hashes
Cost 2 (key type [0=RSA 1=DSA 2=ECDSA 3=OPENSSH]) is 3 for all loaded hashes
Will run 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
password123 (id_rsa_test) <-- 見つかったパスフレーズ!
1g 0:00:00:02 DONE (2025-03-31 14:00) 0.4854g/s (118.8p/s) 118.8c/s 118.8C/s 123456..secretpass
Session completed
この例では、パスフレーズ password123
が見つかりました。😄
John the Ripperは、見つけたパスフレーズを $JOHN/john.pot
(通常は ~/.john/john.pot
または John the Ripperの実行ディレクトリ直下) というファイルに記録します。後で確認するには --show
オプションを使います。
john --show id_rsa_test.hash
# 出力例:
# id_rsa_test:password123: ... : :/path/to/id_rsa_test
モード2: インクリメンタルモード (Incremental Mode)
インクリメンタルモードは、指定された文字セット(例: 英数字記号)の組み合わせを総当たりで試す方法です。単純なパスフレーズから複雑なものまで、理論上は見つけられますが、パスフレーズが長くなるほど指数関数的に時間がかかります ⏳。
コマンド例 (デフォルト設定):
john --incremental id_rsa_test.hash
--incremental
: インクリメンタルモードを指定します。デフォルトでは、ある程度の長さの英数字記号を試します。
特定の文字種や長さを指定することも可能です(詳細は john.conf
の設定やコマンドラインオプションを参照)。
このモードは非常に時間がかかる可能性があるため、単純なパスフレーズでない限り、現実的な時間内での解析完了は難しいことが多いです。
その他のオプション
--format=ssh
: ハッシュのフォーマットを明示的に指定する場合に使います (通常は自動検出されます)。--rules
: 辞書攻撃と組み合わせて、単語に数字を付け加えたり、大文字小文字を変換したりするルール(マングリングルール)を適用し、より多くのバリエーションを試します。--fork=N
: N個のプロセスを並列で実行し、解析を高速化します (CPUコア数に応じて指定)。--restore
: 中断したセッションを再開します。
これらのモードやオプションを組み合わせることで、様々な状況に対応したパスフレーズ強度テストが可能になります。重要なのは、解析にかかる時間とその結果から、設定されているパスフレーズがどの程度安全なのかを評価することです。
セキュリティに関する考慮事項 🛡️
ssh2john
と John the Ripper は、SSH秘密鍵のパスフレーズ強度を評価するための強力なツールですが、その利用にはセキュリティ上の重要な考慮事項が伴います。
-
倫理的な使用と法的遵守:
最も重要な原則は、これらのツールを自分が所有または管理する、あるいは明示的な許可を得た秘密鍵に対してのみ使用することです。他者の秘密鍵に対して許可なく解析を試みる行為は、不正アクセス禁止法などの法律に抵触する重大な犯罪行為となります。ペネトレーションテストなどの業務で利用する場合も、必ず書面等で明確な許可と作業範囲の合意を得てください。 -
強力なパスフレーズの重要性:
ssh2john
と John the Ripper によるテストは、いかに簡単に弱いパスフレーズが破られるかを実証します。この経験から、SSH秘密鍵には長く、複雑で、推測困難なパスフレーズを設定することの重要性を再認識する必要があります。短い単語、誕生日、名前、連続した文字や数字などは避け、大文字・小文字・数字・記号を組み合わせたランダムな文字列を使用することが推奨されます。パスワードマネージャーを利用して生成・管理するのも良い方法です。 -
鍵の形式とアルゴリズム:
可能であれば、より現代的で安全性の高い鍵形式(例: Ed25519)を使用し、古い形式(例: RSA鍵の鍵長が短いもの、DSA)は避けるべきです。また、秘密鍵の暗号化に使われるアルゴリズムも重要です。OpenSSHの新しいバージョンでは、より強力な鍵導出関数(KDF)であるbcryptなどが使われるようになっています。 -
秘密鍵の適切な管理:
パスフレーズがどれだけ強力でも、秘密鍵ファイル自体が漏洩してしまっては意味がありません。秘密鍵ファイルは、所有者以外がアクセスできないように、適切なファイルパーミッション(例:chmod 600 ~/.ssh/id_ed25519
)を設定し、安全な場所に保管してください。不要になった秘密鍵は確実に削除しましょう。 -
解析環境のセキュリティ:
パスフレーズ解析を行うコンピュータ自体のセキュリティも確保する必要があります。もし解析環境がマルウェアに感染していた場合、解析対象の秘密鍵や解析結果(見つかったパスフレーズ)が外部に漏洩するリスクがあります。信頼できる環境で作業を行ってください。 -
ツールのアップデート:
John the Ripper やssh2john
は継続的に開発されており、新しい鍵形式への対応や脆弱性の修正が行われています。常に最新の安定版を使用するように心がけましょう。
ssh2john
はセキュリティ評価のためのツールであり、悪用するためのものではありません。これらの点を十分に理解し、責任ある態度で利用することが求められます。
まとめ ✨
この記事では、John the Ripper スイートに含まれる ssh2john
ツールに焦点を当て、その役割と使い方、そしてJohn the Ripperと連携してSSH秘密鍵のパスフレーズ強度をテストする具体的な手順について解説しました。
重要なポイントのおさらい:
ssh2john
は、パスフレーズ付きSSH秘密鍵から、John the Ripper (JtR) が解析可能なハッシュデータを抽出するツールです。- 通常、JtRパッケージの一部として提供され、RSA, DSA, ECDSA, Ed25519などの一般的な鍵形式に対応しています。
- 使い方はシンプルで、
ssh2john [秘密鍵ファイル] > [ハッシュファイル]
のように実行します。 - 抽出したハッシュファイルは、
john --wordlist=[辞書] [ハッシュファイル]
やjohn --incremental [ハッシュファイル]
といったコマンドでJtRに渡し、パスフレーズ解析を行います。 - このツールは、設定したパスフレーズが脆弱でないかを確認し、セキュリティ意識を高めるために役立ちます。
- ツールの利用は、必ず倫理的な範囲内(自身の鍵、または許可を得た鍵)に留め、不正利用は絶対に行わないでください。
- SSH秘密鍵には、長く複雑なパスフレーズを設定し、鍵ファイル自体も厳重に管理することが非常に重要です。
SSHは現代のネットワークインフラにおいて不可欠な技術ですが、その安全性を確保するためには、認証に使われる鍵やパスフレーズの管理が鍵となります。ssh2john
と John the Ripper は、その管理状況を評価するための一助となるツールです。ぜひ、ご自身の管理する鍵の強度チェックに活用し、より安全なシステム運用を目指してください。🔐
より詳しい情報や最新の機能については、John the Ripper 公式サイト や GitHubリポジトリ を参照することをお勧めします。
コメント