FedoraでTPM2を使用したフルディスク暗号化
Full Disk Encryption on Fedora with TPM2 (apalrd.net)
要約
この記事では、FedoraでLUKSとTPM2を使用してフルディスク暗号化を設定する方法を解説しています。TPM2にバインドされたキーを利用することで、起動時にパスフレーズの入力を省略し、セキュリティを維持しながら自動でディスクをアンロックする設定手順を説明しています。
全文翻訳
FedoraでTPM2を使用したフルディスク暗号化
今日は、Secure Boot、TPM2、そしてディスク暗号化キーを毎回入力したくない場合に、高いレベルのセキュリティを求めることに関連するすべての複雑さの世界に飛び込みます。最終的な目標は、Linuxベースのビジネス環境で展開できるソリューションを見つけることですが、今日はLUKSを使用したフルディスク暗号化の基本と、TPMへの最初のキーの登録方法を説明します。
目次
ビデオ
LUKSの基本
理解を深めるために、LUKS暗号化ボリュームを手動で作成します。まず、作業対象のディスクパーティションがあることを確認してください。
# ドライブのパーティション設定が必要な場合は、sgdiskを使用してください
# 既存のパーティションテーブル(MBR + GPT)を削除
# sudo sgdisk --zap-all /dev/sdX
# 新しいパーティションテーブルと1つのフルサイズパーティションを作成
# sudo sgdisk -n 1:0:0 -t 1:8309 /dev/sdX
# または、すでにパーティションテーブルがある場合は、8300(LINUX)の代わりに8309(LUKS)にタイプを設定します
# これが私がやったことです
# パーティションテーブルを一覧表示
sudo sgdisk -p /dev/sdX
# パーティション3を「Linux LUKS」(8309)タイプに設定
sudo sgdisk -t 1:8309 /dev/sdX
その後、LUKSパーティションをフォーマットし、その上にext4ファイルシステムをフォーマットできます。
# LUKSパーティション(私の場合はmmcblk0p3)をフォーマット
sudo cryptsetup luksFormat --type luks2 /dev/sdX1
# LUKSヘッダーを検査(単に楽しみのためです)
sudo cryptsetup luksDump /dev/sdX1
# LUKSボリュームをマウント
# ここで指定した名前(vault)に基づいて/dev/mapper/vaultブロックデバイスが作成されます
sudo cryptsetup open /dev/sdX1 vault
# 'vault'という名前のLUKSブロックデバイス上にファイルシステムを作成
sudo mkfs.ext4 -L vault /dev/mapper/vault
# マウントポイントを作成し、マウントして、新しいデバイスをテストします
sudo mkdir -p /mnt/vault
sudo mount /dev/mapper/vault /mnt/vault
echo "hello" | sudo tee /mnt/vault/test.txt
# ボリュームの状態を取得(楽しみのため)
sudo cryptsetup status vault
sudo ls -l /dev/mapper/
# ext4をアンマウントしてから、cryptボリュームを閉じます
sudo umount /mnt/vault
sudo cryptsetup close vault
LUKSキー スロット
LUKSヘッダーをバックアップしたい場合(間違いがあった場合に、古いキーで古いヘッダーを復元できます):
# バックアップ
sudo cryptsetup luksHeaderBackup /dev/sdX1 --header-backup-file ~/vault-header.img
# 復元
sudo cryptsetup luksHeaderRestore /dev/sdX1 --header-backup-file ~/vault-header.img
次に、キーを追加するいくつかのオプションがあります:
# パスフレーズでキー スロットを追加
sudo cryptsetup luksAddKey /dev/sdX1
# 必要であれば、キー スロットを強制することもできます
sudo cryptsetup luksAddKey --key-slot 5 /dev/sdX1
# キーファイルで定義されたキーを追加
# 512バイトのランダムデータをvault.keyとして生成
# 明らかに、このキーはホームディレクトリよりも安全に保護してください
# マウントするには--key-fileを渡します
sudo dd if=/dev/urandom of=~/vault.key bs=512 count=1
sudo cryptsetup luksAddKey /dev/sdX1 ~/vault.key
# リマインダーとして、キー スロットの数を確認できます
# そして、それらのキーがどのようなタイプを持っているかを知ることができます
sudo cryptsetup luksDump /dev/sdX1
# --test-passphraseを使用してキーをテストすることもできます
sudo cryptsetup open --test-passphrase /dev/sdX1
# キー スロットのパスフレーズを変更します
sudo cryptsetup luksChangeKey /dev/sdX1
# キー自体を提供してキーを削除します
sudo cryptsetup luksRemoveKey /dev/sdX1
# 別のキーを提供してキーを削除します(スロット番号を指定)
# このコマンドを使用して自分のキーを削除することはできません
sudo cryptsetup luksKillSlot /dev/sdX1 1
TPMにバインドされたキーの登録
これにはsystemd-cryptenrollを使用しますので、動作することを確認してください:
# 動作するTPMがあるか確認
sudo systemd-cryptenroll --tpm2-device=list
次に、cryptenrollを使用してリカバリキーを追加します。これはsystemdによってランダムに生成され、必要であればQRコードを提供します。既存のキーは削除されず、ランダム性を使用して新しいキーが追加されるだけです。リカバリキーをこのように追加する必要はありません。これは単に別の方法です。
sudo systemd-cryptenroll --recovery-key /dev/sdX1
そして最後に、TPMを登録するために使用します:
# TPM PCR 7にバインド
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 /dev/sdX1
# PCR 7にバインドし、PINも要求する
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 --tpm2-with-pin=yes /dev/sdX1
# 今行ったことを表示
sudo systemd-cryptenroll /dev/sdX1
sudo cryptsetup luksDump /dev/sdX1
# また、このコマンドを使用して手動でマウントすることもできます
sudo cryptsetup open --token-only /dev/sdX1 vault
これを「本番」で行い、デバイスが自動的にアンロックされるようにしたい場合、systemdはcrypttabでもこれを管理できます:
# luksDumpからvaultのUUIDを取得
sudo cryptsetup luksDump /dev/sdX1
# vaultをcrypttabに追加
echo 'vault UUID=<luks-uuid> none tpm2-device=auto,nofail' | sudo tee -a /etc/crypttab
# 再起動せずにすぐにマウントしたい場合は、daemon-reloadを実行して開始します
# サービスは「一時的」(実行時に生成)なので、--enableすることはできません
sudo systemctl daemon-reload
sudo systemctl start systemd-cryptsetup@vault.service
# 再起動すると、暗号化のアンロックが自動的に行われます
Fedoraでの暗号化されたルート
Fedoraのインストーラー(Anaconda)はすでに暗号化されたボリュームを設定しています。インストール中に私たちが入れるパスフレーズがリカバリキーになります。TPMにバインドされた新しいキー スロットを登録するだけで、オプションでPINを使用できます。
# PCR 7にバインドし、PINも要求する
sudo systemd-cryptenroll --tpm2-device=auto --tpm2-pcrs=7 --tpm2-with-pin=yes /dev/sdX1
# crypttabエントリを編集して、その暗号化ボリュームのTPMをチェックするようにします
sudo nano /etc/crypttab
# luks-<uuid> UUID=<uuid> none discard,tpm2-device=auto
# (既存のオプションを保持し、tpm2-device=autoを追加します)
# initramfsを再構築し、TPM2モジュールが含まれていることを確認します
sudo dracut --force --regenerate-all --add tpm2-tss