2011年9月14日水曜日

RHEL6 device-mapper 暗号化パーティション


このエントリーをはてなブックマークに追加


何かと大活躍なDevice-Mapperには暗号化の機能もついてます。


cryptsetup というのが暗号化のフロントエンドになります。実態はDevice-Mapper。

暗号化するパーティションの作成

普通に作成する。対象は物理・論理パーティションでもLVMでもOK。ここではLVMを使用

# lvcreate -n cryptlv01 -L 1G vg_server2
# lvs
LV        VG         Attr   LSize  Origin Snap%  Move Log Copy%  Convert
  cryptlv01 vg_server2 -wi-a-  1.00g 


暗号化フォーマットする

# cryptsetup luksFormat /dev/vg_server2/cryptlv01
WARNING!
========
This will overwrite data on /dev/vg_server2/cryptlv01 irrevocably.

Are you sure? (Type uppercase yes): YES  ← YESと大文字で入力
Enter LUKS passphrase:    ← 暗号化キーを入力
Verify passphrase:    ← 暗号化キーを再度入力
これで終了。


暗号化デバイスを作成

フォーマットしただけでは使えない。Device-Mapperから暗号化パーティションをキーを使って復元しつつOSから見えるようにしてやる(マッピングしてやる)必要がある。

# cryptsetup luksOpen /dev/vg_server2/cryptlv01 cryptvol01
Enter passphrase for /dev/vg_server2/cryptlv01:   ← 暗号化キーを入力
cryptvol01はキーを使って復元されOSから見えるからアクセス可能になったデバイスの名前。好きなものが指定できる。この操作はOSから見える起動毎に毎回行う必要がある(自動化する方法は後述

この時のdmはこんな状態。

# dmsetup ls --tree
cryptvol01 (253:3)
 └─vg_server2-cryptlv01 (253:2)
    └─ (252:2)
vg_server2-lv_swap (253:1)
 └─ (252:2)
vg_server2-lv_root (253:0)
 └─ (252:2)

# dmsetup ls
vg_server2-cryptlv01 (253, 2)
cryptvol01 (253, 3)
vg_server2-lv_swap (253, 1)
vg_server2-lv_root (253, 0)

# dmsetup table
vg_server2-cryptlv01: 0 2097152 linear 252:2 25102336
cryptvol01: 0 2093056 crypt aes-cbc-essiv:sha256 0000000000000000000000000000000000000000000000000000000000000000 0 253:2 4096
vg_server2-lv_swap: 0 4128768 linear 252:2 20973568
vg_server2-lv_root: 0 20971520 linear 252:2 2048


ファイルシステムを作る

暗号化はブロックレベルで行われているのでluksOpenしたあとにファイルシステムを作る必要がある。特に特別なことは必要ない。

# mkfs -t ext4 /dev/mapper/cryptvol01
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65408 inodes, 261632 blocks
13081 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8176 inodes per group
Superblock backups stored on blocks: 
 32768, 98304, 163840, 229376

Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 32 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

# blkid
/dev/mapper/vg_server2-cryptlv01: UUID="ade6da0d-c256-42fb-a571-c225955096ac" TYPE="crypto_LUKS" 
/dev/mapper/cryptvol01: UUID="715c9346-297d-4f0e-869d-f7eae0367bc6" TYPE="ext4" 


手動マウント

普通にマウントしてやればOK

# mkdir /mnt/crypt
# mount -t ext4 /dev/mapper/cryptvol01 /mnt/crypt
# df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/mapper/vg_server2-lv_root
                      9.9G  2.4G  7.0G  26% /
tmpfs                 499M  260K  499M   1% /dev/shm
/dev/vda1             485M   30M  430M   7% /boot
/dev/mapper/cryptvol01
                     1006M   18M  938M   2% /mnt/crypt


自動マウント

この cryptolv01 からマッピングされている cryptvol01 はOSを再起動すると消えてしまい luksOpen を行わないと再作成されない。

それを自動化するために用意されているのが、/etc/crypttab ファイル。このファイルに自動的にオープンしたい暗号化デバイスとデバイス名、パスワードを指定することでOS起動時にluksOpenが自動的に行われる。

# vim /etc/crypttab
cryptvol01 /dev/vg_server2/cryptlv01 /etc/cryptpass
◆作成したいデバイス名◆暗号化デバイスパス◆パスワードが記述されたファイル、という3つを指定する。最後のパスワードファイルを指定しない場合、OS起動時にパスワードの入力を求められる。

# echo -n "cryptkey" > /etc/cryptpass
改行コードが入っていると、それもキーの一部とみなされるので含まれないように注意。

この設定を行ったら一度OSを再起動してデバイスの作成が行われるか確認し、問題なければfstabにext4としてマウントするように記述する。

これでHDDだけ取り出して、他システムからマウントされてもデータは取り出せなくなる。


注意

・暗号化キーを忘れたら復元不能


関連項目

Device-Mapperはシンプルながら応用範囲が広く、様々な場面で使われています。

RHEL Device Mapper と LVM
RHEL LVM2でシンプロビジョニング
仮想環境を使って簡単にRHEL6のiscsiマルチパスを検証する

RHEL ストレージ関連のエントリーまとめ

0 件のコメント:

コメントを投稿