Ubuntu 24.04 をフルディスク暗号化インストールしよう 【UEFI+LUKS】

はじめに

ローカルLLMを実行するためのPCを製作したため、Ubuntu 24.04 を従来通りにLUKSを使用してインストールしたところ、LUKSパーティションがインストーラに認識されず躓いたためこの記事を投稿します。StackExchangeの質問についた回答によると、新しいFlutterベースのインストーラの制限とのことです。Liveイメージに含まれるインストーラを使用せず、ファイルをそのままコピーする方法で進めます。そのため、この手順でインストールをした後は余分な設定やファイルを削除する必要があります。

フルディスク暗号化とは

ストレージの暗号化には大きく分けて「フルディスク暗号化」と「ファイルベース暗号化」があります。前者はディスクまたはパーティション全体を暗号化でき、後者はファイルごとに異なる暗号化キーを用いることができる点が特徴です。この記事では / (rootfs) パーティションと /boot パーティションを暗号化します。EFIシステムパーティションは暗号化しません。

フルディスク暗号化でできること

ディスク単体があっても復号できません。復号にはパスワードやTPMに保管されているキーが必要です。

フルディスク暗号化でできないこと

  • コンピュータが起動した後のデータの保護
    データは暗号化解除されるため、コンピュータが起動した後の不正アクセスに対しては耐性がありません。
  • コールドブート攻撃への耐性はない
    メモリに残る暗号化キーを攻撃対象とする「コールドブート攻撃」への耐性はありません。

前提条件

  • インストールするOS: Ubuntu 24.04.2 LTS
  • ファームウェア: UEFI
  • アーキテクチャ: x86_64
  • TPMは使用せず、パスワードによるディスク保護を行う

インストール用USBメモリを作成する

まず、Ubuntu 24.04のISOイメージ をダウンロードしてください。ダウンロードが終わったらUSBメモリにISOイメージを書き込みます:

sudo dd if=/path/to/ubuntu-24.04-desktop.iso of=/dev/sdX bs=1G # (sdXはUSBメモリデバイス)

インストール用USBメモリを使用してコンピュータを起動する

Ubuntu 24.04をインストールするコンピュータに先ほど作成したUSBメモリを接続し、起動してください。するとGRUBの画面が表示されるはずです。Try or Install Ubuntu を選択し、Enterキーを押してください。

インストーラのGRUB画面

しばらくするとGUIインストーラーが起動しますが、Alt+F4キーを押して閉じてください。

GUIインストーラを Alt+F4 で閉じる

スーパーキー (Windowsキー) を押して「terminal」と入力し、Terminalを起動します。

Terminalを起動する

パーティショニングする

Terminalが起動したらパーティショニングを行います。

ubuntu@ubuntu:~ sudo gdisk /dev/vdX # /dev/vdX は実際のインストール先ディスクに読み替える
GPT fdisk (gdisk) version 1.0.10

Partition table scan:
  MBR: not present
  BSD: not present
  APM: not present
  GPT: not present

Creating new GPT entries in memory

Command (? for help):

まず、パーティションが無くなるまで d コマンドを繰り返し使用して全てのパーティションを削除してください (データが全く存在しない空のディスクでは不要です) 。その後EFIシステムパーティションを作成します:

   Command (? for help): n 
   Partition number (1-128, default 1): 
   First sector (34-67108830, default = 2048) or {+-}size{KMGTP}: 
   Last sector (2048-67108830, default = 67106815) or {+-}size{KMGTP}: +512M
   Current type is 8300 (Linux filesystem)
   Hex code or GUID (L to show codes, Enter = 8300): ef00
   Changed type of partition to 'EFI system partition'

次に /boot パーティションを作成します。

   Command (? for help): n
   Partition number (2-128, default 2): 
   First sector (34-67108830, default = 1050624) or {+-}size{KMGTP}:
   Last sector (1050624-67108830, default = 67106815) or {+-}size{KMGTP}: +2G 
   Current type is 8300 (Linux filesystem)
   Hex code or GUID (L to show codes, Enter = 8300): 8309
   Changed type of partition to 'Linux LUKS'

最後に / (root) パーティションを作成します。

   Command (? for help): n
   Partition number (3-128, default 3): 
   First sector (34-67108830, default = 5244928) or {+-}size{KMGTP}: 
   Last sector (5244928-67108830, default = 67106815) or {+-}size{KMGTP}:
   Current type is 8300 (Linux filesystem)
   Hex code or GUID (L to show codes, Enter = 8300): 8309
   Changed type of partition to 'Linux LUKS'

p コマンドを使用して、作成したパーティションテーブルを確認します。

   Command (? for help): p
   Disk /dev/vdX: 67108864 sectors, 32.0 GiB
   Sector size (logical/physical): 512/512 bytes
   Disk identifier (GUID): 7895CA31-EF57-408A-AC86-FAAB79027CE1
   Partition table holds up to 128 entries
   Main partition table begins at sector 2 and ends at sector 33
   First usable sector is 34, last usable sector is 67108830
   Partitions will be aligned on 2048-sector boundaries
   Total free space is 4029 sectors (2.0 MiB)

   Number  Start (sector)    End (sector)  Size       Code  Name
      1            2048         1050623   512.0 MiB   EF00  EFI system partition
      2         1050624         5244927   2.0 GiB     8301  Linux LUKS
      3         5244928        67106815   29.5 GiB    8304  Linux LUKS

w コマンドを使用してパーティションテーブルを書き込みます。

   Command (? for help): w

   Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
   PARTITIONS!!

   Do you want to proceed? (Y/N): y
   OK; writing new GUID partition table (GPT) to /dev/vdX.
   The operation has completed successfully.

ファイルシステムを作成する

パーティショニングが完了したらファイルシステムを作成します。

まず、EFIシステムパーティションをFAT32でフォーマットします。

sudo mkfs.vfat /dev/vdX1

次に /boot パーティションに LUKS1ファイルシステム を作成します。
UbuntuのGRUB2がluks2モジュールなしでビルド・署名されているため、LUKS1を使う必要があります。

sudo cryptsetup luksFormat --type=luks1 /dev/vdX2

WARNING!
========
This will overwrite data on /dev/vdX2 irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/vdX2: # パスワードを入力します
Verify passphrase: # パスワードを入力します

最後に / (root) パーティションに LUKS2 ファイルシステムを作成します。

ubuntu@ubuntu:~$ sudo cryptsetup luksFormat --type=luks2 /dev/vdX3

WARNING!
========
This will overwrite data on /dev/vdX3 irrevocably.

Are you sure? (Type 'yes' in capital letters): YES
Enter passphrase for /dev/vdX3: # パスワードを入力します
Verify passphrase: # パスワードを入力します

LUKSパーティションを開く

前セクションで作成したLUKSパーティションを開きます。

ubuntu@ubuntu:~$ sudo cryptsetup open /dev/vdX2 LUKS_BOOT
Enter passphrase for /dev/vdX2:

ubuntu@ubuntu:~$ sudo cryptsetup open /dev/vdX3 LUKS_ROOTFS
Enter passphrase for /dev/vdX3:

ubuntu@ubuntu:~$ ls /dev/mapper/
LUKS_BOOT  LUKS_ROOTFS  control

LUKSパーティションにファイルシステムを作成する

LUKSパーティションには直接ファイルを置くことができません。別途 ext4 などのファイルシステムが必要ですので作成します。

sudo mkfs.ext4 -L boot /dev/mapper/LUKS_BOOT
sudo mkfs.ext4 -L rootfs /dev/mapper/LUKS_ROOTFS

ファイルシステムをマウントする

作成したファイルシステムをマウントしましょう。

mkdir rootfs
sudo mount /dev/mapper/LUKS_ROOTFS rootfs/
sudo mkdir rootfs/boot
sudo mount /dev/mapper/LUKS_BOOT rootfs/boot/
sudo mkdir rootfs/boot/efi
sudo mount /dev/vdX1 rootfs/boot/efi

ファイルを配置する

必要なファイルをコピー・作成します。rsyncコマンドの引数の末尾の / は除去しないでください。

sudo rsync -aX /boot/ rootfs/boot/
sudo rsync -aX /etc/ rootfs/etc/
sudo rsync -aX /usr/ rootfs/usr/
sudo rsync -aX /var/ rootfs/var/
sudo ln -s usr/bin rootfs/bin
sudo ln -s usr/lib rootfs/lib
sudo ln -s usr/lib64 rootfs/lib64
sudo ln -s usr/sbin rootfs/sbin
sudo mkdir rootfs/{dev,proc,root,run,sys,tmp}
sudo mkdir -p rootfs/home/ubuntu
sudo chown ubuntu:ubuntu rootfs/home/ubuntu
sudo chmod 750 rootfs/home/ubuntu
rsync -aX /etc/skel/ rootfs/home/ubuntu/

chrootする

ここまできたら、新環境にchrootすることができるようになります。chrootして必要なファイルシステムをマウントします。

$ sudo chroot rootfs
# mount -t devtmpfs devtmpfs /dev
# mount -t proc proc /proc
# mount -t sysfs sysfs /sys
# mount -t tmpfs tmpfs /tmp

initramfsを設定する

コンピュータの起動時に1回のLUKSパスワード入力で済むようにするため、initramfsを設定します。chroot内で次のコマンドを実行します:

echo "KEYFILE_PATTERN=/etc/luks/*.keyfile" >> /etc/cryptsetup-initramfs/conf-hook
echo "UMASK=0077" >> /etc/initramfs-tools/initramfs.conf

LUKSパーティションにキーを追加する

chroot内で次のコマンドを実行します:

mkdir /etc/luks
dd if=/dev/urandom of=/etc/luks/boot_os.keyfile bs=512 count=1
chmod u=rx,go-rwx /etc/luks
chmod u=r,go-rwx /etc/luks/boot_os.keyfile
cryptsetup luksAddKey /dev/vdX2 /etc/luks/boot_os.keyfile
cryptsetup luksAddKey /dev/vdX3 /etc/luks/boot_os.keyfile

/etc/crypttabを編集する

crypttabはシステムが起動するときにセットアップされる暗号化された暗号化されたディスクを設定するファイルです。chroot内で次のコマンドを実行します:

echo "LUKS_BOOT UUID=$(blkid -s UUID -o value /dev/vdX2) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab
echo "LUKS_ROOTFS UUID=$(blkid -s UUID -o value /dev/vdX3) /etc/luks/boot_os.keyfile luks,discard" >> /etc/crypttab

注意点として、 discard オプションには僅かながらセキュリティリスクが存在するようです。詳細については Arch Linux の Wikiページ を参照してください。

/etc/fstabを編集する

chroot内で次のコマンドを実行します:

rm /etc/fstab
echo "/dev/mapper/LUKS_ROOTFS / ext4 errors=remount-ro 0 1" >> /etc/fstab
echo "/dev/mapper/LUKS_BOOT /boot ext4 defaults 0 2" >> /etc/fstab
echo "UUID=$(blkid -s UUID -o value /dev/vdX1) /boot/efi vfat defaults 0 2" >> /etc/fstab

不要なものを削除する

chroot内で次のコマンドを実行します:

deluser installer
apt remove casper # 削除しないと起動時にインストールディスクを探索されてしまう
systemctl disable snap.ubuntu-desktop-bootstrap.subiquity-server.service # インストーラが起動しないようにする
rm /usr/lib/systemd/system/serial-getty\@.service.d/subiquity-serial.conf # gettyを正常に機能させるために必要

initramfsファイルを作成する

chroot内で次のコマンドを実行します:

rm /etc/initramfs-tools/conf.d/*
(cd /usr/sbin; mv update-initramfs.distrib update-initramfs)
update-initramfs -c -k all

ブートローダー (GRUB2) をインストールする

chroot内で次のコマンドを実行します:

echo "GRUB_ENABLE_CRYPTODISK=y" >> /etc/default/grub.d/local.cfg
grub-install --efi-directory=/boot/efi
update-grub

再起動する

ここまで来たらインストール自体は完了です。再起動しましょう。このとき、USBメモリの抜去が求められますので指示に従い抜去してください。

exit # chrootを抜ける
sudo reboot # 指示に従いUSBメモリを抜去する

再起動後の操作

ディスクが暗号化されていますので、パスワードの入力が必要です:

LUKSパスワードを入力してEnterキーを押す。パスワードを入力しても何も表示されないのは仕様です。

しばらくすると Ubuntu 24.04 が起動します。

Terminalを起動して次の操作を行います:

  • インストーラ (ubuntu-destktop-bootstrap) を削除する
  • GLibスキーマオーバーライドファイルを削除し、dconfをリセットする
    • 画面のロックをするために必要です
sudo snap remove ubuntu-desktop-bootstrap
sudo rm /usr/share/glib-2.0/schemas/{casper.gschema.override,livecd-rootfs.gschema.override}
sudo glib-compile-schemas /usr/share/glib-2.0/schemas
dconf reset -f /

おわりに

以上で Ubuntu 24.04 のインストールは完了です。お疲れ様でした!冒頭で「ローカルLLMを実行するためのPCを製作した」と述べましたが、実際にローカルLLMを動かしたら別途記事を執筆予定です。弊社の別メンバーがOllamaを使用してローカルLLMを動かした記事もご参照ください。

参考文献

新規CTA