Debian: ssh clientを使って暗号化されたリモートサーバのロック解除方法

私のVPSには暗号化したDebianをインストールしていますが、ブート時にどうやって暗号を解除するかという問題がありました。暗号方式はLinuxの標準のDisk暗号化方式のdm-cryptで、デスクトップであれば起動時にパスコードを入力してOSを起動できます。VPSのようなリモートサーバーになるとコントロールパネルのターミナルを使ってパスコードを入力する手順になります。

これではOSをリブートごとにブラウザからVPSサイトにアクセスして、ターミナルを開き入力する作業は煩雑すぎます。他のディストリビューションはわかりませんがDebianの場合、dropbearをinitramfsにいれてsshを使ってブート時に暗号化ディスクを解除ができます。詳しくはcryptsetupのドキュメントを参照してください。

zless /usr/share/doc/cryptsetup/README.remote.gz

設定方法

1. サーバーに必要なパッケージをインストールします。

sudo apt install dropbear busybox

2. ssh鍵を作成します。dropbearをインストールする際に/etc/initramfs-tools/etc/dropbear/にホストキーが作られます。(自動作成されます)

3. root用の鍵を作成します。

sudo dropbearkey -t rsa -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear

4. dropbearの鍵とopensshの鍵のフォーマットが違うので変換します。

sudo /usr/lib/dropbear/dropbearconvert dropbear openssh \
       /etc/initramfs-tools/root/.ssh/id_rsa.dropbear \
       /etc/initramfs-tools/root/.ssh/id_rsa

5. 公開鍵を取り出します。

sudo dropbearkey -y -f /etc/initramfs-tools/root/.ssh/id_rsa.dropbear | \
    grep "^ssh-rsa " > /etc/initramfs-tools/root/.ssh/id_rsa.pub

6. 公開鍵をauthorized_keysファイルに登録します。

sudo cat /etc/initramfs-tools/root/.ssh/id_rsa.pub >> /etc/dropbear-initramfs/authorized_keys

7. root鍵をクライアントPCにコピーします。

サーバ側からユーザ(user1)にコピー

sudo  scp /etc/initramfs-tools/root/.ssh/id_rsa* user1@{IP}:~/Downlloads

8. ユーザ(user1)で操作

cd ~/Downloads
mv id_rsa id_rsa.user1.boot
chmod 600 id_rsa.user1.boot
mv  id_rsa.user1.boot ~/.ssh

9. サーバーの/etc/initramfs-tools/initramfs.confを編集します。フォーマットは次のようになっています。

IP=(IP ADDR)::(GW):(NETMASK)::(IF):off

例)

BUSYBOX=y
IP=192.168.10.1::192.168.10.254:255.255.255.0::eth0:off

10. サーバーのdropbearはデフォルトで有効になっていないのでそれを有効にします。/etc/default/dropbearを編集します。

NO_START=0

12. サーバー側のOSでinitramfsをアップデートします。

sudo update-initramfs -u -y

13. サーバーをリブートしてクライアント側から操作します。secretは暗号化ディスクのパスコードです。

ssh -o "UserKnownHostsFile=~/.ssh/known_hosts.user1" \
      -i "~/.ssh/id_rsa.user1.boot" root@<REMOTE IP>; \
         "echo -ne \"SECRET\" > /lib/cryptsetup/passfifo"

以上で設定が完了です。