現代のコミュニケーションにおいて、XMPP (Extensible Messaging and Presence Protocol) は依然として重要な役割を果たしています。その中でも、ejabberd は非常に人気のある、スケーラブルで堅牢なオープンソースXMPPサーバーです。多くの組織や個人がリアルタイム通信基盤としてejabberdを利用していますが、そのセキュリティ、特にユーザーアカウントのパスワード強度を確保することは極めて重要です。
ここで登場するのが、強力なパスワードクラッキングツールである John the Ripper (JtR) と、そのユーティリティ群の一つである ejabberd2john
です。ejabberd2john
は、ejabberdが保存しているユーザーのパスワードハッシュデータを抽出し、John the Ripperが解析できる形式に変換するためのツールです。
このブログ記事では、ejabberd2john
の基本的な使い方、ejabberdのデータソース、具体的な手順、そしてパスワード監査におけるその重要性について詳しく解説していきます。適切なパスワード監査は、システム全体のセキュリティを向上させるための重要なステップです 💪。
前提条件と準備
ejabberd2john
を使用する前に、いくつかの準備が必要です。
-
John the Ripperのインストール:
ejabberd2john
はJohn the Ripperスイートの一部です。まず、John the Ripperをシステムにインストールする必要があります。多くのLinuxディストリビューションでは、パッケージマネージャーを通じてインストールできます(例:sudo apt install john
やsudo yum install john
)。あるいは、公式サイトからソースコードをダウンロードしてコンパイルすることも可能です。 - ejabberdデータへのアクセス権: パスワードハッシュを抽出するには、ejabberdがユーザーデータを保存しているファイルやデータベースへの読み取りアクセス権が必要です。通常、これには管理者権限が必要となります。
-
Python環境:
ejabberd2john
はPythonスクリプト(ejabberd2john.py
)として提供されていることが多いです。そのため、Python 2 または Python 3 の実行環境が必要になる場合があります。依存関係がある場合は、それらも満たす必要があります。
ejabberd2johnツールの場所
ejabberd2john.py
スクリプトは、John the Ripperをソースからコンパイルした場合、通常 run
ディレクトリ内にあります。例えば、John the Ripperのソースディレクトリが /opt/john/
であれば、スクリプトは /opt/john/run/ejabberd2john.py
に存在する可能性が高いです。
パッケージマネージャーからJohn the Ripperをインストールした場合、/usr/bin/
や /usr/sbin/
、あるいは /usr/share/john/
のような場所に配置されることもあります。見つからない場合は、find
コマンドや locate
コマンドを使用して探してみてください。
# find /usr -name ejabberd2john.py
# locate ejabberd2john.py
最新版のJohn the Ripper (bleeding-jumboブランチなど) を使用することが推奨されます。これには最新のフォーマットサポートや修正が含まれていることが多いです。
ejabberdのデータソース: Mnesiaダンプ
ejabberdはユーザーアカウント情報(ユーザー名、サーバー名、パスワードハッシュなど)を保存するために、いくつかのバックエンドデータベースを使用できます。最も一般的なのは Mnesia です。MnesiaはErlang/OTPに組み込まれた分散データベース管理システムです。
ejabberd2john.py
は、主にこのMnesiaデータベースのダンプファイルからパスワードハッシュを抽出するように設計されています。他のデータベースバックエンド(MySQL, PostgreSQLなど)を使用している場合、ejabberd2john
が直接対応していない可能性があります。その場合は、データベースから関連するテーブル(例: users
テーブルや passwd
テーブル)のデータを手動で抽出し、John the Ripperが認識できる形式に整形する必要があるかもしれません。
Mnesiaダンプの作成方法
Mnesiaデータベースの内容をファイルに書き出す(ダンプする)には、ejabberdの管理ツールである ejabberdctl
コマンドを使用します。
-
ejabberdサーバーの停止 (推奨): データベースの一貫性を保つため、可能であればダンプ作成前にejabberdサービスを停止することが推奨されます。ただし、稼働中のサーバーでもダンプ作成は可能です。
sudo systemctl stop ejabberd # または service ejabberd stop など
-
ダンプコマンドの実行:
ejabberdctl dump <出力ファイル名>
コマンドを実行します。出力ファイル名は任意ですが、.dump
や.txt
といった拡張子を付けると分かりやすいでしょう。
このコマンドは、Mnesiaデータベースの内容(スキーマ情報やテーブルデータ)を指定されたテキストファイルに出力します。このファイルの中に、ユーザーアカウントと関連するパスワードハッシュが含まれています。sudo ejabberdctl dump /tmp/ejabberd_dump.txt
-
ejabberdサーバーの再開 (停止した場合): ダンプ作成が完了したら、ejabberdサービスを再開します。
sudo systemctl start ejabberd # または service ejabberd start など
Mnesiaダンプファイル (例: /tmp/ejabberd_dump.txt
) は、ejabberdの内部データ構造を含むテキストファイルです。このファイルには機密情報が含まれる可能性があるため、アクセス権限を適切に管理し、不要になったら安全に削除してください。
ejabberdの設定によっては、パスワードハッシュの形式が異なる場合があります。SCRAM (Salted Challenge Response Authentication Mechanism) が一般的ですが、古い設定では प्लेनテキストや他のハッシュアルゴリズムが使われている可能性もゼロではありません(ただし非推奨)。ejabberd2john
は主にSCRAM形式のハッシュに対応しています。
ejabberd2john の使い方
Mnesiaダンプファイルが準備できたら、いよいよ ejabberd2john.py
を使ってハッシュを抽出します。基本的なコマンド構文は以下の通りです。
python /path/to/john/run/ejabberd2john.py /path/to/ejabberd_dump.txt > ejabberd_hashes.txt
各部分の説明:
python
: Pythonインタープリタのコマンド。環境によってはpython3
など、バージョン指定が必要な場合があります。/path/to/john/run/ejabberd2john.py
:ejabberd2john.py
スクリプトへのフルパスまたは相対パス。/path/to/ejabberd_dump.txt
: 先ほど作成したMnesiaダンプファイルのパス。> ejabberd_hashes.txt
: 標準出力をリダイレクトして、抽出されたハッシュをejabberd_hashes.txt
というファイルに保存します。ファイル名は任意です。
このコマンドを実行すると、ejabberd2john.py
はダンプファイルを解析し、ユーザーアカウントに関連付けられたパスワードハッシュ(通常はSCRAM形式)をJohn the Ripperが認識できるフォーマットで標準出力に出力します。
出力形式の例
出力されるハッシュファイル (ejabberd_hashes.txt
) の内容は、以下のような形式になります(これはSCRAM-SHA-1の場合の例です)。
user1@domain.com:$xmpp-scram$0$4096$16$4f67aec1bd53f5f2f74652e69a3b8f32$4aec3caa8ace5180efa7a671092646c041ab1496
user2@domain.com:$xmpp-scram$0$4096$16$1f7fcb384d5bcc61dfb1231ae1b32a2f$a2d076d56b0152ed557ad7d38fce93159bc63c9b
この形式は ユーザー名:ハッシュ情報
となっており、John the Ripperはこのファイルを直接入力として受け付けます。
user1@domain.com
: ユーザーのJID (Jabber ID)。$xmpp-scram$
: ハッシュタイプを示すプレフィックス。0
: SCRAMのバージョンまたはサブタイプ(ここではSHA-1を示す)。4096
: イテレーション(反復)回数。16
: ソルトの長さ(バイト単位)。4f67...8f32
: ソルト(16進数表記)。4aec...1496
: 実際のパスワードハッシュ(StoredKey)。
抽出が成功したら、ejabberd_hashes.txt
ファイルの内容を確認し、期待通りの形式になっているか確かめましょう。もしファイルが空だったり、エラーメッセージが出力されたりした場合は、ダンプファイルの内容や ejabberd2john.py
のパス、実行権限などを再確認してください。
John the Ripper でパスワードを解析する
ejabberd_hashes.txt
ファイルが準備できたら、John the Ripperを使ってパスワードの強度監査(クラッキング試行)を行います。John the Ripperにはいくつかの動作モードがあります。
1. シンプルモード (デフォルト)
最も基本的な使い方です。John the Ripperは組み込みのルールやユーザー名自体を基にした簡単なパスワード推測を試みます。
john ejabberd_hashes.txt
Johnは自動的にハッシュタイプ (xmpp-scram
) を検出し、解析を開始します。
2. ワードリストモード
事前に用意したパスワード候補のリスト(ワードリスト)を使って解析を試みます。これは非常に一般的な方法です。rockyou.txt
などの有名なワードリストがよく使われます。
john --wordlist=/path/to/wordlist.txt ejabberd_hashes.txt
/path/to/wordlist.txt
には、使用するワードリストファイルのパスを指定します。
3. ワードリストモード + ルール
ワードリストの単語に様々な変換ルール(大文字小文字変換、数字や記号の追加など)を適用して、より多くのパスワード候補を生成します。これにより、単純な単語だけでなく、少し変更されたパスワードも見つけやすくなります。
john --wordlist=/path/to/wordlist.txt --rules=Default ejabberd_hashes.txt
--rules=Default
はJohnに組み込まれているデフォルトのルールセットを使用します。--rules=All
など、他のルールセットを指定することも可能です。
4. インクリメンタルモード
Johnが定義された文字セットとルールに基づいて、ブルートフォース(総当たり)的にパスワード候補を生成して試行します。時間はかかりますが、特定のパターンを持つパスワードを見つけられる可能性があります。
john --incremental ejabberd_hashes.txt
特定の文字種(例: 数字のみ、小文字英字のみなど)を指定することもできます (例: --incremental=Digits
)。
解析結果の確認
John the Ripperがパスワードのクラッキングに成功すると、その結果は通常 $JOHN/john.pot
($JOHN
はJohn the Ripperのホームディレクトリ、通常は ~/.john/
またはJohnの実行ディレクトリ) というファイルに保存されます。
解析済みのパスワードを確認するには、--show
オプションを使用します。
john --show ejabberd_hashes.txt
このコマンドは、ejabberd_hashes.txt
に含まれるハッシュのうち、既にクラックされたパスワードを ユーザー名:パスワード
の形式で表示します。
user1@domain.com:password123
user2@domain.com:qwerty
2 password hashes cracked, 0 left
セキュリティへの影響と対策
ejabberd2john
と John the Ripper を用いたパスワード監査は、システムのセキュリティ状態を評価する上で非常に有効です。これにより、推測されやすい、または弱いパスワードを使用しているユーザーを特定できます。
監査から得られる知見:
- 弱いパスワードを使用しているアカウントの特定
- パスワードポリシーの有効性の評価
- ユーザーへのセキュリティ教育の必要性の判断
リスク:
一方で、これらのツールが悪意のある攻撃者の手に渡ると、不正アクセスのリスクが高まります。特に、Mnesiaダンプファイルや抽出されたハッシュファイルが漏洩した場合、オフラインでのパスワードクラッキング攻撃に利用される可能性があります。
対策と推奨事項:
- 強力なパスワードポリシーの強制: ejabberdの設定や外部認証システム(LDAP, PAMなど)を利用して、複雑さ(長さ、文字種)、履歴、有効期限などを含む強力なパスワードポリシーを適用します。
- サーバーとデータベースの保護: ejabberdサーバー自体と、Mnesiaデータベースファイルが保存されているディレクトリへのアクセス制御を厳格に行います。不要なアクセス権限を与えず、ファイアウォール等で適切に保護します。
- Mnesiaダンプファイルとハッシュファイルの厳重な管理: 監査目的で作成したダンプファイルやハッシュファイルは、必要最小限の期間だけ保持し、不要になったら確実に削除します。アクセス権も厳しく制限してください。
- 定期的な監査と教育: 定期的にパスワード監査を実施し、その結果に基づいてユーザーにパスワードの重要性や安全なパスワードの設定方法について教育します。
- SCRAMの利用: ejabberdの設定で、可能な限り安全な認証メカニズムであるSCRAM (特にSCRAM-SHA-256やSCRAM-SHA-512) を使用するように構成します。イテレーション回数も適切な値(高すぎるとサーバー負荷増、低すぎると脆弱)に設定します。
- 通信の暗号化: クライアントとサーバー間、およびサーバー間の通信(S2S)はTLS/SSLを使用して暗号化し、盗聴リスクを低減します。
パスワードセキュリティは多層防御の一部です。ツールを使った監査だけでなく、ポリシーの適用、システムの保護、ユーザー教育を組み合わせることが重要です。
トラブルシューティング 🤔
ejabberd2john
や John the Ripper の使用中に問題が発生することがあります。以下に一般的な問題とその対処法をいくつか示します。
問題 | 考えられる原因 | 対処法 |
---|---|---|
ejabberd2john.py 実行時にエラー (例: File not found) |
スクリプトまたはダンプファイルのパスが間違っている。 | ejabberd2john.py とダンプファイルのパスを正確に指定しているか確認する。絶対パスを使用すると確実です。 |
ejabberd2john.py 実行時にエラー (例: Permission denied) |
スクリプトまたはダンプファイルへの読み取り権限がない。 | chmod +r などでダンプファイルへの読み取り権限を付与する。スクリプト自体に実行権限が必要な場合は chmod +x を試す (通常は python script.py の形式なら不要)。 |
ejabberd2john.py を実行してもハッシュが出力されない (出力ファイルが空) |
ダンプファイルに有効なパスワードハッシュが含まれていない。Mnesiaのスキーマやテーブル構造が予期しない形式になっている。ejabberdのバージョンとejabberd2john の互換性がない。 |
ダンプファイルの内容を手動で確認し、passwd テーブルや関連するレコードが存在するか確認する。John the Ripper (bleeding-jumbo) の最新版を試す。ejabberdのバージョンに対応した情報やツールを探す。 |
John the Ripperがハッシュ形式を認識しない (No password hashes loaded) | ejabberd2john.py が正しくハッシュを抽出しなかった。ハッシュファイルの形式が壊れている。John the Ripperが xmpp-scram 形式をサポートしていない (古いバージョンなど)。 |
ejabberd_hashes.txt ファイルの内容を確認し、期待される形式 (例: user@domain:$xmpp-scram$... ) になっているか確認する。John the Ripperのバージョンを確認し、必要であれば最新版 (bleeding-jumbo) にアップデートする。--format=xmpp-scram オプションを明示的に指定してみる。 |
John the Ripperの実行が非常に遅い | SCRAMハッシュは意図的に計算コストが高く設計されている (特にイテレーション回数が多い場合)。ハードウェアリソース (CPU) が不足している。 | これはある程度予期される動作です。特に強力なパスワードに対しては時間がかかります。より高性能なCPUを使用する、またはGPU対応のハッシュクラッキングツール (Hashcatなど、ただし別途ハッシュ形式の変換が必要な場合あり) を検討する。John the Ripperの並列実行オプション (--fork=N ) を試す。 |
問題が解決しない場合は、John the Ripperのメーリングリストや関連コミュニティ、ejabberdのフォーラムなどで情報を探したり、質問したりすることも有効です。その際は、使用しているツールのバージョン、OS、具体的なエラーメッセージ、試した手順などを詳しく記載すると良いでしょう。
まとめ
ejabberd2john
は、ejabberdサーバーのセキュリティ監査において、ユーザーパスワードの強度を評価するための重要なツールです。Mnesiaデータベースのダンプからパスワードハッシュを抽出し、John the Ripperで解析可能な形式に変換することで、組織は潜在的な脆弱性を特定し、対策を講じることができます。
このプロセスには、ejabberdctl
を用いたMnesiaダンプの作成、ejabberd2john.py
によるハッシュ抽出、そして John the Ripper を用いた実際のパスワードクラッキング試行が含まれます。監査結果に基づき、強力なパスワードポリシーの適用、システム保護の強化、ユーザー教育を行うことが、ejabberd環境全体のセキュリティを維持するために不可欠です。
パスワードクラッキングツールの使用は、常に倫理的な範囲内で行い、許可されたシステムに対してのみ適用するようにしてください。適切な知識と手順をもってこれらのツールを活用し、安全なコミュニケーション基盤を維持しましょう。✅
コメント