[Linux]dm-crypt

はじめに

システム上のデータを暗号化して保護する場合、その対象が少なければ、ファイル単位で1つずつ暗号化することは可能です。しかし、コンピュータ上に存在する全てのデータを保護したい場合や、あるパーティションのファイルをすべて保護したい場合、1ファイルずつ暗号化するのは現実的ではありません。

Linuxカーネルには、ファイルシステム全体を暗号化するdm-cryptという機能がサポートされています。

dm-cryptとは

dm-cryptは、LinuxカーネルのDevice Mapperを利用したブロックデバイス暗号化機能で、任意のファイルをファイルシステムの用にマウントする機能です。

暗号化の際の鍵管理には、LUKSを使った運用が推奨とされています。

LUKSとは

LUKS(Linux Unified Key Setup)は、「鍵をどう管理するか」を決めた規格です。つまりdm-cryptだけでは、「鍵をどこへ保存する?複数人で使う?パスワード変更する?」などが決まっていません。

そこでLUKSが「鍵スロット、メタデータ、暗号方式、UUID」などを管理します。

cryptsetupコマンド

dm-cryptの暗号化ボリュームをセットアップするコマンドは、cryptsetupコマンドを使用します。

書式

cryptsetup [オプション] [サブコマンド] [サブコマンド引数]

cryptsetupの主なサブコマンド

サブコマンド 説明
open
(旧 luksOpen)
LUKSデバイスを復号して利用可能にする
close
(旧 luksClose)
LUKSデバイスを復号して利用可能にする
status 開いている暗号デバイスの状態を表示する
luksFormat デバイスをLUKS形式で初期化する
luksDump LUKSヘッダー情報を表示する
luksUUID LUKSデバイスのUUIDを表示する
luksAddKey 新しいパスフレーズを追加する
luksRemoveKey 新しいパスフレーズを追加する
luksChangeKey 既存のパスフレーズを変更する

open / luksOpen

LUKSデバイスを復号して利用可能にします。

cryptsetup open /dev/sdb1 secure

成功すると、 /dev/mapper/secure が作成されます。

close / luksClose

暗号化デバイスを切断します。

cryptsetup close secure

成功すると、 /dev/mapper/secure が消えます。

status

開いている暗号デバイスの状態を表示します。

cryptsetup status secure

例:

/dev/mapper/secure is active.
type:    LUKS2
cipher:  aes-xts-plain64
device:  /dev/sdb1

luksFormat

デバイスをLUKS形式で初期化します。

cryptsetup luksFormat /dev/sdb1

例:

/dev/mapper/secure is active.
type:    LUKS2
cipher:  aes-xts-plain64
device:  /dev/sdb1

実行すると以下の処理が行われます。

  • LUKSヘッダー作成
  • 暗号方式設定
  • 初期パスフレーズ登録

イメージ:

実行前

/dev/sdb1
+----------------+
| データ領域      |
+----------------+


実行後

/dev/sdb1
+----------------+
| LUKS Header    |
+----------------+
| 暗号化領域      |
+----------------+

luksDump

LUKSヘッダー情報を表示します。

cryptsetup luksDump /dev/sdb1

例:

/dev/mapper/secure is active.
type:    LUKS2
cipher:  aes-xts-plain64
device:  /dev/sdb1

例:

LUKS header information
Version:        2
Cipher:         aes-xts-plain64
Keyslots:
  0:
    Type: luks2

以下の情報が確認できます。

  • LUKSバージョン
  • 暗号方式
  • UUID
  • キースロット

luksUUID

LUKSデバイスのUUIDを表示します。

cryptsetup luksUUID /dev/sdb1

例:

8f2a3b4c-xxxx-xxxx

このUUIDは、 /etc/crypttab で利用します。

luksAddKey

新しいパスフレーズを追加します。

cryptsetup luksAddKey /dev/sdb1

例:

LUKS Header

Key Slot 0 → 管理者
Key Slot 1 → バックアップ担当者
Key Slot 2 → 予備

luksRemoveKey

登録済みの鍵を削除します。

cryptsetup luksRemoveKey /dev/sdb1

例:

Key Slot 1 削除

注意:最後の有効な鍵を削除すると復号できなくなるため注意。

luksChangeKey

既存のパスフレーズを変更します。

cryptsetup luksChangeKey /dev/sdb1

古いパスフレーズ確認後、新しいものを設定します。

cryptmountコマンド

cryptmountコマンドは、暗号化されたファイルシステムのマウント・アンマウントを簡単に行うためのツールです。

例えば、通常の cryptsetup では、

  1. cryptsetup open
  2. mount
  3. 利用
  4. umount
  5. cryptsetup close

と複数のコマンドが必要です。一方 cryptmount では、「cryptmount データ名」だけで、デバイスを開いてマウントまでを自動で行ってくれます。

特徴

  1. ファイルシステムとスワップ空間の両方を暗号化できる。
  2. 暗号化されたファイルシステムは、通常のファイルシステムと同様にブロックデバイスに格納できる。
  3. 暗号化領域の作成時には管理者権限が必要だが、一度作成するとその後の運用は一般ユーザーでも利用できる。

dm-cryptで使われる代表的なモード

モード 説明
CBC
  • 最も古い方式
  • 前のブロックを利用する
  • 同じデータでも異なる暗号文になる
  • ディスク暗号化には弱点がある
ESSIV
  • CBCの弱点を改善したもの
LRW
  • CBCより後に登場した方式
  • ディスク暗号化向け
  • 各セクタごとに異なる暗号になる
XTS
  • 現在もっとも使われている方式
  • ディスク暗号化専用
  • セクタ単位で安全
  • ランダムアクセスが速い

コメント

このブログの人気の投稿

docker-compose up で proxyconnect tcp: dial tcp: lookup proxy.example.com: no such host

[Azure]キーコンテナー (Azure Key Vault)

[Java] JDBCドライバでMySQL接続するまでの手順