NetBSDでNECのPostgreSQL暗号化ソフト「Transparent Data Encryption for PostgreSQL Free Edition」を動かしてみる(インストール編)

# NetBSDでNECのPostgreSQL暗号化ソフト「Transparent Data Encryption for PostgreSQL Free Edition」を動かしてみる(インストール編)

先々週くらいに、NECがPostgreSQL暗号化ソフトウェアをオープンソースで公開したというニュースがありました。

 * Transparent Data Encryption for PostgreSQL
   * http://jpn.nec.com/tdeforpg/
 * NEC、国内初データベース暗号化ソフトウェアを無償公開
   * http://jpn.nec.com/press/201506/20150605_01.html
 * NEC、PostgreSQLを暗号化するソフトを無償公開
   * http://news.mynavi.jp/news/2015/06/08/096/

「データベースを暗号化する透過的暗号化機能」を提供するもので、データの暗号化と復号化は自動で行われるため、ユーザから見ると暗号化を意識せず透過的にデータを扱えます。

これは面白そうだと思ったので、さっそくNetBSDの環境で試してみました。

 * nec-postgres/tdeforpg
   * https://github.com/nec-postgres/tdeforpg/

tdeforpgはRHEL 6.5+PostgreSQL-9.3を対象にしていますが、今回はNetBSD-6.1.5-amd64とPostgreSQL-9.3.9で試しています。とはいえ、NetBSD以外の環境でも若干の読み替えで対応できる手順になっているかと思います。

```
$ uname -a
NetBSD postgres 6.1.5 NetBSD 6.1.5 (GENERIC) amd64
```

"Transparent Data Encryption for PostgreSQL Free Edition"は長い名称なので、以降
は「TDE」と表記します。


## カーネルのリビルド

まずはPostgreSQLのインストール、と行きたいところですが、NetBSDでPostgreSQLをビルドする場合、[共有メモリとセマフォ](https://www.postgresql.jp/document/9.3/html/kernel-resources.html#SYSVIPC "共有メモリとセマフォ")関連の設定を変更する必要があります。

sysctlで設定変更できるようですが、今回は[カーネルを再構築する方法](http://qiita.com/furandon_pig/items/d9b2782372edc1b93263 "NetBSDカーネルをビルドしてみる")で対応します(sysctlで対応する方がお手軽な方法です...)。

```
# sudo -i
# mount /dev/cd0a /mnt
# cd /cdrom/source/sets
# tar zxvf syssrc.tgz -C /
# cd /usr/src/sys/arch/amd64/conf
# cp -pi GENERIC POSTGRES
# (コンフィグファイルを修正する)
# diff -u GENERIC POSTGRES 
--- GENERIC     2012-08-16 00:32:59.000000000 +0900
+++ POSTGRES    2015-06-16 11:23:05.000000000 +0900
@@ -65,6 +65,12 @@
 # Note: SysV IPC parameters could be changed dynamically, see sysctl(8).
 options        SYSVMSG         # System V-like message queues
 options        SYSVSEM         # System V-like semaphores
+options                SHMMAXPGS=4096
+options                SHMSEG=256
+options                SEMMNI=256
+options                SEMMNS=512
+options                SEMMNU=256
+options                SEMMAP=256
 options        SYSVSHM         # System V-like memory sharing
 options        P1003_1B_SEMAPHORE      # p1003.1b semaphore support
# config POSTGRES 
Build directory is ../compile/POSTGRES
Don't forget to run "make depend"
# cd ../compile/POSTGRES
# make depend
# make
# make install
```

## PostgreSQL,TDE関連の環境変数

PostgreSQLとTDE関連の環境変数をあらかじめ設定しておきます。以下のような内容を.bashrcに追加しておきます。

```
$ cat << _EOF >> ~/.bashrc
WORK_DIR=$HOME/work
##
## PostgreSQL,tdeforpg関連の環境変数
##
export PGHOME=/opt/postgresql-9.3.9
export PGDATA=${WORK_DIR}/db
export PGSRC=${WORK_DIR}/`basename ${PGHOME}`
export TDEHOME=${WORK_DIR}/tdeforpg
##
## インストールするPostgreSQLへのPATHを設定しておく
##
export LD_LIBRARY_PATH=${PGHOME}/lib:/usr/lib64
export PATH=$PATH:${PGHOME}/bin
export MANPATH=$MANPATH:${PGHOME}/share/man
_EOF
$ source ~/.bashrc
```

## ソースコードの準備

PostgreSQLは9.3.9(9.3系の最新バージョン)を使います。tdeforpg(TDEのソースコード)はGitHubからcloneします。

```
$ cd ${WORK_DIR}
$ curl -O http://ftp.jaist.ac.jp/pub/postgresql/source/v9.3.9/postgresql-9.3.9.tar.gz
$ git clone https://github.com/nec-postgres/tdeforpg.git
```

## PostgreSQLのビルドとインストール

### GNU Makeのインストール

PostgreSQLのビルドには[GNU Make](https://gnu.org/software/make/ "GNU Make")が必要になるので、事前にpkg_addでインストールしておきます。

```
$ sudo -i pkg_add -v gmake
$ gmake --version 
GNU Make 4.1
Built for x86_64--netbsd
...中略...
```

### PostgreSQLのインストールと設定

#### PostgreSQLのインストール

ここからPostgreSQLのビルドとインストールです。実験用なので不要と思われる機能は無効にしてconfigureを実行します。manを参照したいので、"gmake install-docs"を忘れずに実行します。

```
$ tar zxvf postgresql-9.3.9.tar.gz
$ cd postgresql-9.3.9
$ echo ${PGHOME}
/opt/postgresql-9.3.9
$ ./configure \
        --prefix=${PGHOME}   \
        --with-tcl=no        \
        --with-perl=no       \
        --with-python=no     \
        --with-gssapi=no     \
        --with-ldap=no       \
        --with-libxml=no     \
        --with-libxslt=no    \
        --without-zlib       \
        --without-readline   \
        --disable-largefile  \
        --with-pam           \
        --with-openssl
$ gmake
$ sudo mkdir -p ${PGHOME}
$ sudo chown fpig:users ${PGHOME}
$ gmake install
$ gmake install-docs  # manのインストール
```

#### pgcryptoのインストール

TDEから利用するため、PostgreSQL用の暗号関数を提供するモジュールである[pgcrypto](https://www.postgresql.jp/document/9.3/html/pgcrypto.html "pgcrypto")もインストールします。

```
$ echo ${PGSRC}
/home/fpig/work/postgresql-9.3.9
$ cd ${PGSRC}/contrib/pgcrypto
$ gmake install
```

### データベースの初期化

ここでデータベースの初期化とDB作成を行います。

```
$ echo ${PGDATA}
/home/fpig/work/db
$ initdb
$ pg_ctl start
$ createdb `whoami`
```

psqlでデータベースに接続できることを確認します。

```
$ psql
psql (9.3.9)
Type "help" for help.

fpig=# \q
$
```

### pgcryptoの有効化

```
$ psql << EOF
> CREATE EXTENSION pgcrypto;
> EOF
CREATE EXTENSION
```

[pg_available_extensions](https://www.postgresql.jp/document/9.3/html/view-pg-available-extensions.html "pg_available_extensions")ビューでpgcryptoが利用可能になっていることを確認します。

```
$ psql
psql (9.3.9)
Type "help" for help.

fpig=# SELECT pg_available_extensions();
           pg_available_extensions            
----------------------------------------------
 (plpgsql,1.0,"PL/pgSQL procedural language")
 (pgcrypto,1.0,"cryptographic functions")
(2 rows)

fpig=# 
```

pgcryptoは「**データベース毎にCREATE EXTENSIONする必要がある**」点に注意してください(ハマりポイントです...)。

## Transparent Data Encryption for PostgreSQLのビルドとインストール

### TDEのビルド

以下の手順でTDEをビルドします(NetBSDではmakedencryption.shに一部修正が必要です)。

```
$ sudo mkdir /usr/lib64  # NetBSDには存在しないので作成する
$ sudo ln -s ${PGHOME}/lib/pgcrypto.so /usr/lib64/libpgcrypto.so
$ cd ${PGSRC}
$ ./configure \
        --prefix=${PGHOME}   \
        --with-tcl=no        \
        --with-perl=no       \
        --with-python=no     \
        --with-gssapi=no     \
        --with-ldap=no       \
        --with-libxml=no     \
        --with-libxslt=no    \
        --without-zlib       \
        --without-readline   \
        --disable-largefile  \
        --with-pam           \
        --with-openssl
$ cd ${TDEHOME}/SOURCES/data_encryption
$ sh makedencryption.sh 93 ${PGSRC}
```

NetBSD環境では、GNU Makeが"gmake"というコマンド名でインストールされるため、makedencryption.shを以下のように修正します。

```
--- a/SOURCES/data_encryption/makedencryption.sh
+++ b/SOURCES/data_encryption/makedencryption.sh
@@ -11,6 +11,14 @@
 PGVERSION=$1
 SPATH=$2
 
+#use "gmake" command if installed
+if [ ! -z "`which gmake`" ];
+then
+	MAKE=gmake
+else
+	MAKE=make
+fi
+
 cd $PGVERSION
 CDIR=`pwd`
 
@@ -21,8 +29,8 @@ then
 fi
 
 #build data_encryption
-make clean
-make PGSQL_SRC_PATH=${SPATH}
+${MAKE} clean
+${MAKE} PGSQL_SRC_PATH=${SPATH}
 mv data_encryption.so data_encryption${PGVERSION}.so
 ldd data_encryption${PGVERSION}.so
```

### TDEのインストール

TDEをインストールします。手順ではそうしていませんが、data_encryption.soはPostgreSQLのlibに配置するのが良いのかもしれません。

```
$ sudo ln -s ${TDEHOME}/SOURCES/data_encryption/93/data_encryption93.so \
             /usr/lib64/data_encryption.so
$ cat <<_EOF >> ${PGDATA}/postgresql.conf
shared_preload_libraries='/usr/lib64/data_encryption.so'
_EOF
```

上記の後、PostgreSQLサーバを再起動します。再起動時に「loaded library "/usr/lib64/data_encryption.so"」のログが出力されていればOKです。

```
$ pg_ctl restart
...中略...
server stopped
server starting
$ LOG:  loaded library "/usr/lib64/data_encryption.so"
```

これでTDEを利用する準備ができました。

## まとめ

Transparent Data Encryption for PostgreSQL Free EditionをNetBSDにインストールしてみました。[次の記事](http://qiita.com/furandon_pig/items/27f1a20c5b3c3a18cf23)ではTDEを設定してデータベース上から透過的暗号化を試してみます。

## 参考URL

 * nec-postgres/tdeforpg
   * https://github.com/nec-postgres/tdeforpg/
 * Transparent Data Encryption for PostgreSQLとは(Manual(JP))
   * https://github.com/nec-postgres/tdeforpg/wiki/Manual(JP)
 * PostgreSQL
   * http://www.postgresql.org
   * https://www.postgresql.jp
   * http://ja.wikipedia.org/wiki/PostgreSQL
 * PostgreSQL 9.3文書(PostgreSQLグローバル開発グループ)
   * http://www.postgresql.jp/document/9.3/html/index.html
   * 15.5. インストール後の設定作業
     * http://www.postgresql.jp/document/9.3/html/install-post.html
   * pgcrypto
     * https://www.postgresql.jp/document/9.3/html/pgcrypto.html
   * pg_available_extensions
     * https://www.postgresql.jp/document/9.3/html/view-pg-available-extensions.html
   * カーネルリソースの管理(共有メモリとセマフォ)
     * https://www.postgresql.jp/document/9.3/html/kernel-resources.html#SYSVIP