6.3. 暗号化ファイルシステム

6.3.1. 暗号化ファイルシステムの基本概念

ディスク暗号化の基礎

ディスク全体の暗号化は盗難や偶発的な紛失の場合にディスクを保護する。
ディスク全体の暗号化では、スワップファイル、システムファイル、休止状態ファイルを含むディスク全体が暗号化される。 暗号化されたディスクが紛失、盗難された場合でも、ドライブの暗号化状態は変更されず、許可されたユーザーのみがその内容にアクセスできる。

ファイルの暗号化では起動中にシステムにログインし、その後コンピュータを放置した場合、権限のないユーザーはディスク上の任意のファイルを開くことができないようにできる。

ブロックデバイス暗号化とファイルシステム暗号化の違い

暗号化ファイルシステムは、暗号化が適用されるレイヤーによって「ブロックデバイス暗号化」と「ファイルシステムレベル暗号化」に分類される。

ブロックデバイス暗号化

dm-crypt/LUKSなどが該当。

  • 利点/特徴
    • ディスク全体(パーティション、論理ボリュームなど)を単一のブロック単位で暗号化する。このレベルで暗号化されるため、データはファイルシステムメタデータ(ディレクトリ構造、ファイル名)を含め、すべて隠蔽される。
    • システム全体のセキュリティを確保するのに最適。
  • 主なツール
    • dm-crypt(カーネル機能)とLUKS(鍵管理標準)を連携して使用する。
    • cryptmountも使用可能。
  • ユースケース
    • システム全体の暗号化(ルートパーティション)、スワップパーティション、データボリュームなど、機密性の高いディスク全体を保護する場合

ファイルシステムレベル暗号化

eCryptfs/EncFSなどが該当。

  • 利点/特徴
    • 既存のファイルシステムの上に透過的な暗号化層を作成し、ファイルやディレクトリ単位で暗号化する。柔軟性が高く、個々のユーザーやディレクトリごとに暗号化設定が可能
    • 暗号化されたファイルは、そのメタデータ(ファイル名、タイムスタンプなど)も暗号化される。
  • 主なツール
    • eCryptfs(カーネルモード、PAM連携)、EncFS(FUSEベース)。
  • ユースケース
    • 個々のユーザーのホームディレクトリ暗号化(Ubuntuなどで標準的)、特定の機密データディレクトリのみの暗号化。

ディスク暗号化ツール

分類ツール名特徴
ブロックデバイスdm-crypt/LUKSLinuxの標準的なディスク暗号化。ディスク全体を保護。
ブロックデバイスcryptmountエンドユーザー向けの管理ツール。暗号化されたボリュームの準備とマウント/
ファイルシステムeCryptfsファイルシステムレベルの透過的な暗号化。PAM連携によるホームディレクトリ暗号化に利用される。
ファイルシステムEncFSFUSEベースのファイルシステム暗号化。スーパーユーザー以外も利用しやすい。

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 3

cryptmountコマンド

ブロックデバイスまたはループバックデバイスに対して暗号化ファイルシステムを作成するコマンド。

  • ファイルシステムと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 crypttest

cryptsetupによる暗号化デバイスの利用方法

cryptsetupを用いて暗号化デバイス(パーティション)を利用する流れは以下の通り

  1. (LUKSモード利用時)luksFormatによるパーティションの初期化
    • cryptsetup luksFormal /dev/sdb2
  2. openまたはluksOpenによる暗号化マッピングの作成
    • cryptsetup open --type plain /devsdb1 dm01
    • cryptsetup luksOpen /dev/sdb2 dm02
  3. mkfsおよびパーティションのマウント
    • mkfs.ext4 /dev/mapper/dm02
    • mount /dev/mapper/dm02 /mnt/luks

なお利用終了時は、アンマウントし暗号化マッピングを削除する。

  1. パーティションのアンマウント
    • unmount /mnt/luks
  2. closeまたはluksCloseによる暗号化マッピングの削除
    • cryptsetup close dm01
    • cryptsetup luksClose dm02
LUKSデバイスの利用手順 (luksOpen後)
  1. cryptsetup luksOpen /dev/sdb1 lukstest
  2. ファイルシステムを作成: mkfs -t ext4 /dev/mapper/lukstest
  3. マウント: 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=180

6.3.3. eCryptfsによるファイルシステム暗号化

eCryptfs

eCryptfsはファイルシステムの暗号化を行う技術の一つで、ファイルやディレクトリを暗号化することができるもの。 擬似ファイルシステムとも呼ばれ、マウントすることでeCryptfs層を通過させることにより復号を行う。

カーネルモードで動作し、各ファイルのヘッダに暗号化メタデータを持つことにより、ホスト間で暗号化ファイルをやり取りすることができる。
特にUbuntuにおけるホームディレクトリの暗号化の仕組みとして広く利用されている。 またecryptfsdと呼ばれるデーモンによって制御が行われecryptfs-*コマンドで各種操作を行う。

eCryptfsの利用と管理(ecryptfs-* コマンド

eCryptfsの操作は主に以下のユーティリティによって行われる。

コマンド/ユーティリティ説明
ecryptfsdeCryptfsのカーネルモジュールと連携し、暗号化/復号処理を管理するデーモンプロセス
mount.ecryptfseCryptfsファイルシステムのマウントを行う(mount -t ecryptfsと等価)。
umount.ecryptfseCryptfsファイルシステムのアンマウントを行う。
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) との連携である。

  1. 暗号化の仕組み:
    • ユーザのホームディレクトリ(例: /home/user/)内のデータは、.Private/ ディレクトリに暗号化された状態で保存される。
    • /home/user/Private/ ディレクトリは、.Private/ をマウントポイントとして利用し、復号されたデータが透過的に表示される。
    • 暗号化/復号の鍵となるマウントパスフレーズは、ユーザのログインパスワードによって暗号化され、~/.ecryptfs/wrapped-passphrase に保存される。
  2. 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ポリシー(例:ブート設定の検証)が満たされた場合にのみ鍵を解放する。
    • ネットワークが利用できない環境、またはネットワークに依存しないローカル起動時の自動復号化