現在位置: ホーム / セキュリティ ブログ / PostgreSQL上のセキュリティ(第一回)

PostgreSQL上のセキュリティ(第一回)

今回から数回に分けて、PostgreSQL上のセキュリティを紹介します。

こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面です。

今回から数回に分けて、PostgreSQL上のセキュリティを紹介します。

一口に「セキュリティ」と言っても、色々なセキュリティが含まれます。

そのため、この記事に則り、下記の3つのカテゴリについて、現状のPostgreSQLに対するOSSでの実装を、実際にインストールして見ていきます。

  1. 暗号化

  2. 監査ログ

  3. 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のインストール

  1. PostgreSQL: 9.4は、

    https://download.postgresql.org/pub/repos/yum/9.4/redhat/からダウンロードします。

    4/10の最新は"pgdg-centos94-9.4-2.noarch.rpm"になります。

  2. 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%]
    
  3. "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                                  
    
    完了しました!
    
  4. "postgresql94-setup initdb"で、DBを初期化します。

    [root@pgsql data]# /usr/pgsql-9.4/bin/postgresql94-setup initdb
    Initializing database ... OK
    
    
  5. 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 
    
  6. 再び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$ 
    
  7. 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 のマニュアルページを参考にします。

  1. 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"になります。

  2. 作業ユーザ(例では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/
    
  3. 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
    
  4. "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
    
  5. 作業用ユーザ(例では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%]
    
  6. ライブラリファイルのシンボリックリンクファイル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
    
  7. /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'
    
  8. "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
    
  9. 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
    
  10. このDB(tdetestdb)に対しても、"CREATE EXTENSTION pgcrypto"で、pgcryptoを有効にします。

    -bash-4.2$ psql tdetestdb
    psql (9.4.6)
    "help" でヘルプを表示します.
    tdetestdb=# CREATE EXTENSION pgcrypto;
    CREATE EXTENSION
    tdetestdb=# \quit
    
  11. "createuser"コマンドで、作業用ユーザ"tdetest"を作成します。

    -bash-4.2$ createuser -P tdetest
    新しいロールのためのパスワード:
    もう一度入力してください:
    
  12. /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
    
  13. pg_ctlでPostgreSQLを再起動して設定を反映させます。

    -bash-4.2$ pg_ctl restart
    サーバ停止処理の完了を待っています....完了
    サーバは停止しました
    サーバは起動中です。
    
  14. 作業ユーザ(例では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
    
  15. 作業ユーザ(例では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でテーブルの作成とテストを行います。


[参考]
OSSよろず相談室

サイオスOSSよろず相談室(2)

問い合わせボタン