2010/01/11

ファイルサーバのデータを暗号化

個人情報をきっちりと暗号化することにした。
Debian lenny(と、Ubuntu 9.10)で構築したシステムをcryptsetup-luksを利用してファイルシステムごと暗号化したものに変更する(lennyからsqueeze、wheezyと安定継続稼働中)。

まず、現状を把握する(全く覚えてないのでw)。
現在利用しているファイルシステムを確認。

# mount
/dev/sda1 on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
procbususb on /proc/bus/usb type usbfs (rw)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sdb1 on /share type ext3 (rw,errors=remount-ro)

(ハードディスクを増設した場合や、mountしてない場合はfdisk -lが便利)

/dev/sdbを暗号化パーティションにしてext3のファイルシステムを作ることにする。

手始めに、暗号化したときのコストがどの程度か測るために、暗号化前の処理速度を測ることにした。
が…。
どんなハードディスクを使ってたっけな?w

# cat /proc/scsi/scsi
Attached devices:
...
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: Hitachi HDS72202 Rev: JKAO
Type: Direct-Access ANSI SCSI revision: 05


HitachiのHDS72202か。
カタログスペックを調べようと思ったらぐぐっても見つからない...
ま、いっか。
ベンチマークツールをインストールして速度を測ってみる。

まず読み込み速度。

# aptitude install hdparm
# hdparm -Tt /dev/sdb
/dev/sdb:
Timing cached reads: 7408 MB in 2.00 seconds = 3707.32 MB/sec
Timing buffered disk reads: 396 MB in 3.00 seconds = 131.95 MB/sec


書き込みも測ってみる。

# time dd if=/dev/zero of=/share/hoge ibs=1M obs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 3.8181 s, 281 MB/s
real 0m3.823s
user 0m0.156s
sys 0m2.256s


さて、本番。

カーネルをコンパイルする。

2010/01/17 追記
Ubuntu 9.1やDebian6以上などの、最近のディストリビューションの場合はカーネルの再コンパイルの必要はない。
カーネルがサポートしていない場合、cryptsetup時に以下のようなエラーメッセージが出る。その場合はカーネルを正しく作り直すべし。

Command failed: Failed to setup dm-crypt key mapping.
Check kernel for support for the aes-cbc-essiv:sha256 cipher spec and verify that /dev/sda3
contains at least 258 sectors



カーネルコンパイルの手順は次のようになる。

# aptitude install make gcc
# aptitude install kernel-package fakeroot
# aptitude install linux-source
# cd /usr/src
# tar xvjf linux-source-2.6.26.tar.bz2
# cd linux-source-2.6.26


設定を引き継ぐため古いコンフィグファイルをコピーする。

# cp /boot/config-2.6.26-2-amd64 .config


昔のコンフィグをマージする。

# make oldconfig


続いて、暗号化モジュールをカーネルに組み込む。
グラフィカルなカーネル設定(gconfig)を立ち上げるため、以下のライブラリをインストールする。

# aptitude install libgtk2.0-dev libglade2-dev


続いて、設定画面を呼び出す。下記のコマンドは、Root Terminalから呼び出せばXの設定は必要ない。

# make gconfig


[Device Drivers]->[Multiple devices driver support(RAID and LVM)]->[Device mapper support]
[Device Drivers]->[Multiple devices driver support(RAID and LVM)]->[Device mapper support]->[Crypt target support]
の2つをYにして、カーネルに組み込む。
コンパイルして、インストールする。

# make-kpkg clean
# fakeroot make-kpkg --initrd --revision=20100111.1224 kernel_image kernel_headers modules_image
# cd /usr/src
# dpkg -i linux-headers-2.6.26_20100111.1224_amd64.deb linux-image-2.6.26_20100111.1224_amd64.deb


再起動後、やっとこさ暗号化ファイルシステムを作成。
まず、dm-cryptの設定ツールであるcryptsetupをインストールする。

# aptitude install cryptsetup


暗号化アルゴリズムにaes、ハッシュアルゴリズムにsha256、キーサイズに256を指定する。

# cryptsetup --verbose -y luksFormat -c aes-cbc-essiv:sha256 --key-size 256 /dev/sdb1
WARNING!
========
This will overwrite data on /dev/sdb1 irrevocably.
Are you sure? (Type uppercase yes): YES
Enter LUKS passphrase:
Verify passphrase:
Command successful.


ここで気をつけなくてはいけないことは、大文字でYESと答えないとCommand failedというメッセージが表示されて終了してしまうことである。
なんつーユーザーフレンドリーなインターフェース。まるでおいらが作ったアプリケーションみたいだ。

論理パーティションを作成して適当な名前(encrypted_sdb1)をつける。

# cryptsetup luksOpen /dev/sdb1 encrypted_sdb1
Enter LUKS passphrase:
key slot 0 unlocked.
Command successful.


Device-Mapperに暗号化レイヤが用意されたか確認。

# ls -l /dev/mappaer
crw-rw---- 1 root root 10, 59 2010-01-11 15:41 control
brw-rw---- 1 root disk 254, 0 2010-01-11 15:45 encrypted_sdb1


後は通常のパーティションと同じように扱える。パーティションを他と同じようにext3でフォーマットする。

# mkfs.ext3 /dev/mapper/encrypted_sdb1


マウントする。
※/dev/sdb1を直接mountして使うと壊れてしまうらしいので注意

# mkdir /share
# mount -t ext3 /dev/mapper/encrypted_sdb1 /share
# df
Filesystem 1K-ブロック 使用 使用可 使用% マウント位置
/dev/sda1 59526528 4525292 51977404 9% /
tmpfs 3551324 0 3551324 0% /lib/init/rw
udev 10240 860 9380 9% /dev
tmpfs 3551324 76 3551248 1% /dev/shm
/dev/mapper/encrypted_sdb1
1922857324 200160 1824981616 1% /share


よしよし。
さて、暗号化によりどの程度遅くなったか確認する。

# hdparm -Tt /dev/mapper/encrypted_sdb1
/dev/mapper/encrypted_sdb1:
Timing cached reads: 6934 MB in 2.00 seconds = 3469.98 MB/sec
Timing buffered disk reads: 228 MB in 3.03 seconds = 75.35 MB/sec


読み取り速度はcachedで7%の速度低下、bufferedで43%の速度低下。両極端な結果が出たな。cachedの速さもびっくりだけど、bufferedの速度低下もびっくりだ。
続いて書き込み速度のテスト。

# time dd if=/dev/zero of=/share/hoge ibs=1M obs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 14.2425 s, 75.4 MB/s
real 0m14.245s
user 0m0.160s
sys 0m2.240s


74%の速度低下。キッツー。
用途によっては使い物にならないですね、コレ。

今後マッピングの解除とunmountは以下のようにする。

# umount /share
# cryptsetup luksClose encrypted_sdb1


今後マッピングとmountしたい時は次のようにする。

# cryptsetup luksOpen /dev/sdb1 encrypted_sdb1
# mount -t ext3 /dev/mapper/encrypted_sdb1 /share

もし、

Command failed: No key available with this passphrase.

というエラーメッセージが出た場合は、dm_cryptモジュールが読み込まれているか、lsmodを実効して確かめる。

次はUPS買うかな...

2013/06/28 追記:
squeezeに移行すると、lennyで作った暗号化ファイルシステムがマウントできないという悲鳴の声がネット上でちらほら見かけました。どうも暗号化するときのデフォルト設定が、変わったのが原因(?)ぽいですね。とりあえず上記の暗号化アルゴリズムとハッシュアルゴリズムを選択した場合は、再マウント時に何もトラブルなりませんでした。カーネルも再コンパイルが必要なくなり、modprobe dm_modしてからcryptsetupするだけで問題なしです。また、Debian7ではそれすら必要なかったです。楽になったなぁ…。

2013/06/04 追記:
他のベンチマークがあったので追記 - The Cost Of Ubuntu Disk Encryption
結構いろいろな測定方法が紹介されてる。今度参考にしようっと。

2011/07/29 Debian squeeze環境下でlennyで暗号化したシステムをマウントする方法を末尾に追加。

0 件のコメント: