現在位置: ホーム / セキュリティ ブログ / 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)

問い合わせボタン

最新の記事
Sambaに共有以外のファイルにアクセスされる脆弱性(CVE-2017-2619) 2017年03月24日
Subscription-managerの脆弱性( CVE-2017-2663 ) 2017年03月22日
binutilsに複数の脆弱性( CVE-2017-6965, CVE-2017-6966, CVE-2017-6969, CVE-2017-7209 , CVE-2017-7210 , CVE-2017-7223, CVE-2017-7224, CVE-2017-7225, CVE-2017-7226, CVE-2017-7227 ) 2017年03月22日
linux kernelの脆弱性( CVE-2017-7187 ) 2017年03月21日
linux kernelの脆弱性( CVE-2017-6353 , CVE-2017-5986 ) 2017年03月21日
Ubuntu 16.10のkernelの脆弱性( CVE-2017-7184 ) 2017年03月20日
pcreの脆弱性( CVE-2017-7186 ) 2017年03月20日
binutilsの脆弱性( CVE-2017-6965 , CVE-2017-6966 , CVE-2017-6969 ) 2017年03月19日
MySQL(MariaDB) 5.5/5.6のmysql clientの脆弱性( Riddle : CVE-2017-3305 ) 2017年03月18日
linux kernelの脆弱性( CVE-2017-6951 ) 2017年03月17日
Apache Struts2の脆弱性 ( CVE-2017-5638 ) 2017年03月15日
linux kernelの脆弱性( CVE-2017-6874 ) 2017年03月15日
tomcatに情報漏えいの脆弱性( CVE-2016-8747 ) 2017年03月14日
QEMUの脆弱性( CVE-2016-9603 ) (Xen: XSA-211) 2017年03月14日
lxcの脆弱性(CVE-2017-5985) 2017年03月10日
wgetの脆弱性(CVE-2017-6508) 2017年03月08日
linux kernelに特権昇格の脆弱性( CVE-2017-2636 ) 2017年03月08日
( PoC ) linux kernel特権昇格脆弱性( CVE-2017-6074 ) の暫定回避策の確認 2017年03月06日
linux kernelの脆弱性( CVE-2016-9083 , CVE-2016-9084 ) 2017年03月03日
linux kernelに複数の脆弱性( CVE-2017-6345 , CVE-2017-6346 , CVE-2017-6347 , CVE-2017-6348 ) 2017年03月01日
Katello/Foremanによる運用管理 (Part4) 2017年02月28日
util-linux / coreutils の脆弱性(CVE-2017-2616) 2017年02月24日
linux kernelの脆弱性( CVE-2017-6214 ) 2017年02月24日
linux kernelに特権昇格の脆弱性( CVE-2017-6074 ) 2017年02月23日
curlの脆弱性 ( CVE-2017-2629 ) 2017年02月22日
QEMUの脆弱性( CVE-2017-2620 ) (Xen: XSA-209) 2017年02月22日
Tomcatの脆弱性 ( CVE-2017-6056 ) 2017年02月21日
Katello/Foremanによる運用管理 (Part3) 2017年02月21日
OpenSSLの脆弱性 ( CVE-2017-3733 ) 2017年02月16日
linux kernelの脆弱性( CVE-2017-6001 , (was CVE-2016-6786) ) 2017年02月16日
QEMUの脆弱性( CVE-2017-2630 ) 2017年02月15日
glibcの脆弱性(CVE-2015-8982, CVE-2015-8983, CVE-2015-8984) 2017年02月15日
vimの脆弱性 ( CVE-2017-5953 ) 2017年02月14日
Oracle Javaの脆弱性(Oracle Critical Patch Update Advisory - January 2017) 2017年02月14日
libxml2の脆弱性(CVE-2017-5969) 2017年02月13日
「linux kernel-4.9」でのLSMモジュールについて 2017年02月13日
linux kernelの脆弱性( CVE-2017-5970 ) 2017年02月13日
linux kernelの脆弱性( CVE-2016-8636 ) 2017年02月12日
bind 9 に設定依存の脆弱性 ( CVE-2017-3135 ) 2017年02月09日
bashの自動補完機能の脆弱性( CVE-2017-5932 ) 2017年02月08日
spiceの脆弱性( CVE-2016-9577 , CVE-2016-9578 ) 2017年02月08日
QEMUの脆弱性( CVE-2017-5898 ) 2017年02月08日
linux kernelの脆弱性( CVE-2017-5897 ) 2017年02月08日
linux kernelの脆弱性( CVE-2016-10208 ) 2017年02月06日
ntfs-3gの脆弱性(CVE-2017-0358) 2017年02月02日
QEMUの脆弱性( CVE-2017-2615 ) 2017年02月02日
tcpdumpに複数の脆弱性(CVE-2016-7922 等) 2017年01月30日
libgdに複数の脆弱性情報 (CVE-2016-9317, CVE-2016-6912, CVE-2016-10167, CVE-2016-10168, CVE-2016-10169) 2017年01月29日
OpenSSLに複数の脆弱性 ( CVE-2017-3730 , CVE-2017-3731 , CVE-2017-3732 ) 2017年01月27日
RunCに関しての脆弱性( CVE-2016-9962 )のPoCとSELinuxによるリスクの軽減 2017年01月26日
systemdの重要な脆弱性( CVE-2016-10156 ) 2017年01月25日
linux kernelの複数の脆弱性( CVE-2016-10153, CVE-2016-10154, CVE-2017-5547, CVE-2017-5548, CVE-2017-5549, CVE-2017-5550, CVE-2017-5551) 2017年01月25日
Katello/Foremanによる運用管理 (Part2) 2017年01月24日
linux kernel(KVMを有効にしている場合)で複数の脆弱性( CVE-2016-10150, CVE-2017-2583 ) 2017年01月21日
OpenSCAP 1.2.13のリリース情報 2017年01月16日
Oracle Javaの脆弱性(CVE-2016-5542, CVE-2016-5554, CVE-2016-5582, CVE-2016-5597, CVE-2016-5573) 2017年01月13日
bind に複数の脆弱性 ( CVE-2016-9131 , CVE-2016-9147 , CVE-2016-9444 , CVE-2016-9778 ) 2017年01月12日
Dockerに特権昇格の脆弱性 ( CVE-2016-9962 ) 2017年01月11日
GnuTLS の 脆弱性 (GNUTLS-SA-2017-1 : CVE-2017-5334 , GNUTLS-SA-2017-2 : CVE-2017-5335 , CVE-2017-5336 , CVE-2017-5337 ) 2017年01月11日
OpenSSLの脆弱性(CVE-2016-7056 ) 2017年01月11日
最新の記事 - もっと...