せくりてぃ!せくりてぃ!うるさい昨今ですが、怪社のPCの暗号化対象がなぜかWindowsPCに限られているのに疑問を感じていました。
つか、オレの持ちだし用ノートPCはUbuntuだし。
どうも、Unix環境じゃお手軽に暗号化する手段がないと思われているらしい。
ということで、Debianを例にLinux環境を暗号化する手順をまとめてみたい。
暗号化ソフトとしては dm-crypt というオープンソースを使います。
他にもいろいろありますが、これが一番使われていると思います。
DebianやFedoaraなら最近はデフォルトで入っているようです。
以降はDebianでの例です。
実戦的と思われるパターンとして /home にマウントしているデバイスを暗号化します。
dm-cryptに加えてcryptsetupとhexdumpとhashalotをインストールしておきます。
とりあえずDebianということで、必要なパッケージをapt-getしておきます。
# apt-get install cryptsetup
# apt-get install hexdump
# apt-get install hashalot
インストールが完了したら、まず暗号化デバイスを作成します。
以降の作業は、/homeをアンマウントしたりするので、シングルユーザにしてから作業しましょう。
当然、泣きたくなければ元のデータはバックアップしておいてください。
まず、マウントしてたら/homeをアンマウントします。
作業を開始する前に、念のため fsck でディスクをチェックしておきましょう。
/homeにマウントしていたデバイスは /dev/hda4 だとすると、
問題が報告されなかったら暗号化作業を開始します。
チェックでエラーが報告されたら、まず修復してから作業しないと、泣くことになります。
まずは暗号化デバイスを作ります。
cryptsetupコマンドを使うと簡単にできます。
# cryptsetup -c aes -h ripemd160 -y -b `blockdev --getsize /dev/hda4` create cryptvol1 /dev/hda4
ここでパスワードを聞かれますので、パスワードを入力してやります。
これが、暗号化を解く鍵になりますので、忘れると戻せなくなります。
絶対忘れないように。
デバイスがうまく作れたら、もとの /dev/hda4 のデータを dd でコピーしてやって暗号化します。
この段階で暗号化されてしまうので、もう止めることはできません。
# dd if=/dev/hda4 of=/dev/mapper/cryptvol1 bs=4k
サイズにもよりますが、結構な時間がかかるのでじっくり待ちましょう。
ディスクにアクセスしている間は暗号化中ですので、絶対割り込んではいけません。
コピーが完了したら、作成した暗号化デバイスを /home にマウントしてみます。
# mount /dev/mapper/cryptvol1 /home
これで、/home 以下のファイルにアクセスできたらとりあえず成功です。
次に、/home なので当然ユーザログインの際にはマウントされている必要がありますので、OS起動時にマウントするように仕掛けします。
まず、既存の/homeのマウント定義を/etc/fstabから削除しておきます。
/etc/fstab
proc /proc proc defaults 0 0
/dev/hda3 / ext3 defaults,errors=remount-ro 0 1
/dev/hda1 /boot ext3 defaults 0 2
# /dev/hda4 /home ext3 defaults 0 2
/dev/hda2 none swap sw 0 0
次に、以下のスクリプトを/etc/init.d/cryptmountに作成します。
ファイル名はもちろん別のファイル名でもよいです。
#!/bin/sh
. /lib/lsb/init-functions
do_start () {
log_action_begin_msg "Mounting crypt disks. Enter password: "
if [ -b /dev/mapper/cryptvol1 ] ; then
/sbin/cryptsetup remove cryptvol1
fi
/sbin/cryptsetup -c aes -h ripemd160 -b `blockdev --getsize /dev/hda4` create cryptvol1 /dev/hda4
/bin/mount /dev/mapper/cryptvol1 /home
log_action_end_msg $?
}
do_stop () {
log_action_begin_msg "Unmounting crypt disks"
if [ -b /dev/mapper/cryptvol1 ] ; then
/bin/umount /home
/sbin/cryptsetup remove cryptvol1
fi
log_action_end_msg $?
}
case "$1" in
start)
do_start
;;
stop)
do_stop
;;
*)
echo "Usage: $0 start|stop" >&2
exit 3
;;
esac
exit 0
log_action_start_msgやlog_action_end_msgは、rcのメッセージを出力するファンクションですが、これはおそらくディストリビューションにより異なるので、Debian以外であれば変えないとダメかもしれません。
ちなみに、これらのファンクションはDebianだと/lib/lsb/init-functionsに定義されていますが、他のディストリビューションだと多分違います。
このスクリプトだと1回間違えるとアウトだから、ちょっとなんですね。
はい。適当にループしてください。
最後に、このスクリプトをrcにスケジュールします。
Xが上がる直前あたりに起動するのが適切です。
私のUbuntuの環境では、起動をrc2のS10、停止をrc1のK90でやってます。
# ln -s /etc/rc2.d/S10cryptmount /etc/init.d/cryptmount
# ln -s /etc/rc1.d/K90cryptmount /etc/init.d/cryptmount
これで、一応設定は完了です。
再起動してみて、
Mounting crypt disks. Enter password:
が出力されたら、暗号化デバイスを作る時に指定したパスワードを入力してリターンします。
正しければこのrcタスクがOKになって、/homeがマウントされます。
最近は、大手の企業は情報漏洩にナーバスなので、そこから仕事を受けている企業の人達も、何かが起きたときに言い訳できるように、対策しておくほうがよいですよ。