Home Directory Encryption on OpenBSD

初心者OpenBSDユーザになってから しばらく経過。そろそろ本格的な仕事にも使う段階になって来た。

ふつーホームディレクトリは暗号化

するよね? しるしる。

てことで、NetBSD cgd(4)ののりでやろうとしたが、ああー、OpenBSD は Nでいうところの /etc/rc.d/cgd つまり、起動パーティション以外の 暗号化ディスクの活性化スクリプトがないんだね。てことで、 以下手順。 おおむね、ここにあるとおり:
http://www.itrestauracion.com.ar/?p=2378

たとえばパーティション構成こんな感じ。

Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/sd0a     1005M    178M    777M    19%    /
/dev/sd0d      3.9G    136M    3.6G     4%    /tmp
/dev/sd0e     34.3G    1.6G   31.0G     5%    /var
/dev/sd0f      2.9G    955M    1.9G    33%    /usr
/dev/sd0g     1005M    254M    701M    27%    /usr/X11R6
/dev/sd0h     19.7G    8.8G    9.9G    47%    /usr/local
/dev/sd0i      2.0G    1.1G    758M    60%    /usr/src
/dev/sd0j      5.9G    2.0K    5.6G     0%    /usr/obj
/dev/sd0k     39.4G   25.5G   11.8G    68%    /home
/dev/sd0l      256G   16.2G    227G     7%    /opt

初期インストールで /home を普通に作っちゃったよ。 いったん別のパーティション(↑なら/optとか)に待避して作り直す。

cd /
doas -s
: 適当にバックアップを取る
rsync -axH /home /opt
umount /home
: 適当に書き潰す
dd if=/dev/zero of=/dev/rsd0k bs=1m count=100

さてここから暗号化作業。元のパーティション(この例ではsd0k)の ディスクラベルを RAID に変えてから bioctl でCRYPTO対象とする。

disklabel -E sd0
m k
offset: [183711680] 
size: [83886080] 
FS type: [4.2BSD] RAID
w
q

いざ bioctl

bioctl -c C -l sd0k softraid0
New passphrase: 
Re-type passphrase: 
softraid0: CRYPTO volume attached as sd1

「sd1にくっつけたよ」ってことなので、新規にパーティションを作る。 home だから h パーティションにしとこうかねえ。 まず痕跡を分からなくするためゼロを書き尽くしてからnewfsする。

dd if=/dev/zero of=/dev/rsd1h bs=1m
dd: /dev/rsd1h: short write on character device
dd: /dev/rsd1h: end of device
40960+0 records in
40959+1 records out
42949394432 bytes transferred in 110.450 secs (388855351 bytes/sec)
disklabel -E sd1
a h
size: [83885552] 
FS type: [4.2BSD] 
sd1*> w
sd1> q

newfsして /etc/fstab の /home を書き変える。 ディスクのUUIDで書いた方が間違いがないので調べてから。

newfs -O2 /dev/rsd1h
	:
	:
disklabel sd1 | grep duid
duid: abcdabcdabcdabcd			# これをfstabに
vi +/home /etc/fstab

/home の行をこんな感じにする。ポイントは、 起動時にfsckやmountをしないように noauto と 0 にする。

abcdabcdabcdabcd.h	/home	ffs	nodev,nosuid,softdep,noauto	0 0

で、………だ。

これを起動時に bioctl して fsck して mount するようなのを rc.local に書いておく。上記URLを参考にうちはこんな風にした。

for trial in 1 2 3 4 5; do
  bioctl -c C -l  abcdabcdabcdabcd.k softraid0 && break
  sleep 1
done
fsck -py /home
mount /home

これって、rc.local のタイミングだから、すでに sshd が上がってるんだな。 てことは、リモートでノートPCをリブートしちゃって、「ぎゃあ、 暗号化ディスクのパスフレーズ入力があるから立ち上がらないじゃーん(T_T)」 てときに、とりあえずホームディレクトリなしでログインできるから 手元にPCがなくってもリブートできて素敵じゃないか!

ああ、てことは NetBSD でも cgd=NO にしておいて、あとから cgdconfig するのを書いとけばよかったのか。ちゃんちゃん。

もっともディスク暗号化は ThinkPad を見事にサスペンド/ハイバネートできる OpenBSD の場合意味が薄いかもしれない。ということで、xidle動かすか。 ~/.xinitrc あるいは ~/.xsession に

xidle &

を足しておき、/etc/apm/suspend とか /etc/apm/hibernate に

pkill -USR1 xidle

を入れておくとよいようだ。/etc/skel/ にも入れておくのがよいかも。