Ansible Vault で暗号化されたファイルのパスワードを解析する方法を学びます。
はじめに:Ansible Vault とパスワードクラック
Ansible Vault は、Ansible のプレイブックや変数ファイル内でパスワード、APIキー、証明書などの機密データを安全に保管するための機能です。データを暗号化することで、リポジトリなどで安全に管理できるようになります。✨
しかし、時には正当な理由で Vault のパスワードを回復する必要が出てくることがあります。例えば、パスワードを忘れてしまった場合や、セキュリティ監査の一環としてパスワードの強度をテストしたい場合などです。
このような状況で役立つのが、John the Ripper (JtR) という強力なパスワードクラッキングツールと、そのスイートに含まれる ansible2john
スクリプトです。このブログ記事では、ansible2john
を使って Ansible Vault ファイルからパスワードハッシュを抽出し、John the Ripper でそのパスワードを解読する方法を詳しく解説します。
ansible2john とは? 🤔
ansible2john
は、John the Ripper スイート(特に “community-enhanced” または “Jumbo” バージョン)に含まれるユーティリティスクリプトです。その主な役割は、Ansible Vault で暗号化されたファイル(通常は .yml
ファイル)を読み込み、そのファイルを開くために必要なパスワードの「ハッシュ」を抽出することです。
Ansible Vault は AES256 暗号化を使用しており、パスワードから暗号化キーを生成する際には PBKDF2-HMAC-SHA256 のような鍵導出関数が使われています。ansible2john
は、Vault ファイル内のメタデータ(ソルト、暗号化されたデータの一部など)を解析し、John the Ripper が理解できる特定のフォーマット(通常は $ansible$
で始まる文字列)に変換します。
この変換されたハッシュ文字列があれば、John the Ripper は様々な攻撃手法(辞書攻撃、ブルートフォース攻撃など)を用いて元のパスワードを推測できます。
ansible2john
は通常、John the Ripper のインストールディレクトリ内の run
サブディレクトリに Python スクリプト (ansible2john.py
) として配置されています。
準備するもの 🛠️
ansible2john
を使用して Ansible Vault のパスワードをクラックするには、以下の準備が必要です。
-
John the Ripper (Jumbo バージョン) のインストール:
ansible2john
は、標準の John the Ripper ではなく、多くの追加フォーマットをサポートする “Jumbo” パッチが適用されたバージョンに含まれています。Kali Linux などのペネトレーションテスト用ディストリビューションには、通常プリインストールされています。他の Linux ディストリビューションでは、パッケージマネージャー(例:
sudo apt install john
やsudo dnf install john
)でインストールできる場合がありますが、最新の Jumbo バージョンが必要な場合は、Openwall の公式ウェブサイトからソースコードをダウンロードしてコンパイルするか、コミュニティが提供するバイナリを使用する必要があります。# Debian/Ubuntu系 sudo apt update sudo apt install john # Fedora/RHEL系 sudo dnf install john # またはソースからビルド (公式サイト参照)
-
ansible2john
スクリプトの確認:
John the Ripper (Jumbo) がインストールされたら、ansible2john
スクリプト(通常はansible2john.py
)の場所を確認します。多くの場合、John the Ripper のインストールディレクトリ内のrun
フォルダにあります。# 一般的な場所の例 (環境によって異なります) ls /usr/share/john/ansible2john.py # または find / -name ansible2john.py 2>/dev/null などで探す
見つからない場合は、John the Ripper のインストールが Jumbo バージョンであるか、または完全に行われたかを確認してください。
-
対象となる Ansible Vault ファイル:
パスワードを解析したい Ansible Vault で暗号化されたファイル(例:secrets.yml
,group_vars/all/vault.yml
など)を用意します。このファイルは通常、以下のような形式で始まります。$ANSIBLE_VAULT;1.1;AES256 33363333623932346263303063323861383332643661656439316266613461623864633636643132 ... (暗号化されたデータが続く) ...
ansible2john の基本的な使い方 🚀
ansible2john
の使い方は非常にシンプルです。基本的には、スクリプトを実行し、引数として対象の Ansible Vault ファイルを指定します。
コマンド構文
ansible2john
スクリプトが Python スクリプト (.py
) であり、実行権限がない場合や、直接実行できない場合は python
(または python3
) コマンドで実行します。
python /path/to/john/run/ansible2john.py /path/to/your/vault_file.yml
もしスクリプトに実行権限が付与されており、PATH が通っている場所にあるか、カレントディレクトリにある場合は、直接実行できることもあります。
/path/to/john/run/ansible2john /path/to/your/vault_file.yml
実行例と出力
例えば、secrets.yml
という名前の Vault ファイルがあるとします。ansible2john.py
が /usr/share/john/
にある場合、以下のように実行します。
python3 /usr/share/john/ansible2john.py secrets.yml
成功すると、標準出力に John the Ripper が解読できる形式のハッシュ文字列が出力されます。この文字列は通常、以下のような形式をしています。
secrets.yml:$ansible$0*1*AES256*b1f7a474...*c9a8d7e6...*6f3a...:...
この出力形式の各フィールドは、暗号化に関する情報(バージョン、暗号アルゴリズム、ソルト、暗号化データの一部など)を含んでいます。
secrets.yml:
: 元のファイル名(John the Ripper が表示用に使うことがあります)。$ansible$
: ハッシュの種類を示す識別子。0*1*AES256*...
: 暗号化のバージョン、方式、ソルト、暗号化データなどの情報が含まれます。
この出力されたハッシュ文字列を、次のステップで John the Ripper に渡します。
John the Ripper でハッシュをクラックする 🔓
ansible2john
でハッシュ文字列を抽出したら、いよいよ John the Ripper を使って実際のパスワードクラッキングを行います。
1. ハッシュをファイルに保存
ansible2john
の出力をファイルに保存すると、後の作業がしやすくなります。リダイレクト(>
)を使ってファイルに保存しましょう。
python3 /usr/share/john/ansible2john.py secrets.yml > ansible_hash.txt
これで、ansible_hash.txt
というファイルにハッシュ文字列が保存されました。
2. John the Ripper を実行
John the Ripper を実行して、保存したハッシュファイルに対するパスワードクラックを開始します。最も基本的な実行方法は以下の通りです。
john ansible_hash.txt
このコマンドを実行すると、John the Ripper はデフォルトのモード(シングルクラックモード、辞書モード、インクリメンタルモード)を順番に試します。
辞書攻撃 (Wordlist Mode)
特定のパスワードリスト(辞書ファイル)を使ってクラッキングを試みる場合は、--wordlist
オプションを使用します。これは、よく使われるパスワードや関連性の高い単語リストがある場合に効果的です。有名な辞書ファイルとして rockyou.txt
などがあります。
john --wordlist=/path/to/your/passwords.lst ansible_hash.txt
# 例: rockyou.txt を使う場合 (Kali Linux などに存在することが多い)
john --wordlist=/usr/share/wordlists/rockyou.txt ansible_hash.txt
--rules
オプションを組み合わせることで、辞書の単語に特定の変換ルール(大文字小文字変換、数字の追加など)を適用し、より多くのパスワード候補を試すことができます。
john --wordlist=/usr/share/wordlists/rockyou.txt --rules ansible_hash.txt
インクリメンタルモード (Incremental Mode)
可能な文字の組み合わせをすべて試すブルートフォース攻撃に近いモードです。--incremental
オプションで指定します。時間はかかりますが、辞書にないパスワードも見つけられる可能性があります。
john --incremental ansible_hash.txt
3. 結果の確認
John the Ripper がパスワードを見つけると、通常はターミナルに表示され、$JOHN/john.pot
ファイル(John the Ripper の作業ディレクトリにあるポットファイル)に記録されます。
クラックが完了した後や、途中で中断した場合でも、--show
オプションを使って、そのハッシュファイルに対して既に見つかったパスワードを表示できます。
john --show ansible_hash.txt
出力例:
secrets.yml:ThisIsThePassword123
1 password hash cracked, 0 left
この例では、secrets.yml
のパスワードが ThisIsThePassword123
であることがわかりました 🎉。
もしパスワードが見つからなければ、「0 password hashes cracked」のようなメッセージが表示されます。
高度なヒントと注意点 💡
複数の Vault ファイル
プロジェクト内で複数の Vault ファイルが同じパスワードで暗号化されている場合、ansible2john
をそれぞれのファイルに対して実行し、得られたハッシュをすべて一つのファイルにまとめて John the Ripper に渡すことができます。
python3 /usr/share/john/ansible2john.py vault1.yml > all_hashes.txt
python3 /usr/share/john/ansible2john.py group_vars/prod/vault.yml >> all_hashes.txt
python3 /usr/share/john/ansible2john.py roles/db/vars/vault.yml >> all_hashes.txt
john all_hashes.txt
ただし、Ansible Vault では Vault ID を使ってファイルごとに異なるパスワードを設定することも可能です。その場合、各ファイルに対応するハッシュは個別にクラックする必要があります。ansible2john
が Vault ID を正しく処理し、ハッシュに含めるか確認することが重要です。
パスワードの複雑さとクラック時間
Ansible Vault のパスワードクラックにかかる時間は、パスワードの長さと複雑さに大きく依存します。
- 短い・単純なパスワード: 数秒から数分で見つかる可能性があります。
- 中程度の長さ・複雑さのパスワード: 数時間から数日かかる可能性があります。
- 非常に長い・複雑なパスワード: 数週間、数ヶ月、あるいはそれ以上かかる可能性があり、現実的な時間内での解読は困難になることがあります。
強力なGPUを持っている場合、John the Ripper の代わりに Hashcat を利用することも検討できます。Hashcat は GPU アクセラレーションに優れており、特定の種類のハッシュ(Ansible Vault はモード 16900
)のクラックを大幅に高速化できる場合があります。ansible2john
で生成したハッシュは、多くの場合 Hashcat でも利用可能です。
# Hashcatでの実行例 (別途インストールが必要)
# -m 16900 は Ansible Vault のハッシュタイプ
hashcat -m 16900 ansible_hash.txt /path/to/your/passwords.lst
パフォーマンスに関する考慮事項
パスワードクラッキングは計算資源(特にCPU、場合によってはGPU)を大量に消費します。長時間のクラッキングを行う場合は、マシンの冷却や電力消費に注意してください。John the Ripper は --fork=N
オプションで複数のCPUコアを利用して処理を並列化できます。
# 4つのプロセスで並列実行する例
john --fork=4 ansible_hash.txt
⚠️ 法的および倫理的な考慮事項 ⚠️
重要: パスワードクラッキングツール(John the Ripper, Hashcat, ansible2john など)の使用は、法的な影響や倫理的な問題を引き起こす可能性があります。
- これらのツールは、自身が所有しているか、明示的な許可を得ているシステムやデータに対してのみ使用してください。
- 他人のアカウントやシステムのパスワードを許可なく解析しようとする行為は、多くの国や地域で違法であり、深刻な罰則の対象となる可能性があります。
- 組織内でセキュリティテストとして実施する場合でも、必ず事前に書面による許可を取得し、定められたルールと範囲内で実施してください。
- ツールの使用にあたっては、常に現地の法律、組織のセキュリティポリシー、そして倫理的な規範を遵守してください。
責任ある使用を心がけてください。
まとめ
ansible2john
は、Ansible Vault で保護されたファイルのパスワードを回復したり、セキュリティ強度をテストしたりする必要がある場合に非常に便利なツールです。John the Ripper と組み合わせることで、Vault ファイルから抽出したハッシュ情報をもとに、元のパスワードを特定する試みを行うことができます。
手順の要約:
- John the Ripper (Jumbo バージョン) をインストールする。
ansible2john
スクリプトを使って、対象の Vault ファイルからハッシュを抽出する (例:python3 ansible2john.py secrets.yml > hash.txt
)。- John the Ripper を使って、抽出したハッシュをクラックする (例:
john hash.txt
やjohn --wordlist=wordlist.txt hash.txt
)。 john --show hash.txt
で結果を確認する。
パスワードクラッキングには時間がかかる場合があり、成功が保証されるわけではありません。しかし、適切な状況と許可のもとで使用すれば、ansible2john
と John the Ripper は強力な味方となります 💪。常に法的・倫理的な側面を考慮し、責任を持ってツールを使用しましょう。
参考情報
より詳しい情報については、以下の公式ドキュメントやリソースを参照してください。
- John the Ripper 公式サイト: https://www.openwall.com/john/
- John the Ripper Community Wiki: (公式サイト内からリンクされている場合があります)
- Ansible Vault ドキュメント: https://docs.ansible.com/ansible/latest/user_guide/vault.html
コメント