前言#
中華人民共和国人民警察にいつでも捜索される可能性があることを発見して以来、私の暗号化への偏執が再発しました。私は LUKS2 と YubiKey で自分のコンピュータを武装することに決めました。可能であれば、この YubiKey を破壊しやすいように改造したいと思っています。
しかし、環境を設定するには少なくとも 2 日ほどかかるため、手元の作業が多すぎて、その間に 1 ヶ月半を病院で過ごしました。そのため、なかなか手を付けられませんでした。4 ヶ月後、ようやく時間ができました。さあ、始めましょう。
準備作業#
いくつかの記事を読みました:
両者の利点と欠点を考慮し、自分のプランを導き出しました。事前に仮想マシンで 2 回試してみた結果、比較的満足のいく結果が得られました。
プラン紹介#
このプランでは、EFI パーティションを除く全ハードディスクを LUKS2 で暗号化し、Unified Kernel Image でブートします。ブートとシステム起動には、パスワードを 1 回入力するだけで済みます(YubiKey を使用する場合は、パスワードなしに設定することも、2FA に設定することも可能です)。EFI パーティションには main.efi が存在し、そこには initramfs、microcode、および kernel が含まれています。これらは sbctl で署名され、Secure Boot をサポートします。最後に、YubiKey を設定して LUKS2 の復号に使用します。
このプランでは linux-zen カーネルを使用します。
このプランでは TPM を使用しません。TPM の設定が不適切だと、あなたの暗号化が失敗する可能性があります。1必要があれば、「準備作業」セクションの 2 番目の記事を参考にしてください。
多くの不必要な詳細を追加するかもしれませんが、それは私の神経の多様性のせいです、この記事の性質はメモ / 手稿であり、操作手順ではありません。この記事に含まれるコマンドは示例であり、実際の操作中には異なる場合があります。
この記事は 2024 年 2 月 10 日に作成されました。あなたがこの記事を読んでいるとき、内容はすでに古くなっている可能性があります。私は十分なセキュリティ知識を持っていないため、この記事の操作が安全であることを保証することはできません。
システムのインストール#
この時点で、あなたの Secure Boot はオフになっているはずです。システムをインストールする際に Secure Boot をオンにしたい人はいないと思います。
まず、インストールガイドに従い、インストールガイド #ハードディスクパーティションの作成まで進みます。
lsblk
cfdisk /dev/nvme0n1
最初のパーティションは EFI パーティションとして、1G または 0.5G に分割します。後続の UKI が約 100MB を占めます。
残りのスペースはすべて 2 番目のパーティションに割り当てます。暗号化パーティションとなります。Swap パーティションを分けない理由は、現在の btrfs が swapfile をサポートしており、私の RAM が十分だからです。
mkfs.vfat -n EFI /dev/nvme0n1p1 # これは最初のパーティションだと仮定します
LUKS2 コンテナを作成、マウント、フォーマットします。デフォルト設定は基本的にニーズを満たしています:
cryptsetup luksFormat /dev/nvme0n1p2 # これは2番目のパーティションだと仮定します
cryptsetup open /dev/nvme0n1p2 system
mkfs.btrfs --label system /dev/mapper/system
cryptsetup luksFormat /dev/nvme0n1p2 の際に、パスワードの入力を求められます。この時、インストール時に一時的に使用するパスワードを設定できます。YubiKey の設定が完了した後に変更します。
一時的に btrfs ルートをマウントし、サブボリュームを作成します:
mount /dev/mapper/system /mnt
btrfs subvolume create /mnt/@root
btrfs subvolume create /mnt/@home
btrfs subvolume create /mnt/@var
具体的にどれだけのサブボリュームを作成するかは、各自の判断に任せます。
その後、ルートをアンマウントし、サブボリュームと ESP パーティションをマウントします:
umount -R /mnt
mount --mkdir -o noatime,subvol=@root /dev/mapper/system /mnt
mount --mkdir -o noatime,subvol=@home /dev/mapper/system /mnt/home
mount --mkdir -o noatime,subvol=@var /dev/mapper/system /mnt/var
mount --mkdir /dev/nvme0n1p1 /mnt/efi
ミラーサイトを設定し、システムをインストールして chroot します:
vim /etc/pacman.d/mirrorlist
# ここで -K の意味は keyring をコピーすることです
pacstrap -K /mnt base linux-zen linux-firmware intel-ucode btrfs-progs
その後、インストールガイド #システムの設定に従ってシステムを設定します。設定が完了したら、急いで umount と再起動をしないでください。ブートの設定が必要です。
# 前述の手順に従っていれば、今は arch-chroot 環境にいるはずです
pacman -Syu networkmanager base-devel vim sbctl efibootmgr
vim /etc/mkinitcpio.conf
その HOOKS の欄を以下の形式に設定します:
HOOKS=(base udev autodetect modconf kms keyboard keymap consolefont block encrypt filesystems fsck)
plymouth と ykfde(YubiKey)の設定は、ブートが成功した後に行います。
/etc/kernel/cmdline を作成し、以下を書き込みます:
fbcon=nodefer rw rd.luks.allow-discards cryptdevice=/dev/nvme0n1p2:system bgrt_disable root=LABEL=system rootflags=subvol=@root,rw splash vt.global_cursor_default=0
これがあなたのカーネルパラメータになります。今後カーネルパラメータを設定する必要がある場合は、ここを変更してください。sbctl は自動的に microcode を設定します。intel-ucode または amd-ucode をインストールするだけで、追加のパラメータを加える必要はありません。
/etc/crypttab.initramfs を作成し、以下を書き込みます:
system /dev/nvme0n1p2 none timeout=180
このステップは、initramfs 起動時に /dev/nvme0n1p2 にある LUKS2 コンテナを解読し、/dev/mapper/system にマウントするためのものです。
/etc/vconsole.conf を作成または編集します:
KEYMAP=us
FONT=lat2-16
これにより、mkinitcpio 時の警告が解決されます。
キーを作成し、Unified Kernel Image を生成してブートに追加します:
sbctl create-keys
# linux-zen を使用しているため、カーネルと initramfs のファイル名を指定する必要があります
sbctl bundle -k /boot/vmlinuz-linux-zen -i /boot/intel-ucode.img -f /boot/initramfs-linux-zen.img -s /efi/main.efi
# AMD マイクロコードを使用する場合はこの行を使用します。-i と -a パラメータの違いがあります
sbctl bundle -k /boot/vmlinuz-linux-zen -a /boot/amd-ucode.img -f /boot/initramfs-linux-zen.img -s /efi/main.efi
mkinitcpio -P
efibootmgr --disk /dev/nvme0n1 --part 1 --create --label "Arch Linux" --loader /efi/main.efi
exit # chroot を終了
umount -R /mnt
reboot
これでシステムに起動できるはずです。起動中に、以前 cryptsetup luksFormat で設定したパスワードの入力を求められます。
システムに入ったら、次の手順で無線ネットワークに接続できます:
systemctl enable --now NetworkManager
nmtui
NTP を設定します:
timedatectl set-ntp true
YubiKey の設定#
推奨読書に従って、多ユーザーとデスクトップを設定します。
Yubikey#Challenge-response_2 に従って YubiKey を設定します(yubikey-full-disk-encryption)、1FA または 2FA に設定できます。
システムを再起動し、YubiKey の設定が成功したことを確認します。
YubiKey が正常に動作することを確認したら、cryptsetup luksChangeKey /dev/nvme0n1p2 を使用して、以前に設定した一時的なパスワードを変更してください。強力なものに変更し、できれば自分でも覚えられないようにして、紙に書いて(できれば水に溶けるインクを使って)安全だが手の届く場所に保管してください。
以下のコマンドで生成できます:
openssl rand -base64 16
Plymouth の設定#
Plymouth を見たい場合、ここで設定することもできます。私の Plymouth は起動時にブロックが表示されますが、その理由は initramfs にフォントがないためです。解決策は、mkinitcpio の際に追加することです。以下の例に従って /etc/mkinitcpio.conf を編集します:
# 他のフォントに変更することもできます
FILES=(/usr/share/fonts/noto/NotoSans-Regular.ttf)
Snapper の設定#
Snapper はあなたの btrfs に定期的なスナップショットと復元を提供します。私はグラフィカルな Btrfs Assistant を使用して設定しているため、ここでは特に言うことはありません。
Secure Boot の設定#
この操作を誤るとデータが失われる可能性があります。
このステップを最後にしたのは、最も面倒だからであり、Secure Boot を有効にすると、システムメンテナンスディスクから修正するのが難しくなるからです。
TPM を使用しない前提で Secure Boot を設定することの利点はあまりなく、むしろ多くの問題を引き起こす可能性があります。しかし、TPM を使用している場合(キーを TPM に書き込んでいる場合)、Secure Boot を設定しないとセキュリティが低下します。1私は Windows 側で Bitlocker を有効にしているため(システムドライブを暗号化する際に、キーが TPM に書き込まれます)、Secure Boot を設定しようと思ったのです。
あなたのコンピュータに Windows システムがあり、Windows システムドライブで Bitlocker が有効になっている場合は、復元キーをバックアップして保管してください。次回 Windows を起動する際に必要になる可能性があります。
BIOS インターフェースで Secure Boot を有効にし、Setup Mode にリセットします。Linux に再起動します。以下のコマンドを使用して、キーを Secure Boot にインストールします:
sbctl enroll-keys -mcft
もしあなたの Secure Boot が Setup Mode にリセットされていない場合、このステップはエラーになります。強制的に書き込まないでください。
各パラメータの説明:
| パラメータ | 説明 |
|---|---|
-m | Microsoft、Microsoft のキーを追加し、Windows を起動できるようにします |
-c | custom、カスタムキーを追加し、Linux を起動できるようにします |
-f | firmware-builtin、ファームウェア内蔵キーを追加します |
-t | tpm-eventlog、TPM イベントログを追加します |
sbctl は以前の sbctl bundle ... -s /efi/main.efi の際に構築情報を保存し(-s パラメータ)、毎回 mkinitcpio の際に自動的に更新します。したがって、手動で更新する必要はありません。sbctl のマニュアルページを参照して、さらに多くの使い方を確認することもできます。例えば、sbctl を使用して refind や systemd-boot に署名することができます。
その日が来たら#
緊急にキーを破棄する必要がある場合、正しい手順は次のとおりです:
- 前述のパスワードが書かれた紙を見つけて、それを破棄します。
- YubiKey を破壊し、そのチップ(内部のシリコンチップ)を粉砕します。もしあなたが以前に 1FA を設定していた場合、このステップは最初に行うべきです。 YubiKey は非常に頑丈であるため、道具を使う必要があるかもしれません。また、普段から破壊しやすいように改造しておくことも考慮してください。
その後は、破門に入ってくる軍警に微笑んで迎えましょう。そんな日が来ないことを願っています。