Postgresql用の暗号化ツールであるTDE(Transparent Data Encryption for PostgreSQL)を導入しました。

なんどかやリマ押しましたけど、Vagrantで環境作っといて良かったです!

導入手順

1)Vagrant + CentOS7.3 な環境にPostgresql95を導入します

2)TDE(Transparent Data Encryption for PostgreSQL)をRPMで導入します。

3)暗号化の処理を行います。

作業詳細

1)postgresのパスワードを設定する(post95pas)

後で必要になるので、とっとと設定しておきます

# su – postgres
Last login: Mon Apr 3 16:50:27 UTC 2017 on pts/0
-bash-4.2$ psql
psql (9.5.6)
Type “help” for help.

postgres=# \du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

postgres=# \password postgres
Enter new password:
Enter it again:

2)TDEインストールのため下記の環境変数で接続できるようにする必要がある

export PGHOST=”localhost”
export PGUSER=”postgres”
export PGPASSWORD=”post95pas”(お使いのパスワード)
export PGPORT=5432
export PGDATABASE=”postgres”

※PGHOST=”localhost”の”localhost”はIPv6

# vi /var/lib/pgsql/9.5/data/pg_hba.conf
# “local” is for Unix domain socket connections only
#local all all peer
local all all md5
# IPv4 local connections:
#host all all 127.0.0.1/32 ident
host all all 127.0.0.1/32 md5
# IPv6 local connections:
#host all all ::1/128 ident
host all all ::1/128 md5

※環境変数の削除方法(オマケ)
unset PGHOST
unset PGUSER
unset PGPASSWORD
unset PGPORT
unset PGDATABASE

・Postgresql95を再起動します。
# systemctl restart postgresql-9.5.service

・アクセスを確認
$ psql -w -c “select 1”;
?column?
———-
1
(1 row)

3)TDE for PostgreSQL Free Editionのインストール

・環境変数の設定
.bash_profile
export PGHOME=/usr/pgsql-9.5/
export TDEHOME=/opt/nec/tdeforpg95-fe/
$ source .bash_profile

・pgcryptoを有効にする
# su – postgres
Last login: Mon Apr 3 16:59:45 UTC 2017 on pts/0
Last failed login: Mon Apr 3 17:22:05 UTC 2017 on pts/0
There were 4 failed login attempts since the last successful login.
-bash-4.2$ psql
psql (9.5.6)
Type “help” for help.

postgres=# CREATE EXTENSION pgcrypto;
CREATE EXTENSION
postgres=# SELECT pg_available_extensions();
pg_available_extensions
——————————————————————————————
(pgcrypto,1.2,”cryptographic functions”)
(dict_int,1.0,”text search dictionary template for integers”)
(pg_prewarm,1.0,”prewarm relation data”)

・インストールする
$ wget https://github.com/nec-postgres/tdeforpg/releases/download/v1.1.2.0/tde_for_pg95-fe-1.1.2-0.el7.x86_64.rpm
$ sudo rpm -ivh tde_for_pg95-fe-1.1.2-0.el7.x86_64.rpm
Preparing… ################################# [100%]
Updating / installing…
1:tde_for_pg95-fe-1.1.2-0.el7 ################################# [100%]
INFO: Transparent Data Encryption for PostgreSQL 9.5
was installed successfully.
HINT: To complete validation of transparent data encryption feature,
please refer to “/opt/nec/tdeforpg95-fe/INSTALL-NOTE.TXT”

$ sudo ln -s $PGHOME/lib/pgcrypto.so /usr/lib64/libpgcrypto.so
$ sudo ln -s $TDEHOME/SOURCES/data_encryption/95/data_encryption95.so.1.1.2.0 /usr/lib64/data_encryption.so

・/var/lib/pgsql/9.5/data/postgresql.confを修正し、起動時にライブラリを読み込むようにする
shared_preload_libraries = ‘/usr/lib64/data_encryption.so’

・Postgresql95を再起動します。
# systemctl restart postgresql-9.5.service

4)暗号化機能を設定する

・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 : postgres
CREATE LANGUAGE
INFO: Transparent data encryption feature has been activated

・暗号キーの登録をする kuma0admin
$ 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 : postgres
=== 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
$ psql -U postgres
psql (9.5.6)
Type “help” for help.

postgres=# \d
List of relations
Schema | Name | Type | Owner
——–+——————+——-+———-
public | cipher_key_table | table | postgres
(1 row)

postgres=# select * from cipher_key_table;
key
| algorithm
————————————————————————————————————————————————–
——–+———–
\xc30c0409010240a217c048108bd2d23b01dfaf4f8e7e4cd38cdbf9e7a74a995c29512789be69019f741b33d48180b45fe6bc911d2434b2830f8cbd6f6cd291c223275fde43c4ebb
1f037b8 | aes
(1 row)

処理の流れの概略

1.ログ出力の抑制
 ⇒ログに暗号キー情報が漏洩する可能性があるらしい
postgres=# select cipher_key_disable_log();
cipher_key_disable_log
————————
t
(1 row)
2.セッション開始
postgres=# SELECT pgtde_begin_session(‘kuma0admin’);
pgtde_begin_session
———————
t
(1 row)

*************** あれこれ処理 *********************

3.セッション終了
postgres=# SELECT pgtde_end_session();
pgtde_end_session
——————-
t
(1 row)
4.ログ出力開始
postgres=# select cipher_key_enable_log();
cipher_key_enable_log
———————–
t
(1 row)

あとはテストデータベースの設定をします。