cryptsetupコマンドでLinuxのディスクをLUKS暗号化する方法|追加ボリュームの暗号化から自動マウントまで

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, セキュリティ > cryptsetupコマンドでLinuxのディスクをLUKS暗号化する方法|追加ボリュームの暗号化から自動マウントまで
「データ漏洩対策でディスクを暗号化しろと指示されたが、追加したボリュームをどう暗号化すればいい?」
「コンプライアンス審査でストレージ暗号化の実装記録を求められた」

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起動時に自動マウントを設定できる
・既存データは保持できないため、暗号化前のバックアップが必須


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

LUKSとcryptsetupの役割

LUKS(Linux Unified Key Setup)はLinux標準のディスク暗号化フレームワークです。暗号化されたデバイスのヘッダー形式と鍵管理の仕様を定めており、RHEL系ディストリビューションではインストーラーのディスク暗号化にもLUKSが使われています。

cryptsetupはLUKSデバイスを操作するコマンドラインツールです。暗号化の設定(luksFormat)、デバイスの開閉(luksOpen / luksClose)、鍵の管理(luksAddKey / luksRemoveKey)など、LUKS操作のほぼすべてをこのコマンドで行います。

LUKSには LUKS1LUKS2 の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サーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
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サーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。