NetBSDでNECのPostgreSQL暗号化ソフト「Transparent Data Encryption for PostgreSQL Free Edition」を動かしてみる(インストール編)
先々週くらいに、NECがPostgreSQL暗号化ソフトウェアをオープンソースで公開したというニュースがありました。
- Transparent Data Encryption for PostgreSQL
- NEC、国内初データベース暗号化ソフトウェアを無償公開
- NEC、PostgreSQLを暗号化するソフトを無償公開
「データベースを暗号化する透過的暗号化機能」を提供するもので、データの暗号化と復号化は自動で行われるため、ユーザから見ると暗号化を意識せず透過的にデータを扱えます。
これは面白そうだと思ったので、さっそくNetBSDの環境で試してみました。
- 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をビルドする場合、共有メモリとセマフォ関連の設定を変更する必要があります。
sysctlで設定変更できるようですが、今回はカーネルを再構築する方法で対応します(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が必要になるので、事前に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もインストールします。
$ 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ビューで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にインストールしてみました。次の記事ではTDEを設定してデータベース上から透過的暗号化を試してみます。
参考URL
- nec-postgres/tdeforpg
- Transparent Data Encryption for PostgreSQLとは(Manual(JP))
- PostgreSQL
- PostgreSQL 9.3文書(PostgreSQLグローバル開発グループ)
- http://www.postgresql.jp/document/9.3/html/index.html
- 15.5. インストール後の設定作業
- pgcrypto
- pg_available_extensions
- カーネルリソースの管理(共有メモリとセマフォ)