PostgresSQLの暗号化

岡本です。

PostgresSQLを暗号化するためにTransparent Data Encryption for PostgreSQL(以下、TDE)を使用してみたのでご紹介します。

TDEとは透過的データ暗号化を提供してくれるミドルウェアで、暗号化/復号化を意識することなくプログラミングすることができるようになります。

今回は簡単な流れを紹介しますが、実際は環境パスを設定したりしています。
詳細は以下の公式マニュアルを確認してみて下さい。
https://github.com/nec-postgres/tdeforpg/wiki/Manual(JA)#%E6%9A%97%E5%8F%B7%E9%8D%B5%E3%81%AE%E7%99%BB%E9%8C%B2%E3%83%BB%E6%9B%B4%E6%96%B0%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89

1.PostgresSQL9.3をインストール

今回試したTDEのバージョンはV1.1.1.1です。
PostgresSQLは9.3からサポートしているようですので、9.3をyumでインストールしました。
別なバージョンのPostgresSQLが入っているようならばポートが競合したりしますのでアンインストールしてからインストールした方がいいと思います。

2.データベース作成

ログインして、データベースを作成します。
postgresにsuしてpsqlコマンドを実行します。

bash-4.1$ psql

(パラメータなしだと、postgresユーザでpostgresデータベースに接続される)

暗号化するデータベースを作成します。

postgres=> create database crypt_database;
CREATE DATABASE

3.暗号化の拡張モジュール追加

pgcryptoとはPostgresSQLが提供している暗号化関数ですがこの関数を有効にします。

bash-4.1$ psql -d crypt_database
crypt_database=# CREATE EXTENSION pgcrypto;
CREATE EXTENSION

4.PostgreSQLサーバにTDE機能をインストールする

$ sudo rpm -ivh https://github.com/nec-postgres/tdeforpg/releases/download/v1.1.1.1/tde_for_pg93-fe-1.1.1-2.el6.x86_64.rpm

スクリプトを実行してTDE機能をインストールします。

$ export PGHOME=/usr/pgsql-9.3
$ export TDEHOME=/opt/nec/tdeforpg93/
$ sudo sh bin/cipher_setup.sh $PGHOME
Transparent data encryption feature setup script
Please select from the setup menu below
Transparent data encryption feature setup menu
1: activate the transparent data encryption feature
2: inactivate the transparent data encryption feature
select menu [1 – 2] > 1
Please enter database server port to connect : 5432
Please enter database user name to connect : postgres
Please enter password for authentication :
Please enter database name to connect : crypt_database
CREATE LANGUAGE
INFO: Transparent data encryption feature has been activated

5.暗号鍵の登録

暗号鍵を登録するため以下のスクリプトを実行します。
ここで登録したキーがないとデータアクセスできなくなります。

$ sudo sh cipher_key_regist.sh /usr/pgsql-9.3
=== Database connection information ===
Please enter database server port to connect : 5432
Please enter database user name to connect : postgres
Please enter password for authentication :
Please enter database name to connect : crypt_database
=== Regist new cipher key ===
Please enter the new cipher key : {暗号化キー}
Please retype the new cipher key : {暗号化キー}
Please enter the algorithm for new cipher key : aes

Are you sure to register new cipher key(y/n) : y

6.SQL実行

暗号化をおこないましたので通常通りにSQLを実行するとエラーでデータを見ることはできません。アクセスする際は以下のような手順で実行する必要があります。

——————————————————————————–
–ログ出力無効化
select cipher_key_disable_log();
–セッション開始
select pgtde_begin_session(‘{暗号化キー}’);
–ログ出力有効化
select cipher_key_enable_log ();

–実行したいSQL
select * from sample_table;

–セッション終了
select pgtde_end_session();
——————————————————————————–

おまけ1

データ移行がある場合は、暗号鍵の登録までおこなったあとに以下のようにリストアすれば移行することができます。

・移行元からスクリプト形式でバックアップをとる

$ pg_dump database名 > backup_file名

・リストアは移行先で次のように行う

$ psql database名 < backup_file名

おまけ2

PostgresSQLで使用するコマンド一覧
http://www.cgis.biz/others/postgresql/4/

いじょう!