【Linux】セキュリティを考えたarch linux install メモ
前書き
動機
linuxでもwindowsにレベルに暗号化してガチガチに固めたいと思った
なにを目指すのか
なるべくセキュアでモダンなセットアップをすることで快適なArch Linux Lifeを送りたい
セキュアブート,DISK暗号化,TPM認証
このあたりを実現したい
bootセクターの暗号化はできなかったため有識者の方は教えてほしい
私の環境
- HP HP Pavilion Laptop 15-eh0xxx
- APU :AMD Ryzen™ 5 4500U with Radeon™ Graphics
- MEM :DDR4 16.0 GiB
- DISK:SSD 500GB
構成
- OS:Arch Linux
- boot:
- Secure boot
- systemd-boot
- LVM on LUKS + TPM自動認証
- homeディレクトリの暗号化 (pamモジュールで解錠)
構築
事前準備
はじめはセキュアブートoffの状態でセットアップを始める
キーボードを日本語配列に変える
loadkeys jp106
iwdをつかってwifiにつなぐ
iwctl
$iwd station wlan0 scan
$iwd station wlan0 get-network
$iwd station wlan0 connect SSID
疎通確認
ping google.com
システムクロックの更新
timedatectl set-ntp true
DISKの完全消去
なんでもいいので消去する
arch wikiに乗ってるddコマンドを載せておく
dd if=/dev/zero of=/dev/sdX bs=4096
sdXには消去したいドライブを指定しておく
事前に
lsblk
などで調べておくと良い
私の環境の場合
dd if=/dev/zero of=/dev/nvme0p1 bs=4096
パーティションを切る
cgdisk /dev/shX
で編集することをおすすめする
TUIで編集できる
構成はこのようにする
パーティションネーム | パーティションタイプ | パーティションID | 推奨サイズ |
---|---|---|---|
boot | EFI system | ef00 | 1G |
system | Linux LVM | 8e00 | 残りすべて |
swap領域はLVMの中に作成するためここでは作成不要だ
bootパーティションはセキュアブートのためにいじくり回すので多めに取っておこう!
Systemパーティションの暗号化
前項でsystemと名付けたパーティションを暗号化していく
#パーティションをLUKSをつかってフォーマット
cryptsetup luksFormat /dev/nvme0n1p2
#暗号化コンテナをオープンする
cryptsetup open --type luks /dev/nvme0n1p2 cryptolvm
#復号化されたコンテナが /dev/mapper/cryptolvm から利用できる
これでsystemパーティションがLUKSによって暗号化された
この上にLVMを使ってパーティションを切っていく
#物理ボリュームを作成
pvcreate /dev/mapper/cryptolvm
#MyVol という名前のボリュームグループを作成して、先に作成した物理ボリュームを追加
vgcreate MyVol /dev/mapper/cryptolvm
#ボリュームグループに論理ボリュームを作成
lvcreate -L 32G MyVol -n swap #swap領域
lvcreate -l 100%FREE -n system MyVol #system領域
メモリが16GBあるのでswapは2倍理論を採用しswapは32GBとした
任意の値を入れてほしい
フォーマット
作成するためしたパーティションをフォーマットしていく
#bootパーティション:fat32でフォーマット
mkfs.vfat -F32 /dev/nvme0n1p1
#rootパーティション:ext4でフォーマット
mkfs.ext4 /dev/mapper/MyVol-system
#swap領域
mkswap /dev/mapper/MyVol-swap
今回はext4を使うことにしたがお好みのファイルシステムでフォーマットしていただければ大丈夫だ
xfsなどは最初からarchisoに入っているのでインストール不要だ
マウント
フォーマットしたパーティションをマウントする
#/mntにsystem領域をマウントする
mount /dev/mapper/MyVol-system /mnt
#boot領域作成
mkdir /mnt/boot
#boot領域にbootパーティションをマウント
mount /dev/nvme0n1p1 /mnt/boot
#swap領域を有効化する
swapon /dev/mapper/MyVol-swap
インストール
ようやくArch Linuxをインストールしていく
pacstrap -K /mnt base base-devel linux linux-firmware linux-headers lvm2 vim amd-ucode
ここではスタンダードにプレーンなlinuxカーネルを使うが、
お好みでlinux-zenやlinux-pfカーネルを使うこともできる
LVMを読み込むためにlvm2を入れている
テキストエディターとしてvimを入れているがここはお好きなエディターを入れてほしい
AMD CPUを使っているのでamd-ucodeを入れます
システムの設定
ほぼarchwikiからのコピペであることは内緒である
fstab の生成
UUIDを使いたいので -U オプションをつける
genfstab -U /mnt >> /mnt/etc/fstab
chroot
インストールしたシステムに入る
arch-chroot /mnt
タイムゾーン
ln -sf /usr/share/zoneinfo/Region/City /etc/localtime
hwclock --systohc
ローカリゼーション
まず/etc/locale.genを編集する
#以下の2つをコメントアウトする
en_US.UTF-8 UTF-8
ja_JP.UTF-8 UTF-8
そして以下のコマンドを実行する
locale-gen
言語設定とキーマップ設定の設定を行う
#言語設定
echo LANG=ja_JP.UTF-8 > /etc/locale.conf
#キーマップ設定
echo KEYMAP=jp106 > /etc/vconsole.conf
ネットワーク設定
ホストネームを設定する
echo laptop_arch > /etc/hostname
laptop_archの部分はお好みの名前にしよう
mkinitcpio.confを編集する
busybox initをsystemd init変更しlvm sd-encryptなどをHOOKに追加する
MODULES=(tpm_tis?)
HOOKS=(systemd autodetect modconf keyboard sd-vconsole block sd-encrypt lvm2 filesystems fsck)
systemd-cryptenrollを使うためにsystemdに変更する必要がある。
設定を更新したら、新しいinitramfs-linux.imgを生成します。
mkinitcpio -p linux
仮パスワードを設定
passwd
これで仮にrootのパスワードを設定します
あとで削除します
bootloaderをインストールする
systemd-bootをbootセクターにインストール
bootctl install
boot/loader/entries/arch.confを作成し以下のように編集する
title Arch Linux
linux /vmlinuz-linux
initrd /amd-ucode.img
initrd /initramfs-linux.img
options luks.name=systemUUID=crypolvm root=/dev/mapper/MyVol-system rw
systemUIDは
ls -l /dev/disk/by-uuid
などで調べておいてください
例
ここでは
dev/nvme0n1p2のUUIDとなっています
title Arch Linux
linux /vmlinuz-linux
initrd /amd-ucode.img
initrd /initramfs-linux.img
options luks.name=xxxxxxxx-3819-4a0e-9af9-c1de2e4239d3=cryptolvm
options root=/dev/mapper/MyVol-system
またsystemd-boot-update.serviceをつかいsystemdのアップデート時にbootローダーもアップデートします
systemctl enable systemd-boot-update.service
再起動する前にすること
NetworkMnagerをインストールして有効化しておきます
これをしないと再起動後Wi-Fiにつなぐのが非常に面倒くさくなります。
#networkmanagerをインストールする
pacman -S networkmanager
#有効化する
systemctl enable NetworkManager.service
これで再起動後にnmtuiを使うことができます
再起動
再起動します
このときUEFIでセキュアブートをセットアップモードにしましょう
セキュリティキーの削除などがトリガーとなっています
ユーザーの追加
ユーザーを追加します
このときsystemd-homedを使うことでluksで暗号化されたhomeディレクトリを簡単に使うことができます。
# systemd-homedを有効化&起動
systemctl enable --now systemd-homed.service
# ユーザーを作成
homectl create username --storage=luks --member-of==users,wheel
usernemeにはお好みのユーザーネームを入れてください
その後sudoを入れます
pacman -S sudo
非特権ユーザーでもsudo を使って特権昇格するために /etc/sudoers を編集します
vim /etc/sudoers
で開き
## uncomment to allow members of group wheel to execute any command
%wheel ALL=(ALL:ALL) ALL
この行をアンコメントします
仮に設定したパスワードを削除します
passwd -l root
Securebootをセットアップしよう
事前準備
sbctl を使います
sudo pacman -S sbctl
次にSetup modeに入れているか確認します
成功例
user% sbctl status
Installed: ✘ Sbctl is not installed
Setup Mode: ✘ Enabled
Secure Boot: ✘ Disabled
失敗例
user% sbctl status
Installed: ✗ sbctl is not installed
Setup Mode: ✓ Disabled
Secure Boot: ✗ Disabled
Vendor Keys: microsoft builtin-db builtin-KEK builtin-PK
キーの作成
Setup modeに入ったらまずキーを作成します
sudo sbctl create-keys
次にUEFIに鍵を登録します
sudo sbctl sbctl enroll-keys -m -f=db,KEK,PK
署名
次に署名をしていきます。
まず署名が必要なファイルを調べます
sudo sbctl verify
Verifying file database and EFI images in /efi...
✘ /boot/vmlinuz-linux is not signed
✘ /efi/EFI/BOOT/BOOTX64.EFI is not signed
✘ /efi/EFI/systemd/systemd-bootx64.efi is not signed
この場合 3つのファイルに署名が必要です
sudo sbctl sign -s /efi/EFI/BOOT/BOOTX64.EFI
✔ Signed /efi/EFI/BOOT/BOOTX64.EFI...
sudo sbctl sign -s /boot/vmlinuz-linux
✔ Signed /boot/vmlinuz-linux...
sudo sbctl sign -s /efi/EFI/systemd/systemd-bootx64.efi
✔ Signed /efi/EFI/systemd/systemd-bootx64.efi...
これで署名は完了ですが、今回は systemd-boot-update.service を利用しているためその置き換え元のファイルもサインします
sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi
これで再起動しUEFIからセキュアブートをenableにしてください
これでセキュアブートのセットアップは完了です。
TPMを使い認証するようにする
systemパーティションを使いのロックをTPM keyを使いunlockできるよう鍵を登録する
systemd-cryptenroll /dev/nvme0n1p2 --wipe-slot=tpm2 --tpm2-device=auto --tpm2-pcrs=7
これで自動認証されるようになるはずです
"--tpm-pcrs="の値について
この表に従ってキーが更新されます
ここでは7を用いましたが
4+7などに変更したほうがセキュアです
しかし頻繁に更新されると都度鍵を登録し直さないといけなくなります。
なので私は7を使っています
ここから先は他の方のinstall guide と内容が丸かぶりするためここでは省略
(要望があれば追記します)
ご指摘等ありましたらコメント欄にぜひ書いて言ってください
むせび泣いて喜びます
参考文献
- https://wiki.archlinux.jp/index.php/ディスクの完全消去#dd
- https://wiki.archlinux.jp/index.php/パーティショニング
- https://wiki.archlinux.jp/index.php/Dm-crypt/システム全体の暗号化#LVM_on_LUKS
- https://wiki.archlinux.jp/index.php/インストールガイド
- https://wiki.archlinux.jp/index.php/Systemd-cryptenroll
- https://wiki.archlinux.jp/index.php/Trusted_Platform_Module#TPM_2.0_.E3.81.AE.E4.BD.BF.E7.94.A8
- https://wiki.archlinux.jp/index.php/Systemd-homed
- https://zenn.dev/ytjvdcm/articles/0efb9112468de3
- https://www.kofuk.org/blog/20230204-archlinux-luks-lvm/
- https://speakerdeck.com/yoshihisaya/installing-archlinux-with-secure-boot-os-setup
- https://blog.lufia.org/entry/2022/02/13/020028
- https://github.com/Foxboron/sbctl#sbctl---secure-boot-manager
- https://man.archlinux.org/man/sbctl.8
- https://www.freedesktop.org/software/systemd/man/latest/systemd-cryptenroll.html
Discussion