それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

dm-crypt のリモートアンロック(SSHでLUKSアンロック)

dm-crypt したシステムルートをリモートSSHから解除

luks の鍵をtpmに入れたいけど、TPMバイスがないPCの場合、鍵をUSBで差し込むか、SSHでリモートからアンロックをするといい

仕組み

luks のルートパーティションがinitramfs に読み出されるときに、dorpbearでsshサーバーで、パスフレーズ入力を待ち受ける。

準備

参考サイト1,参考サイト2,参考サイト3に従って処理。

## debian 11
apt install -y dropbear busybox
## debian 10
apt install dropbear-initramfstools

起動時のIP割当

起動時に initramfs が起動する。initramfs がIPアドレス持つように grub を変更する

dhcp で割り当てる場合

GRUB_CMDLINE_LINUX="ip=:::::eth0:dhcp"

固定IPの場合(おすすめ)

GRUB_CMDLINE_LINUX="ip=10.1.1.5::10.1.1.1:255.255.255.0:my-name:eth0:none"

並びは、次のようになってる(DNSのところは自信がない。)

GRUB_CMDLINE_LINUX="ip=ADDR:BRD:GW:NETMASK:hostname:eth0:none"

eth0 を使わせる設定 を利用して固定することにした。

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"

出来上がった設定はだいぶ長い・・・

GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 ip=10.1.1.5::10.1.1.1:255.255.255.0:my-server:eth0:none"

eth0 を使わない場合は、enoXXや enpXX を使う

GRUB_CMDLINE_LINUX="ip=10.1.1.5::10.1.1.1:255.255.255.0:10.1.1.53:enp0ns11:none"

公開鍵の追加

initramfsのdropbearへSSHするには公開鍵ログインが必須です。

パスフレーズだと、/bootなどを総当りされる恐れがあります。

公開鍵を登録する

公開鍵の設置先。

/etc/dropbear-initramfs/authorized_keys

既存の公開鍵を設置すればおっけ。

sudo cp /root/.ssh/authorized_keys /etc/dropbear-initramfs/authorized_keys

drobear設定は、/etc/dropbear にもあるが、ここは使わない。 /etc/dropbear-initramfs/に、authorized_keys を置くのが正しい。

update-initramfs -u
update-grub

update-initramfs で firmware 関連のエラーが出るとき

ただし、non-free なfirmware を入れると起動時にめっちゃエラー出る。

W: Possible missing firmware /lib/firmware/i915/skl_huc_2.0.0.bin for module i915
W: Possible missing firmware /lib/firmware/i915/skl_guc_33.0.0.bin for module i915

main contrib nonfree に変えるファームウェアのエラーは消せる。

sudo sed -i  's/ main$/ main contrib non-free/' /etc/apt/sources.list
sudo apt update
sudo apt list firmware*
sudo apt install firmware-linux

シリアルも有効にしておく。

grub に設定を書いて、シリアルのコンソールでも待ち受けておく。(予備手段)

GRUB_CMDLINE_LINUX='console=tty1 console=ttyS0,115200'
GRUB_TERMINAL='console serial'
GRUB_SERIAL_COMMAND="serial --speed=115200 --unit=0 --word=8 --parity=no --stop=1"

リモートで作業することも考えて、シリアルを有効にしておく。

リモート時に障害時対応ができると思う。

シリアルの接続先に、Raspiなどをつないでおく。そうすれば、RaspiにSSHしてログインし、serial console でメンテできます。 raspi zero とかのRS232CのGPIOとか使えばコストも安く上がる。

ホスト鍵を揃えてやる/fingerprint不一致対策

grub で指定するIPアドレスを同じにすると、initramfs(dropbear)と 起動後のdebian(opensshd) でホスト鍵が異なって警告が鬱陶しい。そこでホスト鍵を揃えておく

ホスト鍵の揃え方に従って処理をする。

変換対象の鍵

root@borane:/home/takuya# ls -l  /etc/ssh/ssh_host_* | grep -v pub
-rw------- 1 root root  505 1114 16:51 /etc/ssh/ssh_host_ecdsa_key
-rw------- 1 root root  399 1114 16:51 /etc/ssh/ssh_host_ed25519_key
-rw------- 1 root root 2590 1114 16:51 /etc/ssh/ssh_host_rsa_key

ssh_host_ecdsa_key を変換する。

## 作業ファイルにコピー
cp /etc/ssh/ssh_host_ecdsa_key /tmp
## PEM 形式に変換
ssh-keygen -p -m PEM -f /tmp/ssh_host_ecdsa_key
## dropbear用に変換
sudo dropbearconvert openssh dropbear \
 /tmp/ssh_host_ecdsa_key \
 /etc/dropbear-initramfs/dropbear_ecdsa_host_key

これを繰り返す

for name in ecdsa ed25519 rsa;  do 
    cp /etc/ssh/ssh_host_$name_key /tmp;
    ssh-keygen -p -m PEM -f /tmp/ssh_host_$name_key
    dropbearconvert openssh dropbear/tmp/ssh_host_$name_key /etc/dropbear-initramfs/dropbear_$name_key
done;

initramfs の再生成 / grub 再生性

sudo update-initramfs -c -t -k all
## または
# sudo update-initramfs -u
sudo update-grub

これでおっけ。

起動CHECK

起動したらSSHでログインする。

ssh -vvv -i ~/.ssh/id_rsa root@192.168.2.5

参考資料