PostgreSQL上のセキュリティ(第一回)
こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。
今回から数回に分けて、PostgreSQL上のセキュリティを紹介します。
一口に「セキュリティ」と言っても、色々なセキュリティが含まれます。
そのため、この記事に則り、下記の3つのカテゴリについて、現状のPostgreSQLに対するOSSでの実装を、実際にインストールして見ていきます。
暗号化
監査ログ
DBファイアウォール
まず第一回からは、「暗号化」として、NECがOSSとして公開した、「TDE for PostgreSQL Free Edition」の機能等の検証を行いたいと思います。
Transparent Data Encryption(TDE)について
まずはTDEについて、軽くおさらいしてみましょう。
この記事でも紹介しましたが、DB内部のデータ自体の暗号化に関しては、従来は
- Oracle: DBMS_CRYPTO
- PostgreSQL: pgcrypto
のように、DB内への入出力時に全て暗号化・復号化していました。
しかし、この場合には
- 暗号化を実現する際にアプリケーションに改修が必要
- 暗号化・復号化の際のオーバーヘッド
という事が導入への懸念点となっていました。
そのため、最近では「Transparent Data Encryption(TDE): 透過的データ暗号化」という技術を用いて暗号化が実現されています。これは暗号化をDB側の機能として行ってもらうことでアプリケーションの改修が必要ないものにします。
「TDE for PostgreSQL Free Edition」について
TDEをPostgreSQL上で実現するソフトウェアは商用のものもいくつかありますが、NECは開発した「TDE for PostgreSQL」のうち「TDE for PostgreSQL Free Edition」を2015年6月にオープンソースとして公開しました。
このフリー版を用いることで、フリーのPostgreSQLで透過的データ暗号化を実現することが出来ます。
NECでは、更にデータベース診断・復旧機能と、暗号鍵管理機能(注3)を搭載した製品版「Transparent Data Encryption for PostgreSQL Enterprise Edition」も販売しています。
製品やサービスの詳しい情報は、NECのサイトでご確認下さい。
「TDE for PostgreSQL Free Edition」のインストール
1. インストール環境
今回は、下記の環境でインストールを行いました。
OS: CentOS 7.2
PostgreSQL: 9.4(RPM版)
TDE for PostgreSQL Free Edition: tdeforpg-1.1.1.1
TDE for PostgreSQL Free Editionでは現在PostgreSQL 9.4までしかサポートしていないようなので、PostgreSQLは9.4を使用します。
また、今後の管理の事を考えて、ソースからではなく、極力パッケージを用いてインストールすることとします。
2. PostgreSQLのインストール
PostgreSQL: 9.4は、
https://download.postgresql.org/pub/repos/yum/9.4/redhat/からダウンロードします。
4/10の最新は”pgdg-centos94-9.4-2.noarch.rpm”になります。
rootアカウントで、”rpm -ivh pgdg-centos94-[version].rpm”で、rpmをインストールします。これにより、/etc/yum.repos.d/pgdg-94-centos.repoが作成されます。
[root@pgsql ~]# rpm -ivh /home/sios/pgdg-centos94-9.4-2.noarch.rpm 準備しています... ################################# [100%] 更新中 / インストール中... 1:pgdg-centos94-9.4-2 ################################# [100%]
“yum check-update”でDBを更新してから、”yum -y install postgresql94-server postgresql94-contrib postgresql94-devel”として、postgresql94と開発環境、postgresql94-contrib(pgcryptoが含まれています)をインストールします。
[root@pgsql ~]# yum check-update ; yum -y update 読み込んだプラグイン:fastestmirror base | 3.6 kB 00:00 extras | 3.4 kB 00:00 pgdg94 | 3.6 kB 00:00 updates | 3.4 kB 00:00 (1/2): pgdg94/7/x86_64/group_gz | 331 B 00:00 (2/2): pgdg94/7/x86_64/primary_db | 173 kB 00:02 Loading mirror speeds from cached hostfile * base: ftp.riken.jp * extras: ftp.riken.jp * updates: ftp.riken.jp 読み込んだプラグイン:fastestmirror [root@pgsql ~]# yum -y install postgresql94-server postgresql94-contrib postgresql94-devel ---------------------snip------------------------- インストール: postgresql94-contrib.x86_64 0:9.4.6-1PGDG.rhel7 postgresql94-devel.x86_64 0:9.4.6-1PGDG.rhel7 postgresql94-server.x86_64 0:9.4.6-1PGDG.rhel7 依存性関連をインストールしました: postgresql94.x86_64 0:9.4.6-1PGDG.rhel7 postgresql94-libs.x86_64 0:9.4.6-1PGDG.rhel7 完了しました!
“postgresql94-setup initdb”で、DBを初期化します。
[root@pgsql data]# /usr/pgsql-9.4/bin/postgresql94-setup initdb Initializing database ... OK
postgresユーザになり、設定ファイルをサンプルからコピーします。/usr/pgsql-9.4/share以下に
postgresql.conf.sample
pg_hba.conf.sample
があるので、それぞれを/var/lib/pgsql/9.4/data以下に.confとしてコピーします。
[root@pgsql data]# su - postgres -bash-4.2$ -bash-4.2$ cp /usr/pgsql-9.4/share/postgresql.conf.sample /var/lib/pgsql/9.4/data/postgresql.conf -bash-4.2$ cp /usr/pgsql-9.4/share/pg_hba.conf.sample /var/lib/pgsql/9.4/data/pg_hba.conf
再びrootユーザになり、”systemctl start postgresql-9.4″でPostgreSQLを起動します。
-bash-4.2$ su - [root@pgsql data]# systemctl start postgresql-9.4 [root@pgsql data]# ps ax|grep -i post 1349 ? Ss 0:00 /usr/libexec/postfix/master -w 28754 ? S 0:00 /usr/pgsql-9.4/bin/postgres -D /var/lib/pgsql/9.4/data [root@pgsql data]# exit -bash-4.2$
DB内のユーザ”postgres”のパスワードを設定します。
-bash-4.2$ psql psql (9.4.6) "help" でヘルプを表示します. postgres=# \du ロール一覧 ロール名 | 属性 | メンバー ----------+--------------------------------------------------------------------- -+---------- postgres | スーパーユーザ, ロールを作成できる, DBを作成できる, レプリケーション | {} postgres=# \password postgres 新しいパスワード: もう一度入力してください: postgres=# \quit
3. TDE for PostgreSQL Free Editionのインストール
インストールは、TDE for PostgreSQL のマニュアルページを参考にします。
TDE for PostgreSQL Free EditionのRPMは
https://github.com/nec-postgres/tdeforpg/releasesからダウンロードします。
4/10の最新は”tde_for_pg94-fe-1.1.1-2.el6.x86_64.rpm”になります。
作業ユーザ(例ではsios)に、環境変数”PGHOME””TDEHOME”を設定します。.bash_profileを設定します。
[sios@pgsql ~]$ cat ~/.bash_profile # .bash_profile # Get the aliases and functions ----------------snip-------------------- export PGHOME=/usr/pgsql-9.4/ export TDEHOME=/opt/nec/tdeforpg94/
postgresユーザでpsqlを実行し、”CREATE EXTENSION pgcrypto”を実行して、pgcryptoを有効にします。
[sios@pgsql ~]# su - postgres -bash-4.2$ psql パスワード: psql (9.4.6) "help" でヘルプを表示します. postgres=# CREATE EXTENSION pgcrypto; CREATE EXTENSION postgres=# \quit
“SELECT pg_available_extensions();”で、pgcryptoが有効になっているか確認します。
-bash-4.2$ psql パスワード: psql (9.4.6) "help" でヘルプを表示します. postgres=# SELECT pg_available_extensions(); pg_available_extensions -------------------------------------------------------------------------------------- (moddatetime,1.0,"functions for tracking last modification time") ------------------snip---------------------- (pgcrypto,1.1,"cryptographic functions") (dict_int,1.0,"text search dictionary template for integers") (dict_xsyn,1.0,"text search dictionary template for extended synonym processing ------------------snip---------------------- (worker_spi,1.0,"Sample background worker") (45 行) postgres=# \quit
作業用ユーザ(例ではsios)に戻り、”tde_for_pg94-fe-1.1.1-2.el6.x86_64.rpm”をインストールします。
[sios@pgsql ~]# sudo rpm -ivh tde_for_pg94-fe-1.1.1-2.el6.x86_64.rpm 1:tde_for_pg94-fe-1.1.1-2.el6 ################################# [100%]
ライブラリファイルのシンボリックリンクファイル2つをlib64に生成します。
[sios@pgsql ~]# sudo ln -s $PGHOME/lib/pgcrypto.so /usr/lib64/libpgcrypto.so [sios@pgsql ~]# sudo ln -s $TDEHOME/SOURCES/data_encryption/94/data_encryption93.so.1.1.1.1 /usr/lib64/data_encryption.so
/var/lib/pgsql/9.4/data/postgresql.confファイルを修正して、PostgreSQLが起動する時にライブラリを読み込むようにします。
[sios@pgsql ~]# vi /var/lib/pgsql/9.4/data/ --------------------------------------------------- 以下を追加 #shared_preload_libraries = '' # (change requires restart) shared_preload_libraries = '/usr/lib64/data_encryption.so'
“systemctl restart postgresql-9.4″で、PostgreSQLを再起動します。
[root@pgsql data]# systemctl restart postgresql-9.4 [root@pgsql data]# ps ax|grep -i post 1349 ? Ss 0:00 /usr/libexec/postfix/master -w 28754 ? S 0:00 /usr/pgsql-9.4/bin/postgres -D /var/lib/pgsql/9.4/data
postgresユーザでログインし、TDEテスト用のDBとして”tdetestdb”を作成します。
-bash-4.2$ createuser -P tdetest 新しいロールのためのパスワード: もう一度入力してください: -bash-4.2$ psql psql (9.4.6) "help" でヘルプを表示します. postgres=# create database tdetestdb; CREATE DATABASE postgres=# \quit
このDB(tdetestdb)に対しても、”CREATE EXTENSTION pgcrypto”で、pgcryptoを有効にします。
-bash-4.2$ psql tdetestdb psql (9.4.6) "help" でヘルプを表示します. tdetestdb=# CREATE EXTENSION pgcrypto; CREATE EXTENSION tdetestdb=# \quit
“createuser”コマンドで、作業用ユーザ”tdetest”を作成します。
-bash-4.2$ createuser -P tdetest 新しいロールのためのパスワード: もう一度入力してください:
/var/lib/pgsql/9.4/data/pg_hba.confを修正して、localでもパスワードで認証するようにします。
-bash-4.2$ vi /var/lib/pgsql/9.4/data/pg_hba.conf ---以下を修正--- #local all all peer local all all md5
pg_ctlでPostgreSQLを再起動して設定を反映させます。
-bash-4.2$ pg_ctl restart サーバ停止処理の完了を待っています....完了 サーバは停止しました サーバは起動中です。
作業ユーザ(例ではsios)でcipher_setup.shスクリプトを実行し、TDE機能をインストールします。
[sios@pgsql SOURCES]$ 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
作業ユーザ(例ではsios)で”cipher_key_regist.sh”を実行し、暗号鍵を登録します。
[sios@pgsql bin]$ sh cipher_key_regist.sh /usr/pgsql-9.4 === 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
まとめ
今回はTDEの概略と、PostgreSQL9.4, TDE for PostgreSQL Free Editionのインストールについて説明しました。
次回はTDEを有効にしたDBでテーブルの作成とテストを行います。