はじめに
Linux環境、特にUbuntuなどでホームディレクトリの暗号化によく利用される eCryptfs。セキュリティを高める便利な機能ですが、万が一ログインパスワードを忘れてしまうと、大切なデータにアクセスできなくなる可能性があります。
そんな時に役立つ(あるいはセキュリティ監査の文脈で使われる)ツールが、パスワードクラッキングツール John the Ripper (JtR) の一部である ecryptfs2john
です。このツールは、eCryptfsのメタデータからパスワードクラックに必要な情報を抽出し、John the Ripper が解析できる形式に変換します。
このブログ記事では、ecryptfs2john
の使い方、eCryptfsの仕組み、そして関連するセキュリティ上の考慮事項について、詳しく解説していきます。パスワードを忘れて困っている方、eCryptfsのセキュリティについて理解を深めたい方の助けになれば幸いです。😊
eCryptfsとは?
eCryptfs (Enterprise Cryptographic Filesystem) は、Linuxカーネルに統合されているスタック型暗号化ファイルシステムです。これは、既存のファイルシステム(ext4, XFSなど)の上に層(レイヤー)として機能し、個々のファイルやディレクトリ単位での暗号化を実現します。
主な特徴:
- ファイル単位の暗号化: ディスク全体やパーティション全体ではなく、ファイルごとに暗号化を行います。
- 透過的な操作: 一度マウントされると、ユーザーは通常のファイルシステムと同じように暗号化されたファイルにアクセスできます。暗号化・復号はバックグラウンドで自動的に行われます。
- 柔軟性: 暗号化するディレクトリやファイルを選択できます。異なるファイルに異なる鍵を使用することも可能です(ただし一般的な設定ではあまり行われません)。
- メタデータ保存: 暗号化に関する情報(使用アルゴリズムなど)は、各ファイルのヘッダー部分に保存されます。
Ubuntuでは、インストール時に「ホームフォルダを暗号化する」オプションを選択すると、このeCryptfsが利用されます。ログイン時にユーザーパスワードを使って暗号化が解除され、ホームディレクトリ内のファイルが利用可能になります。
💡 スタック型ファイルシステムとは?
既存のファイルシステムの上に機能を追加するための仕組みです。eCryptfsの場合、下層にあるファイルシステム(例: ext4)への書き込み・読み込み要求を途中で捉え、暗号化・復号処理を挟んでから実際のファイルシステムへデータを渡します。
eCryptfsの仕組み:鍵管理の概要 🔑
eCryptfsの動作を理解するには、鍵の管理方法を知ることが重要です。主に以下の要素が関わってきます。
- ログインパスフレーズ (Login Passphrase): これはユーザーがシステムにログインする際に使用するパスワードです。
- マウントパスフレーズ (Mount Passphrase): 実際にファイルシステムを暗号化・復号するために使用される、より強力なパスフレーズ(鍵)。通常はランダムに生成されます。これは「FEK (File Encryption Key)」とも呼ばれます。
- ラップされたパスフレーズ (Wrapped Passphrase): マウントパスフレーズ(FEK)は、そのままディスクに保存されるわけではありません。セキュリティを高めるため、ログインパスフレーズを使ってさらに暗号化(ラップ)されます。この暗号化されたマウントパスフレーズが、
wrapped-passphrase
というファイルに保存されます。 - ファイルヘッダーメタデータ: 各暗号化ファイルには、そのファイルを復号するために必要な情報(例えば、使用された暗号化アルゴリズムなど)を含むヘッダーが付加されます。
処理の流れ(ホームディレクトリ暗号化の場合):
- ユーザーがログインパスワードを入力します。
- システムは、このログインパスワードとソルト(salt – パスワードハッシュ化を強化するためのランダムなデータ)を使って、
wrapped-passphrase
ファイルを復号します。 wrapped-passphrase
ファイルが復号されると、元のマウントパスフレーズ(FEK)が得られます。- このマウントパスフレーズがカーネルのキーリングに追加され、eCryptfsファイルシステムのマウント(アクセス可能にすること)に使用されます。
- ファイルへのアクセス要求があると、カーネルキーリングにあるマウントパスフレーズと、ファイルヘッダーのメタデータを使って、ファイルの暗号化・復号が透過的に行われます。
重要な点は、ログインパスワードがマウントパスフレーズを保護しているという構造です。したがって、ログインパスワードが漏洩したり、推測されやすいものだったりすると、wrapped-passphrase
ファイルからマウントパスフレーズを復元され、暗号化されたデータにアクセスされるリスクがあります。
eCryptfsでは、ファイル名の暗号化のために別の鍵 (FNEK: File Name Encryption Key) も使用される場合があります。
~/.ecryptfsrc
)で指定しない限り、多くの環境(特にUbuntuのホームディレクトリ暗号化のデフォルト設定)では固定のソルト値(0x0011223344556677
)が使われることがあります。これは、パスワードクラッキングの観点からは、事前計算(レインボーテーブルなど)による攻撃を容易にする可能性があります。
ecryptfs2johnとは?
ecryptfs2john
は、強力なパスワードクラッキングツールである John the Ripper (JtR) スイートに含まれるユーティリティスクリプト(多くの場合Pythonスクリプト)です。
その主な目的は、eCryptfsの wrapped-passphrase
ファイルを読み込み、その中に含まれる情報(暗号化されたマウントパスフレーズ、ソルトなど)を抽出して、John the Ripper が理解できる形式のハッシュ文字列に変換することです。
John the Ripper は、このハッシュ文字列を入力として受け取り、様々な手法(辞書攻撃、ブルートフォース攻撃、ルールベース攻撃など)を用いて、wrapped-passphrase
ファイルを暗号化(ラップ)するために使用された元のパスワード(通常はユーザーのログインパスワード)を推測しようと試みます。
つまり、ecryptfs2john
は、eCryptfsの暗号化解除プロセスにおける「準備段階」を担当するツールと言えます。🔒➡️🔓
このツールは、John the Ripper の “jumbo” バージョンに含まれていることが一般的です。
ecryptfs2johnの使い方
ecryptfs2john
を使用する手順は、比較的シンプルです。
1. 必要なファイルの特定と取得
まず、John the Ripper でクラックを試みる対象となる wrapped-passphrase
ファイルを見つける必要があります。このファイルは通常、以下の場所に存在します。
/home/.ecryptfs/<ユーザー名>/.ecryptfs/wrapped-passphrase
- あるいは、ユーザーのホームディレクトリ直下の隠しディレクトリ内:
~/.ecryptfs/wrapped-passphrase
<ユーザー名>
の部分は、暗号化されたホームディレクトリを持つユーザーのアカウント名に置き換えてください。
もしシステムが起動しないなどの理由で直接アクセスできない場合は、Live USBなどから起動し、該当するディスクパーティションをマウントしてから、上記のパスを探します。例えば、元のルートファイルシステムが /mnt/target
にマウントされている場合、パスは /mnt/target/home/.ecryptfs/<ユーザー名>/.ecryptfs/wrapped-passphrase
のようになります。
ファイルが見つからない場合は、find
コマンドで探すこともできます:
sudo find / -name wrapped-passphrase
(システム全体を検索するため、時間がかかる場合があります)
この wrapped-passphrase
ファイルを作業用のディレクトリにコピーしておくと良いでしょう。
2. ecryptfs2johnの実行
ecryptfs2john
スクリプト(通常は John the Ripper の run
ディレクトリ内にあります)を実行し、引数として wrapped-passphrase
ファイルのパスを指定します。出力をファイルにリダイレクトして保存します。
# John the Ripper の run ディレクトリに移動してから実行する場合
cd /path/to/john/run
./ecryptfs2john /path/to/your/wrapped-passphrase > ecryptfs_hash.txt
# あるいは直接スクリプトを指定して実行
/path/to/john/run/ecryptfs2john /path/to/your/wrapped-passphrase > ecryptfs_hash.txt
これにより、ecryptfs_hash.txt
というファイル(名前は任意)に、John the Ripper が解析可能な形式のハッシュ文字列が出力されます。
出力されるハッシュ文字列は、通常以下のような形式になっています:
<filename>:$ecryptfs$<format_version>$<cipher_type>$<salt>$<encrypted_data_signature>
例:
wrapped-passphrase:$ecryptfs$0$1$0011223344556677$21ff10301b5457e1...
この文字列には、ファイル名、eCryptfsハッシュであることを示すマーカー、フォーマットバージョン、暗号タイプ、使用されたソルト、そして実際にクラックの対象となる暗号化されたデータのシグネチャ(署名)が含まれています。
3. John the Ripperでのクラック実行
ecryptfs2john
で生成したハッシュファイルを使って、John the Ripper を実行します。
john ecryptfs_hash.txt
John the Ripper は自動的にハッシュタイプ (eCryptfs
) を認識し、クラック処理を開始します。
より効率的にクラックを行うために、様々なオプションを指定できます:
- 単語リスト(辞書)を使用する:
john --wordlist=/path/to/password.lst ecryptfs_hash.txt
- ルールを適用する (単語リストと併用):
john --wordlist=/path/to/password.lst --rules=Jumbo ecryptfs_hash.txt
- インクリメンタルモード(ブルートフォース)を使用する:
john --incremental ecryptfs_hash.txt
- 特定のマスク(文字種や長さのパターン)を使用する:
(この例では、小文字4文字 + 数字2文字のパターンを試行)john --mask='?l?l?l?l?d?d' ecryptfs_hash.txt
- 複数のCPUコアを使用する (OpenMPが有効な場合):
(4つのプロセスで並列実行)john --fork=4 ecryptfs_hash.txt
パスワードのクラックには、パスワードの複雑さや使用するマシンの計算能力によって、数秒から数日、あるいはそれ以上かかる場合があります。🤯
クラックに成功すると、John the Ripper は以下のように表示します:
Loaded 1 password hash (eCryptfs [SHA512 ...])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
your_password_here (wrapped-passphrase) <-- ここにクラックされたパスワードが表示される
1g 0:00:00:15 DONE (2025-03-31 07:30) 0.0666g/s 123.4p/s 123.4c/s 123.4C/s foobar..pass123
Session completed
クラックされたパスワード(上記の例では your_password_here
)が、元のログインパスワードです。これを使えば、eCryptfsで暗号化されたデータにアクセスできるはずです。
後でクラックされたパスワードを確認するには、--show
オプションを使用します:
john --show ecryptfs_hash.txt
使用例シナリオ:パスワードを忘れたUbuntuのホームディレクトリを回復
ここでは、Ubuntuのログインパスワードを忘れてしまい、暗号化されたホームディレクトリにアクセスできなくなった状況を想定し、ecryptfs2john
と John the Ripper を使って回復を試みる手順を解説します。
-
Live USB/DVDから起動: まず、Ubuntuのインストールメディアなどを使って、Live環境でコンピュータを起動します。元のシステムを直接起動できないため、外部メディアから起動する必要があります。
-
内蔵ディスクのマウント: Live環境が起動したら、ファイルマネージャーやコマンドラインを使って、内蔵ハードディスク/SSDのルートパーティション(
/
)と、場合によってはホームパーティション(/home
)をマウントします。マウントポイントは例えば/mnt/mydisk
などになります。# デバイス名を特定 (例: /dev/sda2) sudo lsblk # マウントポイントを作成 sudo mkdir /mnt/mydisk # マウント実行 (ファイルシステムタイプに合わせて調整) sudo mount /dev/sda2 /mnt/mydisk
(デバイス名やパーティション構成は環境によって異なります)
-
wrapped-passphrase
ファイルの特定とコピー: マウントしたディスクから、対象ユーザーのwrapped-passphrase
ファイルを探します。通常は/mnt/mydisk/home/.ecryptfs/<ユーザー名>/.ecryptfs/wrapped-passphrase
にあります。このファイルをUSBメモリなど、Live環境からアクセスできる場所にコピーします。cp /mnt/mydisk/home/.ecryptfs/your_username/.ecryptfs/wrapped-passphrase /media/ubuntu/USB_STICK/
-
John the Ripper の準備: Live環境に John the Ripper がインストールされていない場合は、インストールするか、別の John the Ripper がインストールされたマシンに
wrapped-passphrase
ファイルを移動します。インストールは通常、以下のコマンドで行えます(Live環境でインターネット接続が必要)。sudo apt-get update sudo apt-get install john
-
ecryptfs2john
の実行: コピーしたwrapped-passphrase
ファイルを使ってハッシュを生成します。# John the Ripper の run ディレクトリは /usr/share/john/ などにある場合がある # find / -name ecryptfs2john.py などで場所を探す /path/to/john/run/ecryptfs2john /media/ubuntu/USB_STICK/wrapped-passphrase > /media/ubuntu/USB_STICK/ecryptfs_hash.txt
-
John the Ripper でクラック実行: 生成されたハッシュファイルを使ってクラックを開始します。
john /media/ubuntu/USB_STICK/ecryptfs_hash.txt
(必要に応じて
--wordlist
などのオプションを追加します) -
パスワードの特定と利用: クラックが成功すれば、元のログインパスワードが判明します。これでシステムを再起動し、判明したパスワードでログインすれば、暗号化されたホームディレクトリにアクセスできるはずです。
-
代替手段 (ecryptfs-recover-private): Ubuntuには
ecryptfs-recover-private
という専用の回復ツールもあります。これもLive環境から実行でき、暗号化されたプライベートディレクトリを検索し、ログインパスワード(またはマウントパスフレーズを知っていればそれ)を入力することでマウントを試みます。パスワードを完全に忘れた場合はJohn the Ripperが必要ですが、単純なマウント問題の場合はこちらが簡単な場合があります。sudo ecryptfs-recover-private /mnt/mydisk/home/.ecryptfs/your_username/.Private
このコマンドを実行すると、パスワードの入力を求められます。
🚨 注意: パスワードクラッキングは計算資源と時間を大量に消費する可能性があります。特に複雑なパスワードの場合、成功する保証はありません。また、他人のシステムに対して無許可でこれらのツールを使用することは、法的に問題となる可能性があります。
セキュリティ上の考慮事項と対策
ecryptfs2john
の存在は、eCryptfsのセキュリティに関する重要な示唆を与えます。
- ログインパスワードの重要性: eCryptfsのセキュリティは、実質的にログインパスワードの強度に大きく依存しています。
wrapped-passphrase
ファイル自体へのアクセス権があれば、オフラインでパスワードクラックを試行できるため、推測しやすいパスワードは非常に危険です。 wrapped-passphrase
ファイルの保護: このファイルへの不正アクセスは、暗号化解除の試みを可能にします。物理的なアクセス制限、強力なファイルパーミッション設定が重要です。- ソルトの問題: デフォルトの固定ソルトが使われている場合、レインボーテーブルなどの事前計算攻撃に対する耐性が低下します。可能であれば、カスタムソルトの使用を検討することも一つの対策ですが、Ubuntuのホームディレクトリ暗号化の標準設定では難しい場合があります。
- オフライン攻撃のリスク: ディスクやバックアップが物理的に盗難された場合、
wrapped-passphrase
ファイルが取得され、時間をかけてパスワードクラックが行われる可能性があります。
対策:
- 強力なログインパスワードの使用: 長く、複雑で、推測困難なパスワードを設定することが最も重要です。大文字、小文字、数字、記号を組み合わせ、十分な長さ(例: 15文字以上)を確保しましょう。パスワードマネージャーの利用も有効です。
- 物理的セキュリティの確保: コンピュータやバックアップメディアへの物理的なアクセスを制限します。
- フルディスク暗号化 (FDE) との併用: LUKS/dm-cryptのようなフルディスク暗号化とeCryptfsを組み合わせることで、OSが起動する前の段階でもデータが保護され、
wrapped-passphrase
ファイルへのアクセス自体が困難になります。(ただし、設定はより複雑になります) - 定期的なパスワード変更: 定期的にパスワードを変更することで、万が一漏洩した場合のリスクを低減できます。
- マウントパスフレーズのバックアップ:
ecryptfs-unwrap-passphrase
コマンドを使って、暗号化されていないマウントパスフレーズを表示し、安全な場所に別途保管しておくことで、ログインパスワードを忘れた場合の最終的な回復手段となります。(このマウントパスフレーズ自体の管理は非常に重要です!)
これを実行するとログインパスワードの入力を求められ、成功するとマウントパスフレーズが表示されます。ecryptfs-unwrap-passphrase ~/.ecryptfs/wrapped-passphrase
まとめ
ecryptfs2john
は、eCryptfsで暗号化されたデータ(特にUbuntuのホームディレクトリなど)に関連するパスワード回復やセキュリティ監査において、重要な役割を果たすツールです。wrapped-passphrase
ファイルからJohn the Ripperが解析できるハッシュ情報を抽出し、ログインパスワードのクラッキング試行を可能にします。
このツールの存在は、eCryptfsのセキュリティがユーザーのログインパスワード強度に大きく依存していることを示しています。したがって、eCryptfsを利用する場合は、強力なパスワードの設定と、wrapped-passphrase
ファイルを含むシステム全体の適切な保護が不可欠です。
パスワードを忘れてしまった場合の回復手段として役立つ可能性がある一方で、悪用されればセキュリティリスクにもなり得るため、その仕組みと影響を理解しておくことが重要です。🛡️
参考情報
- John the Ripper official website: https://www.openwall.com/john/
- eCryptfs – ArchWiki (日本語): https://wiki.archlinux.jp/index.php/ECryptfs (eCryptfsの仕組みや使い方に関する詳細情報)
- ecryptfs2john.py source code (Example): https://github.com/openwall/john/blob/bleeding-jumbo/run/ecryptfs2john.py
コメント