PostgreSQLサーバー用ディレクトリを暗号化ファイルシステムに置き換えてみる
前置き
とりあえず、以下の環境を前提としている。
- OSはCentOS 6 (VirtualBoxのVMとして作成)
- PostgreSQL 8.4をパッケージインストールしている
- データディレクトリは「/var/lib/pgsql/data」
- PostgreSQLのデータディレクトリも含めて1つのパーティションになっている
- これは別パーティションになっていても考え方は一緒
で、暗号化されていない「/var/lib/pgsql」以下を、別HDDを追加して暗号化ファイルシステムとしてフォーマットしたものに置き換えてみようという話。(※別HDDでなくても、同じHDDに空き領域があり、別パーティションを作成できるケースも同様に対応可能)
作業前のHDDは以下のように「/dev/sda」の1本だけ存在する。
# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0006435d Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 1045 7875584 8e Linux LVM Disk /dev/mapper/VolGroup-lv_root: 5947 MB, 5947523072 bytes 255 heads, 63 sectors/track, 723 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/VolGroup-lv_swap: 2113 MB, 2113929216 bytes 255 heads, 63 sectors/track, 257 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 #
下準備
とりあえず、PostgreSQLサーバーを一旦止めないといけないし、HDDを追加しないといけないのでOSも止めることになる(この辺は環境によるだろうが‥)。
# chkconfig postgresql off # sync;sync;sync;shutdown -h now
OSをシャットダウンしたら、HDDを一つ追加して、OSを再起動する。
追加されたHDDは「/dev/sdb」。
# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0006435d Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 1045 7875584 8e Linux LVM Disk /dev/sdb: 8589 MB, 8589934592 bytes 255 heads, 63 sectors/track, 1044 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/VolGroup-lv_root: 5947 MB, 5947523072 bytes 255 heads, 63 sectors/track, 723 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/VolGroup-lv_swap: 2113 MB, 2113929216 bytes 255 heads, 63 sectors/track, 257 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 #
暗号化ファイルシステムの作成と自動接続
作成
# cryptsetup luksFormat -h sha256 /dev/sdb WARNING! ======== This will overwrite data on /dev/sdb irrevocably. Are you sure? (Type uppercase yes): YES Enter LUKS passphrase: Verify passphrase: # cryptsetup luksOpen /dev/sdb sdb_crypt Enter passphrase for /dev/sdb: # mkfs -t ext4 /dev/mapper/sdb_crypt # cryptsetup luksClose sdb_crypt
自動接続の設定
もちろん、これをやると、セキュリティリスクと手間とのトレードオフとなる。
- 自動接続すると、パスフレーズを知らなくても、HDDを全部盗んでOSを起動すればデータが見えてしまう。
- 自動接続しないと、luksOpenから、パスフレーズの入力、マウント、PostgreSQLサーバーの起動まで、全部手動でやることになる。
# dd if=/dev/random of=/etc/lvm/lvm.seckey bs=1 count=32 32+0 records in 32+0 records out 32 bytes (32 B) copied, 58.6724 s, 0.0 kB/s # chmod 400 /etc/lvm/lvm.seckey # cryptsetup luksAddKey /dev/sdb /etc/lvm/lvm.seckey Enter any passphrase: # cryptsetup --key-file /etc/lvm/lvm.seckey luksOpen /dev/sdb sdb_crypt # cryptsetup luksDump /dev/sdb (中略) UUID: xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb (中略) # vi /etc/crypttab + sdb_crypt UUID=xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb /etc/lvm/lvm.seckey luks # vi /etc/fstab + /dev/mapper/sdb_crypt /var/lib/pgsql ext4 errors=remount-ro 0 1 #
PostgreSQL用ディレクトリの移行
# mv /var/lib/pgsql /var/lib/pgsql_original.yyyy-mm-dd # mkdir /var/lib/pgsql # chown postgres:postgres /var/lib/pgsql # chmod go-rwx /var/lib/pgsql # mount /var/lib/pgsql # ( cd /var/lib/pgsql_original.yyyy-mm-dd ; tar czf - . ) | ( cd /var/lib/pgsql ; tar xzf - )
PostgreSQLサーバーの起動
# service postgresql start # chkconfig postgresql on
psqlコマンドなどでPostgreSQLサーバーに接続し、データの取出しなどができることを確認する。
(余談1)念のため確認
OSを再起動したときに、自動接続されるかどうかを確認しておく。
# umount /var/lib/pgsql # cryptsetup luksClose sdb_crypt # sync;sync;sync;shutdown -r now (再起動後‥) # ls /var/lib/pgsql backups data lost+found pgstartup.log #
(余談2)暗号化ファイルシステムの取り外し
使用しているプロセスの停止
もちろん、今回の場合は、まずこのファイルシステムを使用しているPostgreSQLサーバーを停止する必要がある
# service postgresql stop # chkconfig postgresql off
取り外し
自動接続の設定も併せて解除しておく必要がある。(あとでまた接続する場合は、各設定ファイルの内容は削除せずにコメントアウトしておく)
# umount /var/lib/pgsql # cryptsetup luksClose sdb_crypt # vi /etc/fstab - /dev/mapper/sdb_crypt /var/lib/pgsql ext4 errors=remount-ro 0 1 # vi /etc/crypttab - sdb_crypt UUID=xxxxxxxx-yyyy-zzzz-aaaa-bbbbbbbbbbbb /etc/lvm/lvm.seckey luks