Postgresql95に暗号化ツールのTDEを試してみる
インストールしたTDE(TDE for PostgreSQL Free Edition)にテスト用のデータベースを作成し、データのやり取りをしてみました。
参考:https://github.com/nec-postgres/tdeforpg/wiki/Manual(JA)
準備
1)データベースの作成
$ createdb -U postgres tdetestdb
2)tdetestdb に pgcryptoを有効にする
$ psql -U postgres tdetestdb
tdetestdb=# CREATE EXTENSION pgcrypto;
CREATE EXTENSION
tdetestdb=# \q
3)環境変数を確認する
$ set | grep PG
PGDATABASE=postgres
PGHOME=/usr/pgsql-9.5/
PGHOST=localhost
PGPASSWORD=post95pas
PGPORT=5432
PGUSER=postgres
4)DBにTDE機能をインストールする
$ 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 : tdetestdb
CREATE LANGUAGE
INFO: Transparent data encryption feature has been activated
5)暗号キーを登録する(cip01keywd)
$ sudo sh bin/cipher_key_regist.sh $PGHOME
=== 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 : tdetestdb
=== 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)テーブルを作成する
$ psql -U postgres tdetestdb
tdetestdb=# create table employee(
tdetestdb(# employeeid integer primary key,
tdetestdb(# name text,
tdetestdb(# address encrypt_text,
tdetestdb(# tel encrypt_text
tdetestdb(# );
CREATE TABLE
tdetestdb=# \d employee
Table “public.employee”
Column | Type | Modifiers
————+————–+———–
employeeid | integer | not null
name | text |
address | encrypt_text |
tel | encrypt_text |
Indexes:
“employee_pkey” PRIMARY KEY, btree (employeeid)
アクセスしてみる
1)セッション開始
tdetestdb=# select cipher_key_disable_log()
tdetestdb=# select pgtde_begin_session(‘cip01keywd’);
2)データを挿入する
tdetestdb=# insert into employee values( 1, ‘従業員1’, ‘滋賀’, ‘003-0001-0001’);
tdetestdb=# insert into employee values( 2, ‘従業員2’, ‘大阪’, ‘003-0001-0002’);
tdetestdb=# insert into employee values( 3, ‘従業員3’, ‘大阪’, ‘003-0001-0003’);
tdetestdb=# insert into employee values( 4, ‘従業員4’, ‘兵庫’, ‘003-0001-0004’);
3)セッション終了
tdetestdb=# select pgtde_end_session();
tdetestdb=# select cipher_key_enable_log()
4)アクセスしてみる
tdetestdb=# select * from employee;
ERROR: TDE-E0017 could not decrypt data, because key was not set[01]
セッションキーが設定されていないんでエラーになる
tdetestdb=# select pgtde_begin_session(‘cip01keywd’);
ERROR: TDE-E0036 you must call cipher_key_disable_log function first[01].
ログを停止させずにセッションを開始するとエラーとなる
5)セッション開始して情報を表示してみる
// ログ出力無効化
tdetestdb=# select cipher_key_disable_log();
// セッション開始
tdetestdb=# select pgtde_begin_session(‘cip01keywd’);
tdetestdb=# select * from employee;
employeeid | name | address | tel
————+———+———+—————
1 | 従業員1 | 滋賀 | 003-0001-0001
2 | 従業員2 | 大阪 | 003-0001-0002
3 | 従業員3 | 大阪 | 003-0001-0003
4 | 従業員4 | 兵庫 | 003-0001-0004
(4 rows)
tdetestdb=# select * from employee where address=’大阪’;
employeeid | name | address | tel
————+———+———+—————
2 | 従業員2 | 大阪 | 003-0001-0002
3 | 従業員3 | 大阪 | 003-0001-0003
(2 rows)
6)セッション終了
// セッション終了
tdetestdb=# select pgtde_end_session();
// ログ出力開始
tdetestdb=# select cipher_key_enable_log();