kazeno memo

メモとか

Void LinuxをLUKSで暗号化してインストール

Void Linuxを暗号化したパーティションに手動でインストールしてみます。

Linuxのフルディスク暗号化は、/bootパーティションを暗号化しないのが主流なようですが、それは微妙と言うか、/bootも暗号化していないとフルじゃないだろって事で/bootもLUKSで暗号化します。

UEFIではないことに注意してください。

パーティション構成

sda (MBR)
├─sda1 (LUKS ver1)
│ └─boot			1GB		/boot	ext4
└─sda2 (LUKS ver2)
  └─LVM
    ├─lvm-swap	        	2GB	        [SWAP]
    ├─lvm-root	        	10GB    	/	ext4
    ├─lvm-home	        	20GB    	/home	ext4
    └─lvm-tmp	        	5GB		/tmp	ext4

/bootとそれ以外に分けた理由は、LUKS2を使いたかったのですが、GRUB2はLUKS1にしか対応していないからです。

https://cryptsetup-team.pages.debian.net/cryptsetup/encrypted-boot.html

https://savannah.gnu.org/bugs/?55093

注意/ポイント

  • GRUB2はLUKS2に対応していません。その為、起動パーティションはLUKS1で暗号化する必要があります。

  • LVMは必須では無いですが、LUKS上でパーティションを分割出来る、削除や拡張・縮小などの操作が楽になる等の利点があります。

  • VoidLinuxのmusl版を使いますが、手順はmuslとglibcでほぼ変わりません。

  • /dev/random/dev/urandomのどちらを使うべきか?

    キーファイルを作成する場合 random を使うべきですが、ディスクのフォーマットなどは基本的に urandom で良いと思います。 システムのエントロピーが極端に少ない場合、 random,urandom のどちらを使う場合も危険なようです。HAVEGED などのエントロピーソースを増やすソフトウェアや NEUG などのハードウェアRNGを使うことを検討してください。

インストール

  1. VoidLinuxのインストールメディアを起動

  2. ip aコマンドでIPアドレスを確認して、必要に応じてSSHで外部から操作

  3. シェルをBashに変更し、日本語キーボードのキーマップを読み込む

    # bash
    # loadkeys jp106
  4. fdisk -lでディスクの確認

  5. ディスクをランダムデータで上書き
    この項目は必須ではないですが、特に理由がない限り実行することをおすすめします。
    巨大なディスクでは数時間かかることがあります。

    # dd if=/dev/urandom of=/dev/sda bs=60M
    

    この操作はディスク上のすべてのデータを上書きします。復元は不可能なので、重要なデータは事前にバックアップしておいて下さい。

  6. パーティションを作成

    # cfdisk /dev/sda
    

    パーティションテーブルは MBR なので dos を選択します。
    2つのパーティションを作り、/boot用のパーティションにBootableフラグを付けます。
    設定が終わったら[Write]を選択、本当に実行するか?と聞かれるのでyesと入力してEnter、その後[Quit]で終了します。

    # lsblk /dev/sda
    

    lsblkパーティションが作成されているか確認します。

  7. /boot パーティションをLUKSでフォーマット

    # cryptsetup -v --type luks1 \
    	--cipher aes-xts-plain64 \
    	--key-size 512 \
    	--pbkdf pbkdf2 \
    	--iter-time 5000 \
    	--verify-passphrase \
    	--use-urandom \
    	--timeout 20 \
    	luksFormat /dev/sda1
    

    luks1では pbkdf に argon2i/id は選択できません。
    --iter-timeパスフレーズ入力後の待ち時間をミリ秒で指定(5000なら5秒)
    --timeoutタイムアウトするまでの時間を秒で指定
    /dev/randomを使いたい場合--use-randomを指定

  8. システムパーティションをLUKSでフォーマット

    # cryptsetup -v --type luks2 \
    	--cipher aes-xts-plain64 \
    	--key-size 512 \
    	--pbkdf argon2id \
    	--iter-time 5000 \
    	--verify-passphrase \
    	--use-urandom \
    	--timeout 20 \
    	luksFormat /dev/sda2
    
  9. LUKSパーティションを開く

    # cryptsetup luksOpen /dev/sda1 boot
    # cryptsetup luksOpen /dev/sda2 lvm
    

    boot,lvmの部分は環境に合わせて分かりやすい名前に変更してください。
    /dev/mapper/ディレクトリに指定した名前のデバイスファイルが作成されます。
    (例:/dev/mapper/boot)

  10. /boot パーティションext4でフォーマット

    # mkfs.ext4 /dev/mapper/boot
    
  11. LVMのセットアップ

    # pvcreate /dev/mapper/lvm
    # vgcreate /dev/lvm /dev/mapper/lvm
    # lvcreate /dev/lvm -L 2GB -n swap
    # lvcreate /dev/lvm -L 10GB -n root
    # lvcreate /dev/lvm -L 20GB -n home
    # lvcreate /dev/lvm -L 5GB -n tmp
    

    空き容量をすべて使うには、-l 100%FREEというオプションを指定します。
    -lが小文字であることに注意してください。大文字だとエラーが出ます。

  12. システムパーティションのフォーマット

    mkswap -L swap /dev/lvm/swap
    mkfs.ext4 -L root /dev/lvm/root
    mkfs.ext4 -L home /dev/lvm/home
    mkfs.ext4 -L tmp /dev/lvm/tmp
    
  13. システムパーティションとdev,sys,procのマウント

    # mount /dev/lvm/root /mnt
    # mkdir /mnt/{dev,sys,proc,boot,home,tmp}
    # mount /dev/mapper/boot /mnt/boot
    # mount /dev/lvm/home /mnt/home
    # mount /dev/lvm/tmp /mnt/tmp
    # mount --rbind /dev /mnt/dev
    # mount --rbind /sys /mnt/sys
    # mount -t proc /proc /mnt/proc
    
  14. ベースシステムのインストール

    //musl版
    # XBPS_ARCH=$(uname -m)-musl xbps-install -Sy -R https://youngjin.io/voidlinux/current/musl -r /mnt base-system cryptsetup lvm2 grub vim
    
    //glibc版
    # xbps-install -Sy -R https://youngjin.io/voidlinux/current -r /mnt base-system cryptsetup lvm2 grub vim
    

    日本からは韓国のミラー(youngjin.io)が一番速いです。
    その他のミラーは公式サイトを参照してください。
    https://voidlinux.org/download/#mirrors

  15. chrootでセットアップ

    # chroot /mnt /bin/bash
    
    // rootのパスワード
    # passwd root
    
    // パーミッション
    # chown root:root /
    # chmod 755 /
    
    // デフォルトシェル
    # chsh -s /bin/bash
    
    // ホストネーム
    # echo "hostname" > /etc/hostname
    
    // タイムゾーン
    # ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
    
    // ローケル
    # echo "LANG=en_US.UTF-8" > /etc/locale.conf
    

    glibc版の場合glibcのローケル設定が必要です。

    # echo "en_US.UTF-8 UTF-8" >> /etc/default/libc-locales
    # xbps-reconfigure -f glibc-locales
    

    /etc/rc.conf
    TIMEZONE="Asia/Tokyo"
    KEYMAP="jp106"
    TTYS=2
    

    /etc/crypttab

    crypttabにルートファイルシステムを追加しないで下さい。

    boot	UUID=</dev/sda1のuuid>	none	luks,timeout=10
    

    /dev/sda1 の UUID を確認

    # blkid -o value -s UUID /dev/sda1
    

    /etc/dracut.conf.d/00-hostonly.conf
    hostonly=yes
    

    /etc/dracut.conf.d/10-crypt.conf
    install_items+="/etc/crypttab"
    

    /etc/fstab
    # <filesystem>	<dir>	<type>	<options>				<dump>	<pass>
    /dev/mpper/boot	/boot	ext4	rw,nodev,nosuid,noexec			0	0
    /dev/lvm/root	/	ext4	rw,errors=remount-ro	                0	0
    /dev/lvm/home	/home	ext4	rw,nodev,nosuid				0	0
    /dev/lvm/tmp	/tmp	ext4	rw,nodev,nosuid,noexec			0	0
    /dev/lvm/swap	none	swap	sw					0	0
    
  16. GRUBの設定
    設定ファイルに以下を追加します。

    /etc/default/grub
    GRUB_CMDLINE_LINUX="cryptdevice=UUID=</dev/sda1のuuid>:boot"
    GRUB_ENABLE_CRYPTODISK=y
    

    また、GRUB_CMDLINE_LINUX_DEFAULTに以下のカーネルパラメータを追加します。
    rd.auto=1
    このようになっているはずです。
    GRUB_CMDLINE_LINUX_DEFAULT="loglevel=4 slub_debug=P page_poison=1 rd.auto=1"

  17. GRUBのインストール

    # grub-install --target=i386-pc /dev/sda
    

    設定ファイルの生成

    # grub-mkconfig -o /boot/grub/grub.cfg
    
  18. カーネルフックのセットアップ

    # xbps-reconfigure -f linux4.18
    

    カーネルのバージョンはこのコマンドで確認出来ます。

    # cat /var/db/xbps/*.plist | grep key | grep linux
    

    実行するとこのように出力されます。

    <key>linux</key>
    <key>linux-firmware-amd</key>
    <key>linux-firmware-intel</key>
    <key>linux-firmware-network</key>
    <key>linux-firmware-nvidia</key>
    <key>linux4.18</key>
    <key>util-linux</key>
    

    カーネルのバージョンが4.18であることが分かります。

  19. 再起動

    # exit
    # swapoff /dev/lvm/swap
    # umount -R /mnt
    # lvchange -a n lvm
    # cryptsetup luksClose lvm
    # cryptsetup luksClose boot
    # reboot
    

LUKSパーティションのマウントを楽にする

上記の設定のままでは、起動時に複数回luksのパスフレーズを入力する必要があります。
キーファイルを追加するか、SSH経由でパスフレーズを入力することで、楽にluksパーティションをマウントすることが出来ます。

GRUBにパッチを当てることで起動時のパスフレーズの入力を完全にスキップすることも出来ますが、セキュリティ的に問題があると思うのでおすすめしません。

キーファイルの追加

SSH経由でパスフレーズを入力