🐥

Manjaro Linuxで自動復号化のディスク暗号化と休止状態の実現方法

2023/11/17に公開

はじめに

今回は、モバイルノートパソコンのセキュリティを確保するためにディスクの暗号化を行う方法を備忘録として残します。
Manjaro Linuxを使用しましたが、Arch Linux系列のOSでも使用できると思います。

環境

  • Manjaro Linux
  • TPM2搭載PC (Windows 11 対応PC)

※解説のためにQEMU/KVMを使用します。

目標

Manjaro Linuxを次の構成でインストールすることを目指します。

  • LVM on Luks (論理ディスクを暗号化する)
  • TPM2を使用して自動復号化
  • 休止状態を使用できる状態
  • セキュアブート
  • セキュリティの確保

パーティションの構成

物理ディスク

Partition Type Mount Point
/dev/vda1 fat32 /boot/efi
/dev/vda2 ext4 /boot
/dev/vda3 lvm2 pv (Encrypted) system

論理ボリューム(/dev/sda3上のlvm2 pv)

Partition Type Mount Point
/dev/system/root btrfs /
/dev/system/swap linuxswap none

インストール方法

物理パーティションの準備

  1. セキュアブートの無効化

  2. Manjaro LinuxインストールディスクからBootします。

  3. KDE Partition Managerなどを使用して、次のようなパーティションを作成します。

    partition

  4. 暗号化ディスクを準備する

    cryptsetup luksFormat /dev/vda3
    
  5. 暗号化ディスクを開く

    cryptsetup open /dev/vda3 cryptolvm
    

    復号化されたコンテナが、/dev/mapper/cryptolvmから利用できます。

論理ボリュームの準備

  1. 開いたコンテナの上にボリュームを作成

    pvcreate /dev/mapper/cryptolvm
    
  2. ボリュームグループsystemを作成

    vgcreate system /dev/mapper/cryptolvm
    
  3. 論理ボリュームを作成

    #PCのメモリより大きいサイズを指定してください。
    lvcreate -L 9G system -n swap
    
    lvcreate -l 100%FREE system -n root
    mkfsbtrfs /dev/mapper/system-root
    

OSのインストール

  1. Manjaro Linuxインストーラーを起動します。
  2. ストレージデバイスを選択までセットアップを続けます。
  3. 手動パーティションを選択します。
  4. 次の画像のようにマウントポイントを指定します。
    物理ディスク
    /dev/vda1 : /boot/efi
    /dev/vda2 : /boot
    論理ディスク
    /dev/mapper/system-root: /

インストール後の設定

  1. ファイルシステムをマウントします。

    mount -o subvol=@ /dev/mapper/system-root /mnt
    mount -o subvol=@home /dev/mapper/system-root /mnt/home
    mount -o subvol=@cache /dev/mapper/system-root /mnt/var/cache
    mount -o subvol=@log /dev/mapper/system-root /mnt/var/log
    mount /dev/vda2 /mnt/boot
    mount /dev/vda1 /mnt/boot/efi
    
  2. chrootに入る

    #arch linuxの場合は、`arch-chroot`を使用
    manjaro-chroot /mnt
    
  3. initramfsの設定

    keyboard,encrypt,lvm2 フックをfilesystemの前に追加します。

    #/etc/mkinitcpio.conf
    HOOKS=(... keyboard keymap block encrypt lvm2 ... filesystems ...)
    
  4. initramfsの生成

    mkinitcpio -p linux65
    
  5. ブートローダーの設定

    /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTに次の内容を追記してください。UUIDは/dev/sdXXのUUIDに置き換えてください。

    #UUIDの確認方法
    ls -al /dev/disk/by-uuid
    
    cryptdevice=UUID=device-UUID:cryptolvm root=/dev/mapper/system-root
    
  6. 設定の適応

    update-grub
    
  7. chrootを抜け、インストールディスクを抜き、再起動します。起動時にパスワードを入力してください。

休止状態の設定

  1. swap paritionの作成

    mkswap /dev/mapper/system-swap
    
  2. fstabの設定

    次の内容を/etc/fstabに追記します。

    /dev/mapper/system-swap none swap defaults 0 0
    
  3. initramfsの設定
    /etc/mkinitcpio.confを開き、HOOKSfilesystemsの前にresumeを追加します。

  4. ブートローダーの設定
    /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTroot=の前に次の内容を追記してください。

    resume=/dev/mapper/system-swap
    
  5. 設定を適応します

    mkinitcpio -p linux65
    update-grub
    
  6. 一度再起動します

  7. テスト

    ここで休止状態が機能するかテストしてください。

セキュアブートの設定

  1. 必要なパッケージをインストール

    pacman -S efitools sbctl
    
  2. 現在の設定のバックアップ

    for var in PK KEK db dbx ; do efi-readvar -v $var -o old_${var}.esl ; done
    
  3. ファームウェアをSetup Modeにする

    機種によって方法が違います。

    確認方法

    bootctl status
    

    ここで、Secure Boot: disabled (setup)となっていれば成功です。

  4. キーの作成、登録

    sbctl create-keys
    sbctl enroll-keys -m
    
  1. 再びセキュアブートの状態を確認

    sbctl status
    

    Installed: sbctl is installedと表示されていたら成功です。

  2. セキュアブートを作動させるためのファイルを確認

    sbctl verify
    
  3. セキュアブートに対応したブートローダーのインストール

    grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB --modules="tpm" --disable-shim-lock
    
  4. 必要なファイルを署名

    例:

    sbctl sign -s /boot/efi/EFI/GRUB/grubx64.efi
    sbctl sign -s /boot/efi/EFI/boot/bootx64.efi
    sbctl sign -s /boot/linux65-x86_64
    
  5. 正しく署名されているか確認

    sbctl verify
    
  6. UEFIからセキュアブートを有効化する

  7. 再起動をして動作確認

TPM2によるディスク復号化

  1. 必要パッケージのインストール

    pacman -S yay clevis
    
    #Run as user
    yay -S mkinitcpio-clevis-hook
    
  2. 鍵を登録する

    clevis luks bind -d /dev/vda3 tpm2 '{"hash":"sha256","key":"rsa"}'
    
  3. 鍵を検証する

    clevis luks list -d /dev/vda3
    
  4. initramfsの設定

    /etc/mkinitcpio.confを開き、HOOKSencryptの前にclevisを追加する

  5. initramfsの再生成

    mkinitcpio -p linux65
    
  6. 再起動をして動作確認

これにてインストール完了です。

参考文献

dm-crypt/システム全体の暗号化
【Linux】ボリュームのUUIDを確認する方法
電源管理/サスペンドとハイバネート
Unified Extensible Firmware Interface/セキュアブート
Clevis
Ubuntu 22.04でTPM2.0を使ってluksを自動復号化をする

GitHubで編集を提案

Discussion