Rootfs の暗号化
ルートファイルシステムを暗号化すると、プライバシーを強化し、無許可でのアクセスを防止することができます。
インストール
emerge
cryptsetup は livecd に含まれています。
root #
emerge --ask sys-fs/cryptsetup
システムの準備
このガイドは、Gentoo の新規インストールの一環として実行されることを想定しています。AMD64 ハンドブック: パーティション構成の設計 までは通常どおりのインストール手順を実行できます。
ディスクの準備
パーティション構成は、通常、パーティション内のデータの変更について関知しません。ドライブのパーティションを再構成してから暗号化した場合、古いデータは上書きされるまでは暗号化されていないままで残り続けます。
現代的なストレージデバイスは、dd if=/dev/urandom of=/dev/sdX といった操作では安全に消去されないことがあります。詳細については Secure wipe を参照してください。
この例では、ディスクのパーティション形式として GPT を使用します。fdisk をパーティショニングツールとして使用しますが、どのパーティショニングユーティリティで作業しても構いません。
GPT と EFI についての詳細は、ディスク (AMD64 ハンドブック)を参照してください。
ディスクパーティションを作成する
1つのドライブがある基本的なシステム向けの一般的な構成では、ブートファイル用のパーティション1つとシステムルート用のパーティション1つが含まれます。
/dev/nvme0n1
├── /dev/nvme0n1p1 [EFI] /boot 1 GB fat32 Bootloader, bootloader support files, kernel and initramfs
└── /dev/nvme0n1p2 [LUKS] (crypt) ->END luks encrypted partition
└── rootfs / ->END btrfs root partition
パーティションの作成
fdisk を使用してパーティションレイアウトを作成するには、まずルートディスクに新しいパーティションテーブルを作成します:
root #
fdisk /dev/nvme0n1
Welcome to fdisk (util-linux 2.38.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0x81391dbc.
Command (m for help):
g
GPT パーティションテーブルが作成されたら、n でブートパーティションを追加できます:
Command (m for help):
n
Partition number (1-128, default 1): First sector (2048-1953525134, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953523711): +1G Created a new partition 1 of type 'Linux filesystem' and of size 1 GiB.
The ESP properties can be set using t:
Command (m for help):
t
Selected partition 1 Partition type or alias (type L to list all): 1 Changed type of partition 'Linux filesystem' to 'EFI System'.
ルートパーティションを作成するには:
Command (m for help):
n
Partition number (1-128, default 2): First sector (1050624-1953525134, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (1050624-1953525134, default 1953523711): Created a new partition 2 of type 'Linux filesystem' and of size 931 GiB.
最後に、w で変更を書き込めます:
Command (m for help):
w
The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
LUKS 暗号化パーティションを作成する
暗号化ファイルシステムを準備するには、dm-crypt を使用します:
dm-crypt モジュールを確実に読み込ませるために、以下のコマンドを使用できます:
root #
modprobe dm-crypt
モジュールの状態は以下のようにして確認できます:
user $
lsmod | grep dm-crypt
LUKS を使用してパスワードで保護されたルートパーティションをフォーマットするには:
root #
cryptsetup luksFormat --key-size 512 /dev/nvme0n1p2
WARNING! ======== This will overwrite data on /dev/nvme0n1p2 irrevocably. Are you sure? (Type 'yes' in capital letters): YES Enter passphrase for /dev/nvme0n1p2:
LUKS ヘッダーのバックアップ
このステップを忘れないでください。鍵/パスワードは LUKS ヘッダーの復号化に使われており、何らかの原因でヘッダーが破壊された場合、ヘッダーファイルを使用する以外に残ったデータを回復する方法はありません。
ヘッダーをバックアップするには:
root #
cryptsetup luksHeaderBackup /dev/nvme0n1p2 --header-backup-file crypt_headers.img
LUKS ボリュームを開く
暗号化されたデバイスは使用する前に以下のようにして開いてマップする必要があります:
root #
cryptsetup luksOpen /dev/nvme0n1p2 crypt
この例では、ボリュームを開いて、/dev/mapper/crypt にマップしています。
ファイルシステムをフォーマットする
ブートローダーとカーネルファイルを格納するブートパーティション /dev/nvme0n1p1 にファイルシステムを作成します。このパーティションは UEFI によって読み取られます。ほとんどのマザーボードは、FAT32 ファイルシステムのみを読むことができます:
root #
mkfs.vfat -F32 /dev/nvme0n1p1
次に、ルートファイルシステム(この例では btrfs を使用しています)を作成します:
root #
mkfs.btrfs -L rootfs /dev/mapper/crypt
Gentoo のインストール
この手順を Gentoo のインストール中に(Handbook:AMD64/Full/Installation から Handbook:AMD64/Full/Installation までの代わりに)実行している場合、以下のステップで、作成したパーティションをマウントし、インストールを続行できます。
ルートパーティションをマウントする
以下のようにして、作成した場所にルートファイルシステムをマウントできます:
root #
mount LABEL=rootfs /mnt/gentoo
Gentoo の install を完了する
一般的なインストールガイドを実行してください。ただし、初期 RAM ファイルシステムはルートパーティションの復号化をサポートするように作成する必要があり、また ブートローダー をインストールして設定する必要があるなど、いくつかの配慮が必要です。
この時点で、上で挙げたいくつかの配慮をしつつ、Gentoo のインストールを通常どおりに続行できます: stage ファイルをインストールする。
fstab の設定
正しい /etc/fstab ファイルを編集する必要があります。chroot する前にこれを行う場合、正しいパスを使っているか確認してください。より詳しい情報は インストールガイドのファイルシステムに関する部分 にあります。
ボリュームのマウントに一貫性を持たせるために、ラベルや UUID を使用する必要があります。
ブロックデバイスとそれらに紐付けられたパーティション ID は以下のようにして見ることができます:
root #
lsblk -o name,uuid
NAME UUID sdb ├─nvme0n1p1 BDF2-0139 └─nvme0n1p2 4bb45bd6-9ed9-44b3-b547-b411079f043b └─crypt cb070f9e-da0e-4bc5-825c-b01bb2707704
パーティションの UUID とラベルを特定したら、/etc/fstab を編集して関連するマウントを追加できます:
# <fs> <mountpoint> <type> <opts> <dump/pass>
UUID=BDF2-0139 /boot vfat noauto,noatime 1 2
LABEL=rootfs / btrfs defaults 0 1
initramfs の設定
ルートパーティションを復号化してマウントするには initramfs を使用する必要があります。これは、Dracut を使用し、カーネルコマンドラインでパラメーターを渡すことで実現できます。
この設定は chroot している間か、動作しているシステム上で行う必要があります。
以下のモジュールを /etc/dracut.conf の add_dracutmodules ディレクティブに追加する必要があります:
add_dracutmodules+=" crypt dm rootfs-block "
Dracut の設定におけるスペースは非常に重要です。add_dracutmodules と +=" の間にスペースがあってはいけませんし、add_dracutmodules の値はスペースで囲まれている必要があります。
Dracut は、LUKS 用の設定をハードコードしてビルドするよう設定することができます。まず最初にディスクの情報を取得する必要があります:
root #
lsblk -o name,uuid
NAME UUID sda └─sda1 BDF2-0139 nvme0n1 └─nvme0n1p1 4bb45bd6-9ed9-44b3-b547-b411079f043b └─crypt cb070f9e-da0e-4bc5-825c-b01bb2707704
kernel_cmdline+=" root=UUID=cb070f9e-da0e-4bc5-825c-b01bb2707704 rd.luks.uuid=4bb45bd6-9ed9-44b3-b547-b411079f043b "
root=
オプションのカーネルコマンドラインへの組み込みは、sys-boot/systemd-boot を使用する場合には必須ですが、このパラメーターを自動的に追加する GRUB の grub-mkconfig を使用する場合には冗長な設定です。init システムに systemd を使用している場合、 cryptsetup USE フラグを有功にしてコンパイルする必要があります:
sys-apps/systemd cryptsetup
systemd を再ビルドします:
root #
emerge --ask sys-apps/systemd
Dracut の設定ができたら、新しい initramfs を生成するために以下を実行します:
root #
dracut
Dracut はデフォルトでは /boot にファイルを書き込むため、ここはあらかじめマウントしておいてください。
現在有効になっているものとは別のカーネル用の initramfs が生成された場合、--kver を使用します:
root #
dracut --kver 6.1.28-gentoo
これは、Gentoo Live CD のカーネルのバージョンが、カーネルコンパイルの過程で emerge した sys-kernel/gentoo-sources と異なる状況で発生することがあります。
あり得るカーネルバージョンは ls /lib/modules を使用すると見つけられます。
参考資料
- Dm-crypt — Linuxカーネルのcrypto APIフレームワーク及びデバイスマッパーサブシステムを利用したディスク暗号化システムです。
- Dm-crypt full disk encryption — dm-crypt を (フル) ディスク暗号化に使用する際のいくつかの側面について解説します。