Slide 1

Slide 1 text

久しぶりにArchLinuxをインストールしてみた件 OSセットアップ編 鹿児島Linux勉強会 2021.05(オンライン開催) https://kagolug.connpass.com/event/212250/ ブログ記事版 https://blog.yamano.dev/posts/2021/05/workstation-setup_2021_01/ Yoshihisa Yamano

Slide 2

Slide 2 text

お前誰? 鹿児島県出身 学生時代にkagolugの第0回より第13回(2016年03月)まで現地参加していた。 現在は東京都在住で、最近になってオンライン開催にお邪魔しております。 好きなディストリビューションはArchLinux。 https://www.yamano.dev/

Slide 3

Slide 3 text

久しぶりにArchLinuxをインストールしてみた

Slide 4

Slide 4 text

変わったこと 最後に真面目にインストールしたのは3~5年くらい前で、多くの事が変わった。 LUKS(dm-crypt) のデフォルトバージョンが 1 -> 2 となった。 /boot + LVM on LUKS (BIOS-MBR) という /boot 丸出し構成を辞めた。 まだ一部のマシンがこの構成で残ってしまっていた。 全てのマシンでプロプライエタリGPUドライバを廃止した。 Go製ツールが増えた事に加え、自身もPythonからGoに主言語を変更した。 Chromium へ Google API 等が停止され Firefox に乗り換えた。 Mozc(Google日本語入力)からSKKに乗り換え、見事に他の日本語入力ができない体 になった。

Slide 5

Slide 5 text

変わらなかったこと 逆にこの 3~5 年で変わらなかった事。 ArchLinux というディストリビューションを使い続けている事。 startx + i3-wm というデスクトップ環境。 xterm + tmux + bash + vim + mutt(neomutt) というターミナル生活環境。 Windows環境が必要な時はRemmina(+freerdp)でRDPして使う事。 マシン本体やキーボード等。金欠 据え長く大切に使いましょう計画。 https://www.archlinux.jp/

Slide 6

Slide 6 text

そうだ、綺麗にしよう。 1つのマシンで試して、他のマシンも同様に綺麗にしよう。

Slide 7

Slide 7 text

Linux workstation SECURITY

Slide 8

Slide 8 text

Linux workstation security checklist 1つの基準としてとても参考になった。 https://github.com/lfit/itpol/blob/master/linux-workstation-security.md 日本語版(一部が未更新): https://postd.cc/linux-workstation-security-checklist-part1/ 例えば 不要な外部インタフェースは無効化しよう。 ストレージはLUKSでフル暗号化を実施の上、暗号化できないカーネルイメージや 初期RAMイメージ等はSecure Bootで改竄検知しよう。 SELinux/AppArmor 等の強制アクセス制御を導入しよう。

Slide 9

Slide 9 text

DebianやUbuntu、Fedora等のディストリビューションでは満せる項目は多いと思う。 インストーラでオプション指定できるように整っている。 ArchLinux では、意図的にそれぞれ設定していく必要が有る。

Slide 10

Slide 10 text

Secure Boot

Slide 11

Slide 11 text

暗号化できないカーネルイメージ等を改竄から守る仕組み。 UEFI では ESP(EFI System Partition) に存在するカーネルイメージから起動する が、このカーネルイメージに事前に署名しておき、UEFI ファームウェアが検証する事 で実現する。

Slide 12

Slide 12 text

Managing EFI Boot Loaders for Linux: Dealing with Secure Boot Linux環境でのSecure Bootについて、Secure Bootの仕組みそのものから参考になっ た。 http://www.rodsbooks.com/efi-bootloaders/secureboot.html

Slide 13

Slide 13 text

ArchLinux Install

Slide 14

Slide 14 text

事前準備 Microsoft Windows をインストールし、Lenovo Vantageで全てのファームウェア をアップデートした。(手軽だったから) 今回のマシンはIntel vPro に対応していたので Intel AMTの無効化。

Slide 15

Slide 15 text

インストール作業 過去の暗号化されていないデータが存在した場合の対策、これからのセットアップが 完了した後の難読化の為、shredする。 ]# shred -n 1 -v /dev/sda ESP + LVM on LUKS としてパーティションを整備する。 Number Start (sector) End (sector) Size Code Name 1 2048 1050623 512.0 MiB EF00 EFI system partition 2 1050624 500118158 238.0 GiB 8308 Linux dm-crypt sda1 は FAT32 として、sda2はLUKSを組みその上にLVMを構成した後、LVMから swap と / を切り出す。

Slide 16

Slide 16 text

説明省略 ]# mkfs.fat -F32 /dev/sda1 ]# cryptsetup -v -s 512 luksFormat /dev/sda2 ]# cryptsetup luksOpen /dev/sda2 cryptlvm ]# pvcreate /dev/mapper/cryptlvm ]# vgcreate vg0 /dev/mapper/cryptlvm ]# lvcreate -L 16g vg0 -n swap ]# mkswap /dev/vg0/swap ]# swapon /dev/vg0/swap ]# lvcreate -l 100%FREE vg0 -n root ]# mkfs.ext4 /dev/mapper/vg0-root 作成した / を /mnt に、 ESPは /boot/esp に配置する事とし /mnt/boot/esp にマウ ント。 ]# mount /dev/mapper/vg0-root /mnt ]# mkdir -p /mnt/boot/esp ]# mount /dev/sda1 /mnt/boot/esp 続きのパッケージ導入等も省略

Slide 17

Slide 17 text

Create Secure Boot keys (chroot)]# bootctl --path=/boot/esp install ArchWiki を参考に、 Secure Boot で必要となる鍵ペアを作成しておく。 https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface/Secure _Boot (chroot)]# uuidgen --random > GUID.txt (chroot)]# openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Platform Key/" -out PK.crt (chroot)]# openssl x509 -outform DER -in PK.crt -out PK.cer (chroot)]# cert-to-efi-sig-list -g "$(< GUID.txt)" PK.crt PK.esl (chroot)]# sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth (chroot)]# sign-efi-sig-list -g "$(< GUID.txt)" -c PK.crt -k PK.key PK /dev/null rm_PK.auth (chroot)]# openssl req -newkey rsa:4096 -nodes -keyout KEK.key -new -x509 -sha256 -days 3650 -subj "/CN=my Key Exchange Key/" -out KEK.crt (chroot)]# openssl x509 -outform DER -in KEK.crt -out KEK.cer (chroot)]# cert-to-efi-sig-list -g "$(< GUID.txt)" KEK.crt KEK.esl (chroot)]# sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt KEK KEK.esl KEK.auth (chroot)]# openssl req -newkey rsa:4096 -nodes -keyout db.key -new -x509 -sha256 -days 3650 -subj "/CN=my Signature Database key/" -out db.crt (chroot)]# openssl x509 -outform DER -in db.crt -out db.cer (chroot)]# cert-to-efi-sig-list -g "$(< GUID.txt)" db.crt db.esl (chroot)]# sign-efi-sig-list -g "$(< GUID.txt)" -k KEK.key -c KEK.crt db db.esl db.auth

Slide 18

Slide 18 text

Sign to unified kernel image ESP(非暗号化パーティション)に配置する、 カーネル 初期RAMイメージ Intel microcode をまとめて1つのファイルにし、これに署名する。他にも /usr/lib/os-release kernel parameter スプラッシュイメージ を含める。

Slide 19

Slide 19 text

Intel microcodeとinitramfsを統合しておく。 (chroot)]# pacman -S intel-ucode (chroot)]# cat /boot/intel-ucode.img /boot/initramfs-linux.img > /boot/ucode-initramfs-linux.img kernel parameter はファイルとして作成しておく。 (chroot)]# vi /etc/cmdline cryptdevice=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:cryptlvm root=/dev/mapper/vg0-root rw quiet sysrq_always_enabled=1 apparmor=1 security=apparmor unified kernel imageを作成する。 (chroot)]# objcopy --add-section .osrel="/usr/lib/os-release" \ --change-section-vma .osrel=0x20000 --add-section .cmdline="/etc/cmdline" \ --change-section-vma .cmdline=0x30000 --add-section .splash="/usr/share/systemd/bootctl/splash-arch.bmp" \ --change-section-vma .splash=0x40000 --add-section .linux="/boot/vmlinuz-linux" \ --change-section-vma .linux=0x2000000 --add-section .initrd="/boot/ucode-initramfs-linux.img" \ --change-section-vma .initrd=0x3000000 "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "/boot/esp/EFI/Linux/linux.efi"

Slide 20

Slide 20 text

unified kernel image及びブートローダ(EFIアプリケーション)に署名する。 (chroot)]# sbsign --key /etc/secureboot/db.key --cert /etc/secureboot/db.crt --output /boot/esp/EFI/systemd/systemd-bootx64.efi /boot/esp/EFI/systemd/systemd-bootx64.efi (chroot)]# sbsign --key /etc/secureboot/db.key --cert /etc/secureboot/db.crt --output /boot/esp/EFI/BOOT/BOOTX64.EFI /boot/esp/EFI/BOOT/BOOTX64.EFI (chroot)]# sbsign --key /etc/secureboot/db.key --cert /etc/secureboot/db.crt --output /boot/esp/EFI/Linux/linux.efi /boot/esp/EFI/Linux/linux.efi

Slide 21

Slide 21 text

ファームウェアに鍵を登録しSecure Boot enableで目 出たく完成!

Slide 22

Slide 22 text

なお手順は省略

Slide 23

Slide 23 text

Secure Bootとなっているか確認 ]# bootctl --esp-path=/boot/esp status System: Firmware: UEFI X.XX (Lenovo X.XXXX) Secure Boot: enabled Setup Mode: user TPM2 Support: no Boot into FW: supported Current Boot Loader: Product: systemd-boot 248-5-arch

Slide 24

Slide 24 text

パッケージマネージャフック

Slide 25

Slide 25 text

パッケージマネージャにより、ブートローダ/カーネル/マイクロコード が更新された 時に署名しなおすフックを作成しておく。 systemd-bootのアップデートフック ]# cat 96-systemd-boot.hook [Trigger] Type = Package Operation = Upgrade Target = systemd [Action] Description = Updating systemd-boot When = PostTransaction Exec = /usr/bin/bootctl --path=/boot/esp update

Slide 26

Slide 26 text

Intel Microcodeを含むinitramfsを作成するフック ]# cat 97-intel-ucode.hook [Trigger] Operation = Install Operation = Upgrade Type = Package Target = intel-ucode Target = linux Target = systemd [Action] Description = Create microcode include initramfs When = PostTransaction Exec = /usr/bin/sh -c "/usr/bin/cat /boot/intel-ucode.img /boot/initramfs-linux.img > /boot/ucode-initramfs-linux.img" Depends = coreutils

Slide 27

Slide 27 text

unified kernel imageを作成するフック ]# cat 98-unified-kernel-image.hook [Trigger] Operation = Install Operation = Upgrade Type = Package Target = intel-ucode Target = linux Target = systemd [Action] Description = Create unified kernel image When = PostTransaction Exec = /usr/bin/objcopy --add-section .osrel="/usr/lib/os-release" --change-section-vma .osrel=0x20000 --add-section .cmdline="/etc/cmdline" --change-section-vma .cmdline=0x30000 --add-section .splash="/usr/share/systemd/bootctl/splash-arch.bmp" --change-section-vma .splash=0x40000 --add-section .linux="/boot/vmlinuz-linux" --change-section-vma .linux=0x2000000 --add-section .initrd="/boot/ucode-initramfs-linux.img" --change-section-vma .initrd=0x3000000 "/usr/lib/systemd/boot/efi/linuxx64.efi.stub" "/boot/esp/EFI/Linux/linux.efi" Depends = binutils

Slide 28

Slide 28 text

unified kernel image及びブートローダに署名するフック ]# cat 99-secureboot.hook [Trigger] Operation = Install Operation = Upgrade Type = Package Target = intel-ucode Target = linux Target = systemd [Action] Description = Signing Kernel for Secure Boot When = PostTransaction Exec = /usr/bin/sh -c "/usr/bin/find /boot/esp -type f \( -name 'linux.efi' -o -name 'systemd*' -o -name 'BOOTX64.EFI' \) -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>/dev/null | /usr/bin/grep -q \"signature certificates\"; then /usr/bin/sbsign --key /etc/secureboot/db.key --cert /etc/secureboot/db.crt --output {} {}; fi' \;" Depends = sbsigntools Depends = findutils Depends = grep

Slide 29

Slide 29 text

参考資料 Linux workstationの基本的なセキュリティ要件について Linux workstation security checklist Linux のためのSecure Boot対応について Managing EFI Boot Loaders for Linux: Dealing with Secure Boot Secure BootについてのArchWiki Unified Extensible Firmware Interface/Secure Boot - ArchWiki