😸

【Linux】セキュリティを考えたarch linux install メモ

2023/11/01に公開

前書き

動機

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を編集する

/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に追加する

/etc/minitcpio.conf
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を作成し以下のように編集する

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

で開き

/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 と内容が丸かぶりするためここでは省略

(要望があれば追記します)

ご指摘等ありましたらコメント欄にぜひ書いて言ってください
むせび泣いて喜びます

参考文献

Discussion