それマグで!

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

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

暗号化ディスクのcrypt-unlock をSSH経由でして、ロック解除する

ディスクの暗号化をする

CPUにAES-NI の命令セットが載っているのに、ディスクを暗号化しないなんて、勿体無いとちょっと思ってるんです。

iPad / iPhoneiOS はもちろんのこと、Androidですらディスクは暗号化されているというのに、PCを使う我々は暗号化ディスクを使わずに平文で使うのはもったいない。

cpu がAESをサポートしているか調べる

takuya@:~$ cat /proc/cpuinfo | /bin/grep flags | head -n 1 | xargs -n1 echo | sort |  /bin/grep -i aes

AESがあるんですよね。IntelのCPUは安くてもAES付いてるので優秀だと思います。

暗号化ディスクの作成

Ubuntuのインストールなどで、ディスクの暗号かを選ぶと すべてのディスクは dm-crypt で暗号化される。

起動時にパスフレーズを入れる

dm-crypt で起動ディスクのパーティションを暗号化したら、

当然ですが、/ root の全てが暗号化されるので、パスフレーズを入れて解除しないと、起動ができません。

起動時にパスフレーズリモートssh 経由で入れる

通常のノートpcであれば問題ないのですが、遠隔からリモート再起動をしようとすると詰みますよね。

そこでSSH経由でパスフレーズを授受するする方法が一般的です。

linuxの起動は、いくつかのbootstrapに分かれているので

  • /boot
  • grub
  • initramfs
  • init

途中の initramfs のところで暗号化ディスクのロックを解除している。

通常はここでパスフレーズの入力になっている。

今回は、この場所にSSHを導入してリモートからロック解除を出来るようにする。

使うサーバーは簡易SSHサーバーのdropbearを使う。

インストール

apt-get install openssh-server dropbear busybox

dropbear をインストールしたら。dropbear-initramfs も一緒に導入された。

鍵の準備

鍵の場所は debian /ubuntu の場合は、最初から決まっていて

ここに公開鍵を入れる

/etc/dropbear-initramfs/authorized_keys

ここで入れた公開鍵が dropbearのSSHサーバー で使われるものになる。

私は無精をして、次のようにコピーして利用した。

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

initramfs の更新

authorized_keys が準備できたら、 iniramfs を作り変えて dropbear を入れた initramfs を作る

sudo update-initramfs -u

IPアドレスの指定

最後に、grub環境変数を設定して、initramfs に渡るようにします。

/etc/default/grub

GRUB_CMDLINE_LINUX="ip=192.168.2.99::192.168.2.1:255.255.255.0::eth0:none" 

このフォーマットは、決まっていて、次のように書いている。

ip=[dropbear_ip]::[gateway]:[netmask]::[nic]:none" 

grubの更新

最後にGrubの起動設定を書き換えて、dropbear に ip='' が渡るようにする。

update-grub

再起動してチェック

 ssh -o "HostKeyAlgorithms ssh-rsa" root@192.168.2.99

このときに、ユーザー名は root になる、IPは先程指定したIPアドレス秘密鍵は、authorized_keys で指定した公開鍵とペアになるものを使う。

ssh ログインできたら、ロック解除する

# crypt-unlock

ここでパスを入れれば、GUIからロック解除するのと同じ意味になる。

ちなみに、 Ctrl+Alt+F2 で切り替えたCLI(Xを使わない)モードでもcrypt-unlockが出来る。なので、手順が心配ならSSH経由にする前にcrypt-unlockを事前試してもいいと思う。

かんたんにロック解除は出来ますが、authorized_keys の入った initramfs は当然ですが暗号化されていません。ここもセキュリティを確保したいとなるとPXEブートなどで遠隔からgrub とinitram を導入するなどの手順を使うことになるんでしょうね。

参考資料

追記 2019-10-10

initramfs でdropbear を有効にしたら、NetworkManagerで、ネットワークデバイスが unmanaged になります。systemd が起動するより前に ネットワークデバイスが管理下に置かれるからみたいだけど。バグ?だよねこれ。

NetworkManagerが eth0(enp3s0)が 管理無しでどうやっても unmanaged になって、nmcli がmanaged にならないので、非常に苦しんだが。このdropbearが原因だった。

lvmでディスクを追加拡張するときに詰まった

pvcreate でディスクを追加しようとしたらエラーになった。

pvcreate /dev/sdb 

    ignoring or filtering 

なぜかエラーにメッセージが ignoring or filtering でディスクが追加できない

今回取った対策。

fdisk で適当なGPT/MBRパーティションにして、その後 pvcreate 無理やり上書きする。

LVMで作った20TB のディスクをext4 で扱えない。

ext4 が16TiB以上のディスクにならない。

ext4 は エクサバイトを扱えるはずなのですが、resize2fs をしようとしたら、エラーになりました。

なぜかというと 32bit で利用されているディスクフォーマットだったらしい。

そういえば、もうずいぶん長いこと拡張を繰り返して使っているLVMのext4 でした。

32bitのままだと、 16TiB以上の容量を扱えないんですね。困りました。ですが、大丈夫。変更できます。

ext4 を 64bit にする。

sudo umount /dev/mapper/data-my -a 
sudo e2fsck -fn /dev/mapper/data-my
## OKならyにする
## sudo e2fsck -fy /dev/mapper/data-my 
## 64bit にすると、16TiBをこえられる
resize2fs -b /dev/mapper/data-my # 12TBで10分ほど

resize2fs -b のコマンドで 32bit → 64bit にすることが出来る。事前に fsck が必要だった。