Rootfs の暗号化

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Rootfs encryption and the translation is 100% complete.
Other languages:

ルートファイルシステムを暗号化すると、プライバシーを強化し、無許可でのアクセスを防止することができます。

インストール

emerge

メモ
cryptsetup は livecd に含まれています。
root #emerge --ask sys-fs/cryptsetup

システムの準備

重要
カーネルDm-crypt: カーネルコンフィギュレーションの内容にしたがって設定されている必要があります。

このガイドは、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
Created a new GPT disklabel (GUID: 8D91A3C1-8661-2940-9076-65B815B36906).

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 を編集して関連するマウントを追加できます:

ファイル /mnt/gentoo/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.confadd_dracutmodules ディレクティブに追加する必要があります:

ファイル /etc/dracut.confdracut を使用してLUKS ボリュームを復号化するために必要な最小限のコンポーネント
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
ファイル /etc/dracut.confrootfs を復号化するためのコマンドラインパラメーターを組み込む
kernel_cmdline+=" root=UUID=cb070f9e-da0e-4bc5-825c-b01bb2707704 rd.luks.uuid=4bb45bd6-9ed9-44b3-b547-b411079f043b "
メモ
root= オプションのカーネルコマンドラインへの組み込みは、sys-boot/systemd-boot を使用する場合には必須ですが、このパラメーターを自動的に追加する GRUBgrub-mkconfig を使用する場合には冗長な設定です。

init システムに systemd を使用している場合、 cryptsetup USE フラグを有功にしてコンパイルする必要があります:

ファイル /etc/portage/package.use/systemd
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 encryptiondm-crypt を (フル) ディスク暗号化に使用する際のいくつかの側面について解説します。