6.3. 暗号化ファイルシステム
6.3.1. 暗号化ファイルシステムの基本概念
ディスク暗号化の基礎
ディスク全体の暗号化は盗難や偶発的な紛失の場合にディスクを保護する。
ディスク全体の暗号化では、スワップファイル、システムファイル、休止状態ファイルを含むディスク全体が暗号化される。
暗号化されたディスクが紛失、盗難された場合でも、ドライブの暗号化状態は変更されず、許可されたユーザーのみがその内容にアクセスできる。
ファイルの暗号化では起動中にシステムにログインし、その後コンピュータを放置した場合、権限のないユーザーはディスク上の任意のファイルを開くことができないようにできる。
ブロックデバイス暗号化とファイルシステム暗号化の違い
暗号化ファイルシステムは、暗号化が適用されるレイヤーによって「ブロックデバイス暗号化」と「ファイルシステムレベル暗号化」に分類される。
ブロックデバイス暗号化
dm-crypt/LUKSなどが該当。
- 利点/特徴- ディスク全体(パーティション、論理ボリュームなど)を単一のブロック単位で暗号化する。このレベルで暗号化されるため、データはファイルシステムメタデータ(ディレクトリ構造、ファイル名)を含め、すべて隠蔽される。
- システム全体のセキュリティを確保するのに最適。
 
- 主なツール- dm-crypt(カーネル機能)とLUKS(鍵管理標準)を連携して使用する。
- cryptmountも使用可能。
 
- ユースケース- システム全体の暗号化(ルートパーティション)、スワップパーティション、データボリュームなど、機密性の高いディスク全体を保護する場合
 
ファイルシステムレベル暗号化
eCryptfs/EncFSなどが該当。
- 利点/特徴- 既存のファイルシステムの上に透過的な暗号化層を作成し、ファイルやディレクトリ単位で暗号化する。柔軟性が高く、個々のユーザーやディレクトリごとに暗号化設定が可能。
- 暗号化されたファイルは、そのメタデータ(ファイル名、タイムスタンプなど)も暗号化される。
 
- 主なツール- eCryptfs(カーネルモード、PAM連携)、EncFS(FUSEベース)。
 
- ユースケース- 個々のユーザーのホームディレクトリ暗号化(Ubuntuなどで標準的)、特定の機密データディレクトリのみの暗号化。
 
ディスク暗号化ツール
| 分類 | ツール名 | 特徴 | 
|---|---|---|
| ブロックデバイス | dm-crypt/LUKS | Linuxの標準的なディスク暗号化。ディスク全体を保護。 | 
| ブロックデバイス | cryptmount | エンドユーザー向けの管理ツール。暗号化されたボリュームの準備とマウント/ | 
| ファイルシステム | eCryptfs | ファイルシステムレベルの透過的な暗号化。PAM連携によるホームディレクトリ暗号化に利用される。 | 
| ファイルシステム | EncFS | FUSEベースのファイルシステム暗号化。スーパーユーザー以外も利用しやすい。 | 
6.3.2. dm-crypt/LUKSによるブロックデバイスの暗号化
dm-cryptの基本
dm-cryptはブロックデバイスの暗号化を行う暗号化の方法の1つ。 dm、すなわちdevice-mapper(デバイスマッパー)の暗号化機能を使ってデバイス全体に対する暗号化を行う。
dm-cryptを扱うための主要なユーティリティは以下の2つ。
- cryptsetup: 暗号化デバイスの作成・管理・各種操作。dm-cryptのフロントエンドとして機能する。
- cryptmount: 暗号化ファイルシステムのマウント・アンマウントなどを行う代替ツール。
plainモードのdm-cryptの知識と利用ケース
cryptsetupコマンドでは、暗号化のタイプとしてplain(plain dm-crypt)モードとLUKSモードを選択することができる。
plainモードは、パスフレーズや鍵情報、暗号化メタデータをブロックデバイスのヘッダに書き込まず、外部で管理する最も基本的な暗号化方式。
- 利用ケース: 暗号化ディスクのメタデータを隠したい場合や、LUKSをサポートしないブートローダーと連携させる必要がある場合。
- 課題: 復号に必要なヘッダ情報がないため、パスフレーズや暗号化アルゴリズムを手動で正確に指定しないと復号できない。
LUKS (Linux Unified Key Setup)
LUKS(Linux Unified Key Setup:ラックス)とはLinuxにおけるディスク暗号化の標準仕様で、dm-cryptを用いて実装されている。
LUKSはファイルシステムに依存しておらず、ext4、Btrfs、さらにSWAP領域を暗号化することも可能である。
LUKSの役割とdm-crypt Plainモードとの違い(キー管理メタデータ)
| 特徴 | LUKSモード | plainモード | 
|---|---|---|
| キー管理 | 暗号化メタデータ(LUKSヘッダ)をデバイス内に保存し、鍵の管理を行う。 | パスフレーズや暗号化設定を外部で手動管理する必要がある。 | 
| パスフレーズ | 8つまでの異なるパスフレーズを一つのデバイスに設定可能(キースロット)。 | 1つのパスフレーズ、または鍵ファイルのみを使用。 | 
| 移植性 | 高い。LUKSヘッダを見ることで、暗号化設定を自動的に認識できる。 | 低い。設定を外部で覚えておく必要がある。 | 
LUKS1のアーキテクチャと機能
- 初期のLUKS標準規格。現在のLinux環境の多くでサポートされている。
- 最大8つのキースロットを持ち、多様な復号キー(パスフレーズやキーファイル)をサポート。
LUKS2の知識と、LUKS1からの主な改善点
- 新しい標準規格。JSON形式のメタデータを使用し、柔軟性と信頼性を向上。
- 冗長なメタデータヘッダをサポートし、メタデータ破損からの回復力(リカバリ機能)が強化されている。
- 認証技術(Anti-forensic のサポートなど)の拡張。
LUKSの構築と管理
cryptsetupコマンド
ブロックデバイスまたはループバックデバイスに対して暗号化ファイルシステムの利用を行うコマンド。
cryptsetup <アクション> <アクションごとのオプション>plainモードはLUKSなどの暗号化オプションを使用しない標準の利用方法。
| アクション【plainモード】 | 説明 | 
|---|---|
| open –type plain デバイス名 名称 | マッピング名とデバイスを指定して暗号化マッピングの作成 | 
| close 名前 / remove 名前 | 暗号化マッピングの削除 | 
| resize 名前 | 暗号化マッピングのサイズ変更 | 
| status 名前 | 暗号化マッピングの状態表示 | 
LUKSモードはLinuxの標準暗号化規格のLUKSを使用したモード
| アクション【LUKSモード】 | 説明 | 
|---|---|
| luksFormat デバイス名 | デバイスをLUKSパーティションとして初期化 | 
| luksOpen デバイス名 名前 | デバイスとLUKSパーティション名を指定しLUKSパーティションを開く | 
| luksClose 名前 | Luksパーティションを閉じる | 
| luksAddkey デバイス名 キーファイル名 | LUKSパーティションにパスフレーズを追加 | 
| luksKillSlot デバイス名 キースロット番号 luksDelKey デバイス名 キースロット番号 | LUKSパーティションから設定したパスフレーズを削除 | 
| luksDump デバイス名 | LUKSパーティションの状態表示 | 
| isLuks デバイス名 | デバイスがLUKSパーティションの場合は真をそうでない場合は偽を返す | 
# ===========================================
## LUKSモードを使用した暗号化パーティションの設定
# ===========================================
# 暗号化パーティションを初期化して作成
cryptsetup luksFormat /dev/sdb1
# 暗号化パーティションのヘッダー情報を確認
cryptsetup luksDump /dev/sdb1
# 暗号化済みパーティションを開く
cryptsetup luksOpen /dev/sdb1 lukstest
# ファイルシステムの作成/マウント
mkfs -t ext4 /dev/mapper/lukstest
mkdir /mnt/lukstest
mount /dev/mapper/lukstest /mnt/lukstest/
# ============================
# 暗号化パーティションを閉じる
# ============================
unmount /mnt/lukstest
cryptsetup luksClose lukstest
ls /dev/mapper # LuksCloseの確認
# ============================
# パスワードの追加
# ============================
cryptsetup luksAddKey /dev/sdb1
cryptsetup luksDump /dev/sdb1 # ヘッダ情報の確認
# ============================
# パスワードの削除
# ============================
cryptsetup luksKillSlot /dev/sdb1 0
cryptsetup luksDump /dev/sdb1 # ヘッダ情報の確認
# ===========================================
## 暗号化パーティションをOS起動時に自動マウント
# ===========================================
# キーファイルの作成とそれをパスワードの代わりに使用
dd bs=512 count=4 if=/dev/urandom of=/etc/lukstestkey
cryptsetup luksAddKey /dev/sdb1 /etc/lukkstestkey
# /etc/crypttabに以下のマウント情報を追加
lukstest /dev/sdb1 /etc/lukstestkey luks,timeout=180
# /etc/fstabにマウント情報を追加
/dev/mapper/lukstest /mnt/lukstest ext4 defaults 1 3cryptmountコマンド
ブロックデバイスまたはループバックデバイスに対して暗号化ファイルシステムを作成するコマンド。
- ファイルシステムとSwap両方の暗号化が可能
- 暗号化されたファイルシステムは通常のファイルシステム同様にブロックデバイスに格納可能
- 暗号化領域の作成にはルート権限が必要、その後の利用は一般ユーザでも可能
cryptmount [オプション] [ターゲット]| オプション | 説明 | 
|---|---|
| -m | ターゲットのマウント | 
| -u | ターゲットのアンマウント | 
| -S | ターゲットのマウント状況の表示 | 
| -l | 利用可能なターゲットの基本情報の表示 | 
| -s | ターゲットのスワップ領域の有効化 | 
| -x | ターゲットのスワップ領域の無効化 | 
| -p | ターゲットに対するデバイスの準備 | 
| -r | ターゲットから全デバイスの開放 | 
| -c | ターゲットのパスワード変更 | 
| -g | 復号キーの作成 | 
# 暗号キーファイルの作成
cryptmount --generate-key 32 crypttest
# /dev/mapperにデバイスをマッピング
cryptmount --prepare crypttest
# ターゲットの基本情報の表示
cryptmount --list
# 暗号化ファイルシステムのマウント
cryptmount -m crypttestcryptsetupによる暗号化デバイスの利用方法
cryptsetupを用いて暗号化デバイス(パーティション)を利用する流れは以下の通り
- (LUKSモード利用時)luksFormatによるパーティションの初期化- cryptsetup luksFormal /dev/sdb2
 
- openまたはluksOpenによる暗号化マッピングの作成- cryptsetup open --type plain /devsdb1 dm01
- cryptsetup luksOpen /dev/sdb2 dm02
 
- mkfsおよびパーティションのマウント- mkfs.ext4 /dev/mapper/dm02
- mount /dev/mapper/dm02 /mnt/luks
 
なお利用終了時は、アンマウントし暗号化マッピングを削除する。
- パーティションのアンマウント- unmount /mnt/luks
 
- closeまたはluksCloseによる暗号化マッピングの削除- cryptsetup close dm01
- cryptsetup luksClose dm02
 
LUKSデバイスの利用手順 (luksOpen後)
- cryptsetup luksOpen /dev/sdb1 lukstest
- ファイルシステムを作成: mkfs -t ext4 /dev/mapper/lukstest
- マウント: mount /dev/mapper/lukstest /mnt/lukstest/
LUKSボリュームの自動マウント設定: /etc/crypttabの利用
- /etc/crypttab:- cryptsetupで設定した暗号化ボリュームをOS起動時に自動的にマウントするためにエントリを追加する設定ファイル。
- /etc/crypttabは- /etc/fstabより先に読み込まれるため、暗号化を解除し(luksOpen相当)、復号されたデバイス(- /dev/mapper/下の論理デバイス)を- /etc/fstabでマウントすることが可能になる。
/etc/crypttab エントリの書式例:
マッピング名 /dev/デバイス名 パスワード/キーファイル名 オプション
lukstest /dev/sdb1 /etc/lukstestkey luks,timeout=1806.3.3. eCryptfsによるファイルシステム暗号化
eCryptfs
eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 擬似ファイルシステムとも呼ばれ、マウントすることでeCryptfs層を通過させることにより復号を行う。
カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。
特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。
またecryptfsdと呼ばれるデーモンによって制御が行われ、ecryptfs-*コマンドで各種操作を行う。
eCryptfsの利用と管理(ecryptfs-* コマンド)
eCryptfsの操作は主に以下のユーティリティによって行われる。
| コマンド/ユーティリティ | 説明 | 
|---|---|
| ecryptfsd | eCryptfsのカーネルモジュールと連携し、暗号化/復号処理を管理するデーモンプロセス。 | 
| mount.ecryptfs | eCryptfsファイルシステムのマウントを行う( mount -t ecryptfsと等価)。 | 
| umount.ecryptfs | eCryptfsファイルシステムのアンマウントを行う。 | 
| ecryptfs-setup-private | 暗号化ディレクトリのセットアップ(通常ユーザ向け)。 | 
| ecryptfs-migrate-home | 既存のユーザディレクトリを暗号化する(root権限が必要)。 | 
| ecryptfs-mount-private | 暗号化ディレクトリのマウント(通常ユーザ向け)。 | 
| ecryptfs-umount-private | 暗号化ディレクトリのアンマウント(通常ユーザ向け)。 | 
| ecryptfs-unwrap-passphrase | マウント用の暗号化パスフレーズ( wrapped-passphrase)を復号する。 | 
# eCryptfsのセットアップを行う
ecryptfs-setup-private
# 暗号化ディレクトリのマウント、アンマウントを行う
ecryptfs-mount-private
ecryptfs-umount-private
# rootユーザが、一般ユーザのホームディレクトリ全体を暗号化するコマンド
ecryptfs-migrate-homeなおファイルのマウントはmount -t ecryptfsコマンドでも可能となる。
また、マウントした状態(復号した状態)でバックアップを取ると、暗号化されていないデータもバックアップされることになるので注意する。暗号化した状態のみにしたい場合はumountしてからバックアップを実施する。
ホームディレクトリの暗号化とPAM連携
eCryptfsが透過的な暗号化を実現するために最も重要となるのが、PAM (Pluggable Authentication Modules) との連携である。
- 暗号化の仕組み:- ユーザのホームディレクトリ(例: /home/user/)内のデータは、.Private/ディレクトリに暗号化された状態で保存される。
- /home/user/Private/ディレクトリは、- .Private/をマウントポイントとして利用し、復号されたデータが透過的に表示される。
- 暗号化/復号の鍵となるマウントパスフレーズは、ユーザのログインパスワードによって暗号化され、~/.ecryptfs/wrapped-passphraseに保存される。
 
- ユーザのホームディレクトリ(例: 
- PAM統合(pam_ecryptfs)の役割:- pam_ecryptfs.soモジュールがPAMスタックに追加される。
- ユーザがシステムにログインし、ログインパスワードを入力すると、pam_ecryptfsはこのパスワードを利用してwrapped-passphraseを自動的に復号する。
- 復号されたマウントパスフレーズを使用して、バックグラウンドで .Private/が~/Privateに自動マウントされ、ファイルが透過的に利用可能になる。
- ログアウト時にも、pam_ecryptfsが自動的にアンマウントを実行する。
- これにより、ユーザは暗号化を意識することなく、ログインパスワード一つで暗号化ディスクの利用と鍵管理を同時に行うことができる(透過的な鍵管理)。
 
eCryptfsのディレクトリ構造
ecryptfs-migrate-homeコマンドなどにより暗号化ディレクトリを作成すると、以下のようなファイルやディレクトリが作成される。
$HOME
  ├ Private/ # 復号されたデータを含むマウントポイント(通常の作業ディレクトリ)
  ├ .ecryptfs/
  │  ├ Private.mnt # 暗号化ディレクトリのマウントポイントが書かれたファイル
  │  ├ Private.sig # 暗号化パスフレーズの署名ファイル(鍵検証用)
  │  ├ **wrapped-passphrase** # **マウント用の暗号化パスフレーズ**(PAM連携で復号される)
  │  ├ auto-mount # 自動マウント用の空ファイル
  │  └ auto-umount # 自動アンマウント用の空ファイル
  └ .Private/ # 暗号化されたデータが格納される実際のディレクトリENcFS
ファイルの暗号化のシステムとして、eCryptfsのほかにEncFS(Encrypted Filesystem)が知られている。
歴史はeCryptfsよりも古く、暗号化ファイルシステムとしては最も扱いやすいファイルシステムと言われている。FUSE(Filesystem in Userspace:カーネルを弄ることなくユーザ空間でファイルシステムを作成するソフトウェア)を用いているため制約もあるが、GUIや、WindowsやMacなどのOSもサポートされているのが特徴である。
encfsパッケージは ecryptfs と同様の機能を提供するが、スーパーユーザー以外が使用するように設計されている(FUSEベース)
6.3.4. 高度なLUKS鍵管理(NBDE)
NBDE (Network Bound Disk Encryption)
NBDEはネットワーク経由でLUKS暗号化ディスクの復号を自動化する技術のこと。
通常、LUKSで暗号化されたディスクは、起動時やマウント時に手動でパスフレーズを入力する必要がある。
NBDEは、このパスフレーズの入力を自動化するために、安全なネットワークを経由して専用のサーバー(Tangサーバー)と連携する。これにより、データセンターなどで大量のサーバーを再起動する際の運用負荷を大幅に軽減できる。
Clevis
ClevisはLUKSデバイスの自動復号化を可能にするクライアント側のフレームワークのこと。
Clevis自体は、ディスクを復号化するためのパスフレーズを生成するのではなく、指定された「PIN」と呼ばれるプラグインを通じて、LUKSのキー(鍵スロット)にアクセスし、自動的に復号化の処理を実行する。
Clevisを利用することで、サーバーの起動プロセスを中断することなく、ディスクが自動でオープンされる。
Clevis PINと主要な自動復号化方法
Clevisは、暗号化解除の条件や方法に応じて「PIN」(プラグイン)を使い分ける。
- Tang- NBDEの実装に使用される。ネットワーク経由でTangサーバーと通信し、パスフレーズを安全に取得・生成してディスクの暗号化を解除する。
- データセンターなど、ネットワークが利用可能な環境でのリモート起動時の自動復号化
 
- TPM2- TPM2 のハードウェアセキュリティモジュールを使用する。ディスクの復号に必要な鍵をTPM内に安全に保存し、TPMポリシー(例:ブート設定の検証)が満たされた場合にのみ鍵を解放する。
- ネットワークが利用できない環境、またはネットワークに依存しないローカル起動時の自動復号化。