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を使うことを検討してください。
インストール
-
VoidLinuxのインストールメディアを起動
-
シェルをBashに変更し、日本語キーボードのキーマップを読み込む
# bash # loadkeys jp106
-
fdisk -lでディスクの確認 -
ディスクをランダムデータで上書き
この項目は必須ではないですが、特に理由がない限り実行することをおすすめします。
巨大なディスクでは数時間かかることがあります。# dd if=/dev/urandom of=/dev/sda bs=60M
この操作はディスク上のすべてのデータを上書きします。復元は不可能なので、重要なデータは事前にバックアップしておいて下さい。
-
パーティションを作成
# cfdisk /dev/sda
パーティションテーブルは MBR なので dos を選択します。
2つのパーティションを作り、/boot用のパーティションにBootableフラグを付けます。
設定が終わったら[Write]を選択、本当に実行するか?と聞かれるのでyesと入力してEnter、その後[Quit]で終了します。# lsblk /dev/sda
lsblkでパーティションが作成されているか確認します。 -
/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を指定 -
システムパーティションを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
-
LUKSパーティションを開く
# cryptsetup luksOpen /dev/sda1 boot # cryptsetup luksOpen /dev/sda2 lvm
boot,lvmの部分は環境に合わせて分かりやすい名前に変更してください。
/dev/mapper/ディレクトリに指定した名前のデバイスファイルが作成されます。
(例:/dev/mapper/boot) -
# mkfs.ext4 /dev/mapper/boot
-
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が小文字であることに注意してください。大文字だとエラーが出ます。 -
システムパーティションのフォーマット
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
-
システムパーティションと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 -
ベースシステムのインストール
//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 -
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
# echo "en_US.UTF-8 UTF-8" >> /etc/default/libc-locales # xbps-reconfigure -f glibc-locales
/etc/rc.confTIMEZONE="Asia/Tokyo" KEYMAP="jp106" TTYS=2
/etc/crypttabcrypttabにルートファイルシステムを追加しないで下さい。
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.confhostonly=yes
/etc/dracut.conf.d/10-crypt.confinstall_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
-
GRUBの設定
設定ファイルに以下を追加します。/etc/default/grubGRUB_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" -
GRUBのインストール
# grub-install --target=i386-pc /dev/sda
設定ファイルの生成
# grub-mkconfig -o /boot/grub/grub.cfg
-
カーネルフックのセットアップ
# 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であることが分かります。
-
再起動
# exit # swapoff /dev/lvm/swap # umount -R /mnt # lvchange -a n lvm # cryptsetup luksClose lvm # cryptsetup luksClose boot # reboot
LUKSパーティションのマウントを楽にする
上記の設定のままでは、起動時に複数回luksのパスフレーズを入力する必要があります。
キーファイルを追加するか、SSH経由でパスフレーズを入力することで、楽にluksパーティションをマウントすることが出来ます。
GRUBにパッチを当てることで起動時のパスフレーズの入力を完全にスキップすることも出来ますが、セキュリティ的に問題があると思うのでおすすめしません。
キーファイルの追加