Upgrade to Pro — share decks privately, control downloads, hide ads and more …

久しぶりにArchLinuxをインストールしてみた件 OSセットアップ編 / Installing ArchLinux with Secure Boot: OS Setup

久しぶりにArchLinuxをインストールしてみた件 OSセットアップ編 / Installing ArchLinux with Secure Boot: OS Setup

イベント発表資料

鹿児島Linux勉強会 2021.05(オンライン開催)
https://kagolug.connpass.com/event/212250/

Blog version: https://blog.yamano.dev/posts/2021/05/workstation-setup_2021_01/

1b7f1c11e139b8011217c30e16b37b4f?s=128

Yoshihisa Yamano

May 23, 2021
Tweet

Transcript

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

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

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

  4. 変わったこと 最後に真面目にインストールしたのは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に乗り換え、見事に他の日本語入力ができない体 になった。
  5. 変わらなかったこと 逆にこの 3~5 年で変わらなかった事。 ArchLinux というディストリビューションを使い続けている事。 startx + i3-wm というデスクトップ環境。

    xterm + tmux + bash + vim + mutt(neomutt) というターミナル生活環境。 Windows環境が必要な時はRemmina(+freerdp)でRDPして使う事。 マシン本体やキーボード等。金欠 据え長く大切に使いましょう計画。 https://www.archlinux.jp/
  6. そうだ、綺麗にしよう。 1つのマシンで試して、他のマシンも同様に綺麗にしよう。

  7. Linux workstation SECURITY

  8. 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 等の強制アクセス制御を導入しよう。
  9. DebianやUbuntu、Fedora等のディストリビューションでは満せる項目は多いと思う。 インストーラでオプション指定できるように整っている。 ArchLinux では、意図的にそれぞれ設定していく必要が有る。

  10. Secure Boot

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

  12. Managing EFI Boot Loaders for Linux: Dealing with Secure Boot

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

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

    AMTの無効化。
  15. インストール作業 過去の暗号化されていないデータが存在した場合の対策、これからのセットアップが 完了した後の難読化の為、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 と / を切り出す。
  16. 説明省略 ]# 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 続きのパッケージ導入等も省略
  17. 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
  18. Sign to unified kernel image ESP(非暗号化パーティション)に配置する、 カーネル 初期RAMイメージ Intel microcode

    をまとめて1つのファイルにし、これに署名する。他にも /usr/lib/os-release kernel parameter スプラッシュイメージ を含める。
  19. 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"
  20. 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
  21. ファームウェアに鍵を登録しSecure Boot enableで目 出たく完成!

  22. なお手順は省略

  23. 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
  24. パッケージマネージャフック

  25. パッケージマネージャにより、ブートローダ/カーネル/マイクロコード が更新された 時に署名しなおすフックを作成しておく。 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
  26. 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
  27. 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
  28. 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
  29. 参考資料 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