「コンプライアンス審査でストレージ暗号化の実装記録を求められた」
RHEL 9やRocky Linuxではインストール時に「ディスクの暗号化」を選べますが、後からデータ用に追加したパーティションやLVMボリュームを暗号化したい場合は
cryptsetup コマンドを直接使います。これはLinux標準の暗号化フレームワーク「LUKS(Linux Unified Key Setup)」を操作するツールです。この記事では、
cryptsetup コマンドによるLUKS暗号化の手順を、デバイス確認からファイルシステム作成・OS起動時の自動マウント設定まで、RHEL 9 / Rocky Linux 9 の実機を使って解説します。この記事のポイント
・cryptsetup luksFormatでブロックデバイスをLUKS2形式に暗号化できる
・luksOpenでマッパーデバイスを作成し、通常通りマウントして使う
・/etc/crypttabと/etc/fstabでOS起動時に自動マウントを設定できる
・既存データは保持できないため、暗号化前のバックアップが必須
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
LUKSとcryptsetupの役割
LUKS(Linux Unified Key Setup)はLinux標準のディスク暗号化フレームワークです。暗号化されたデバイスのヘッダー形式と鍵管理の仕様を定めており、RHEL系ディストリビューションではインストーラーのディスク暗号化にもLUKSが使われています。
cryptsetupはLUKSデバイスを操作するコマンドラインツールです。暗号化の設定(luksFormat)、デバイスの開閉(luksOpen / luksClose)、鍵の管理(luksAddKey / luksRemoveKey)など、LUKS操作のほぼすべてをこのコマンドで行います。
LUKSには LUKS1 と LUKS2 の2バージョンがあります。RHEL 8以降のデフォルトはLUKS2で、より強力な鍵導出関数(Argon2i)と柔軟なヘッダー設計を持ちます。特別な理由がない限りLUKS2を使ってください。
暗号化の仕組みはシンプルです。
・ブロックデバイス(/dev/sdb等)のヘッダーにLUKSメタデータを書き込む・パスフレーズ(またはキーファイル)でマスター暗号化キーを保護する
・
cryptsetup luksOpenでパスフレーズを入力するとDevice Mapper経由で /dev/mapper/<名前> が作成される・アプリケーションはこの仮想デバイスを通常のブロックデバイスと同じように扱う
物理ディスクを直接読み出しても暗号化されているため、ディスクを抜き出されても(盗難・廃棄時の情報漏洩防止)データは保護されます。
cryptsetupのインストールと確認
RHEL 9 / Rocky Linux 9 では cryptsetup パッケージが標準でインストールされています。まず確認しましょう。
# インストール確認 rpm -q cryptsetup cryptsetup-2.6.1-2.el9.x86_64 # バージョン確認 cryptsetup --version cryptsetup 2.6.1
インストールされていない場合は以下でインストールします。
dnf install -y cryptsetup
LUKSでパーティションを暗号化する基本手順
実行環境:RHEL 9.4 / Rocky Linux 9.4(x86_64)で動作確認済み。以下の手順では、追加した /dev/sdb を暗号化して使います。luksFormat は対象デバイスのデータをすべて消去します。誤ったデバイスを指定しないよう、操作前に必ず確認してください。
1. 暗号化対象のデバイスを確認する
まず lsblk で現在のディスク構成を確認します。
lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 20G 0 disk ├─sda1 8:1 0 1G 0 part /boot └─sda2 8:2 0 19G 0 part ├─rl-root 253:0 0 17G 0 lvm / └─rl-swap 253:1 0 2G 0 lvm [SWAP] sdb 8:16 0 10G 0 disk
ここでは /dev/sdb(10GB)が暗号化対象です。パーティションを切らずにディスク全体を使う場合は /dev/sdb をそのまま指定します。パーティションを切る場合は fdisk /dev/sdb または gdisk /dev/sdb で事前に作成してください。
2. luksFormatで暗号化を設定する
cryptsetup luksFormat でLUKSヘッダーを書き込み、パスフレーズを設定します。このコマンドはデバイス上の既存データをすべて破棄します。
# LUKS2形式でフォーマット(デフォルトがLUKS2) cryptsetup luksFormat /dev/sdb WARNING! ======== This will overwrite data on /dev/sdb irrecoverably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/sdb: Verify passphrase:
パスフレーズは8文字以上を推奨します。短すぎると警告が出ることがあります。設定したパスフレーズは絶対に忘れないこと。パスフレーズを失うとデータの復元は不可能です。
暗号アルゴリズムを明示的に指定したい場合はオプションを追加します。
# 暗号アルゴリズムを明示指定(デフォルトのaes-xts-plain64を確認) cryptsetup luksFormat --type luks2 --cipher aes-xts-plain64 --key-size 512 /dev/sdb
3. luksOpenでデバイスをマッパー経由で開く
フォーマット後、cryptsetup luksOpen でデバイスをオープンします。パスフレーズを入力すると /dev/mapper/ 配下に仮想デバイスが作成されます。
# /dev/mapper/encrypted_data として開く cryptsetup luksOpen /dev/sdb encrypted_data Enter passphrase for /dev/sdb: # マッパーデバイスの確認 ls -la /dev/mapper/ total 0 crw-------. 1 root root 10, 236 7月 30 15:22 control lrwxrwxrwx. 1 root root 7 7月 30 15:23 encrypted_data -> ../dm-2
ステータスを確認するとLUKSの詳細が表示されます。
cryptsetup status encrypted_data /dev/mapper/encrypted_data is active. type: LUKS2 cipher: aes-xts-plain64 keysize: 512 bits key location: keyring device: /dev/sdb sector size: 512 offset: 32768 sectors size: 20939776 sectors mode: read/write
4. ファイルシステムを作成してマウントする
/dev/mapper/encrypted_data は通常のブロックデバイスと同様に扱えます。ファイルシステムを作成してマウントします。
# xfsファイルシステムを作成 mkfs.xfs /dev/mapper/encrypted_data meta-data=/dev/mapper/encrypted_data isize=512 agcount=4, agsize=1308736 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=1, sparse=1, rmapbt=0 = reflink=1 bigtime=1 inobtcount=1 data = bsize=4096 blocks=5235712, imaxpct=25 # マウントポイントを作成してマウント mkdir -p /mnt/secure_data mount /dev/mapper/encrypted_data /mnt/secure_data # マウント確認 df -h /mnt/secure_data Filesystem Size Used Avail Use% Mounted on /dev/mapper/encrypted_data 9.8G 90M 9.7G 1% /mnt/secure_data
これで暗号化されたボリュームに通常通りファイルを書き込めます。
Linux無料マニュアルを受け取る >>
OS起動時の自動マウントを設定する
サーバーの再起動後も自動的に暗号化ボリュームをマウントするには、/etc/crypttab と /etc/fstab の両方に設定を追加します。
まず、デバイスのUUIDを確認します。デバイス名(/dev/sdb)ではなくUUIDを使うことで、ディスクの認識順変動に対応できます。
# LUKSデバイスのUUID確認 cryptsetup luksDump /dev/sdb | grep UUID UUID: e5a8c2f4-1a2b-3c4d-5e6f-789012345678 # または blkid でも確認できる blkid /dev/sdb /dev/sdb: UUID="e5a8c2f4-1a2b-3c4d-5e6f-789012345678" TYPE="crypto_LUKS"
次に /etc/crypttab に以下の形式で追記します。書式は「マッパー名・デバイス(UUID)・キーファイル・オプション」の4フィールドです。
# /etc/crypttab の内容(追記する行) # マッパー名 デバイスのUUID キーファイル オプション encrypted_data UUID=e5a8c2f4-1a2b-3c4d-5e6f-789012345678 none luks
キーファイルに none を指定するとOS起動時にパスフレーズの入力プロンプトが表示されます。無人起動(ヘッドレスサーバー)が必要な場合はパスフレーズを書いたキーファイルのパスを指定します(パーミッション600推奨)。
続いて /etc/fstab にマウント設定を追加します。
# /etc/fstab に追記する行 /dev/mapper/encrypted_data /mnt/secure_data xfs defaults 0 2
設定後、一度アンマウントしてsystemdからの再オープンをテストします。
# アンマウントとクローズ umount /mnt/secure_data cryptsetup luksClose encrypted_data # systemdにcrypttabを再読み込みさせて起動 systemctl daemon-reload systemctl start systemd-cryptsetup@encrypted_data # マウント mount /mnt/secure_data # 確認 df -h /mnt/secure_data Filesystem Size Used Avail Use% Mounted on /dev/mapper/encrypted_data 9.8G 90M 9.7G 1% /mnt/secure_data
次回OS起動時には /etc/crypttab → /etc/fstab の順に処理されてパスフレーズ入力後に自動マウントされます。
mountコマンドの詳細な使い方(fstabの書式も含む)はmountコマンドでファイルシステムをマウントする方法も参照してください。
暗号化ボリュームの管理操作
1. LUKSヘッダー情報を確認する
luksDump コマンドでLUKSのヘッダー情報を確認できます。登録済みのキースロット数や使用中の暗号アルゴリズムを把握するのに使います。
cryptsetup luksDump /dev/sdb LUKS header information Version: 2 Epoch: 3 Metadata area: 16384 [bytes] Keyslots area: 16744448 [bytes] UUID: e5a8c2f4-1a2b-3c4d-5e6f-789012345678 Label: (no label) Subsystem: (no subsystem) Flags: (no flags) Data segments: 0: crypt offset: 16777216 [bytes] length: (whole device) cipher: aes-xts-plain64 sector: 512 [bytes] Keyslots: 0: luks2 Key: 512 bits Priority: normal Cipher: aes-xts-plain64 PBKDF: argon2id
2. パスフレーズを追加・削除する
LUKSは最大32個のキースロットを持ちます。複数のパスフレーズを登録できるため、運用担当者ごとに別のパスフレーズを持たせることができます。
# パスフレーズを追加(既存パスフレーズで認証後に新規パスフレーズを設定) cryptsetup luksAddKey /dev/sdb Enter any existing passphrase: Enter new passphrase for key slot: Verify passphrase: # パスフレーズを削除(対象のパスフレーズを入力) cryptsetup luksRemoveKey /dev/sdb Enter passphrase to be deleted:
3. LUKSヘッダーをバックアップする
LUKSヘッダーが破損するとディスク全体が読めなくなります。運用開始前に必ずバックアップを取得してください。
# LUKSヘッダーをバックアップ cryptsetup luksHeaderBackup /dev/sdb --header-backup-file /root/sdb_luks_header.bak # バックアップファイルの確認 ls -la /root/sdb_luks_header.bak -rw-------. 1 root root 16777216 7月 30 15:45 /root/sdb_luks_header.bak # 復元が必要な場合 # cryptsetup luksHeaderRestore /dev/sdb --header-backup-file /root/sdb_luks_header.bak
バックアップファイルには鍵情報が含まれるため、別サーバーや暗号化した外部ストレージなど安全な場所に保管してください。
よくあるエラーと対処法
「Device is in use」でluksCloseできない
マウント中のまま luksClose を試みると発生します。先にアンマウントが必要です。
# まずアンマウント umount /mnt/secure_data # その後クローズ cryptsetup luksClose encrypted_data
「No key available with this passphrase」
入力したパスフレーズが登録されていない場合のエラーです。大文字・小文字・記号の誤りが多いです。登録済みパスフレーズの本数は luksDump のKeyslots欄で確認できます。
「Failed to open LUKS device /dev/sdb」
デバイスが他プロセスに使用中、またはLUKSヘッダーが破損している場合に発生します。まず cryptsetup isLuks で正常なLUKSデバイスかどうかを確認してください。
# LUKSデバイスかどうか確認(戻り値0なら正常なLUKSデバイス) cryptsetup isLuks /dev/sdb && echo "LUKS OK" || echo "LUKS NG" LUKS OK
再起動後に自動マウントされない
/etc/crypttab の書式ミスが多いです。特にUUIDの誤り、タブとスペースの混在に注意してください。systemctl status とjournalctlでエラーメッセージを確認します。
# crypttab関連のsystemdサービス状態確認 systemctl status systemd-cryptsetup@encrypted_data # journalctlでエラー詳細を確認 journalctl -u systemd-cryptsetup@encrypted_data --no-pager
本記事のまとめ
cryptsetupによるLUKS暗号化の主要な操作をまとめます。
| やりたいこと | コマンド |
|---|---|
| LUKS形式で暗号化する | cryptsetup luksFormat /dev/sdb |
| デバイスをオープン(マッパー作成) | cryptsetup luksOpen /dev/sdb 名前 |
| ステータス確認 | cryptsetup status 名前 |
| LUKSヘッダー情報を確認 | cryptsetup luksDump /dev/sdb |
| パスフレーズを追加 | cryptsetup luksAddKey /dev/sdb |
| パスフレーズを削除 | cryptsetup luksRemoveKey /dev/sdb |
| LUKSヘッダーをバックアップ | cryptsetup luksHeaderBackup /dev/sdb --header-backup-file パス |
| デバイスをクローズ | cryptsetup luksClose 名前 |
LUKSによるディスク暗号化は、サーバー廃棄時のデータ漏洩防止や、PCI DSSやISO 27001といったコンプライアンス要件への対応として現場でよく使われます。現場で特に問題になるのがパスフレーズの紛失とLUKSヘッダーの破損の2点です。パスフレーズは安全な場所に必ず記録し、ヘッダーバックアップは運用開始前に取得する習慣をつけてください。
Linux無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:LinuxのOOM Killerでプロセスが強制終了する原因と対処法|dmesgで確認してoom_score_adjで優先度を設定する方法
- この記事の属するカテゴリ:Linuxtips・セキュリティへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます