Manual(JA)

Daizo edited this page Jul 11, 2018 · 33 revisions

Transparent Data Encryption for PostgreSQLとは

Transparent Data Encryption for PostgreSQLはPostgreSQL専用の暗号化ツールで、PostgreSQLデータベースサーバに暗号化データ型を追加します。

License

Transparent Data Encryption for PostgreSQL Free Edition

Copyright (c) 2015-2018 NEC Corporation

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.

Portions are: Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group

Portions Copyright (c) 1994, The Regents of the University of California

Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.

IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.

目次

稼働環境

Transparent Data Encryption for PostgreSQL Free Edition以下の環境で動作テストをしています。

Transparent Data Encryption for PostgreSQL Free Editionを利用するためにpsqlをインストールします。

Transparent Data Encryption for PostgreSQL Free Edition V1.1.x

  • PostgreSQL 9.3, 9.4, 9.5
  • Red Hat Enterprise Linux 6.5, 7.1

Transparent Data Encryption for PostgreSQL Free Edition V1.2.x

  • PostgreSQL 9.5, 9.6, 10
  • Red Hat Enterprise Linux 7.1
  • Windows Server 2012, Windows Server 2012 R2, Windows Server 2016

AES-NIの利用条件

AESによる暗号化および復号の高速化を目的としたCPUの命令セットAES-NIを利用するためには、以下の条件を満たす必要があります。

  • PostgreSQL 9.5以上に対して透過的暗号化機能が有効となっていること
  • Transparent Data Encryption for PostgreSQL Free Edition V1.2.1以降が利用されていること
  • OpenSSLがインストールされていること
    • Red Hat Enterprise Linuxでは通常 OpenSSL 1.0.2系(RHEL7)がインストールされています。
    • コミュニティ推奨WindowsインストーラによりインストールされたPostgreSQLを利用します。(同梱されているOpenSSLを利用するため)

Linux版インストール手順

PostgreSQL 9.6をベースにLinux版Transparent Data Encryption for PostgreSQL Free Edition V1.2.1-0の インストール手順を紹介します。

ソースコードからインストールする場合

ソースコードからインストールする手順を説明します。

インストールの準備

  1. 安定版PostgreSQL 9.6のソースコードのダウンロード
  2. 安定版PostgreSQL 9.6のインストール(with psql)
  3. Transparent Data Encryption Free Editionのソースコードのダウンロード

環境設定

以下の環境変数を設定します。

  • PGSRC:PostgreSQLのソースコードのディレクトリ
  • PGHOME:PostgreSQLがインストールされたディレクトリ
  • TDEHOME:Transparent Data Encryption Free Editionをダウンロードしたディレクトリ
  • PGPORT:PostgreSQLのサービス待ち受けポート番号
  • PGDATA:データベースクラスタのディレクトリパス
  • PGDATABASE:データベース名
  • PGUSER:データベースに接続するためのスーパユーザ名
  • PGPASSWORD:スーパユーザのパスワード
$ export PGSRC="/tmp/postgresql-9.6.9"
$ export PGHOME="/usr/pgsql969"
$ export TDEHOME="/opt/nec/tdeforpg96-fe"
$ export PGPORT="5432"
$ export PGDATA="/var/lib/pgsql/9.6/data"
$ export PGDATABASE="tdedb"
$ export PGUSER="postgres"
$ export PGPASSWORD="******"

pgcryptoのインストール

Transparent Data Encryption for PostgreSQLを利用するためにpgcryptoをインストールします。 本手順は、以下のパターンごとに手順が異なります。

  • PostgreSQLのソースコードに同梱されたpgcryptoを利用する場合
  • PostgreSQL 9.5、 9.6でAES-NI対応のpgcryptoを利用する場合

※ AES-NIの利用には条件があります。詳細はAES-NIの利用条件をご確認ください。

なお、pgcryptoがインストールされているか次のコマンドで確認することが可能です。

$ psql -c "SELECT * FROM pg_extension;"
PostgreSQLのソースコードに同梱されたpgcryptoを利用する場合

既にインストールしている場合は、 このステップをスキップします。

$ cd ${PGSRC}/contrib/pgcrypto
$ gmake
$ gmake install
$ pg_ctl start
$ psql -c "CREATE EXTENSION pgcrypto;"
AES-NI対応のpgcryptoを利用する場合

PostgreSQL 9.5、9.6に同梱されているpgcryptoはAES-NIをサポートしません。 PostgreSQL 9.5、9.6でAES-NI対応したpgcryptoを利用したい場合は、以下の手順でAES-NI対応のpgcryptoをインストールします。なお、pgcryptoが既にインストールされている場合は、後述の手順を実施後、以下の手順を実施します。

$ cp -ip ${TDEHOME}/SOURCES/data_encryption/96/libpgcrypto96.so.1.2.1.0 \
> ${PGHOME}/lib/pgcrypto.so
$ pg_ctl start
$ psql -c "CREATE EXTENSION pgcrypto;"

pgcryptoが既にインストールされている場合は、前述の手順の前に以下の手順を実行します。

$ psql -c "DROP EXTENSION pgcrypto;"

Transparent Data Encryption for PostgreSQLのビルド

Transparent Data Encryption for PostgreSQLのソースコードをビルドします。

ビルドに成功すると${TDEHOME}/SOURCES/data_encryption/<pgversion>/ディレクトリにdata_encryption<pgversion>.so.<version>が生成されます。

<pgversion>はPostgreSQLのバージョンを示します。

<version>はTransparent Data Encryption for PostgreSQLのバージョンを示します。

$ sudo ln -s ${PGHOME}/lib/pgcrypto.so /usr/lib64/libpgcrypto.so
$ cd ${PGSRC}
$ ./configure --with-openssl
$ cd ${TDEHOME}/SOURCES/data_encryption
$ sh makedencryption.sh 96 ${PGSRC}

PostgreSQLサーバにTransparent Data Encryption for PostgreSQLをインストールする

PostgreSQLにTDE機能をインストールします。

ライブラリファイルのシンボリックリンクファイルをlib64に作成し、 PostgreSQLサーバ起動時に読み込むよう構成します。

$ sudo ln -s ${TDEHOME}/SOURCES/data_encryption/96/data_encryption96.so.1.2.1.0 \
> /usr/lib64/data_encryption.so
$ vim ${PGDATA}/postgresql.conf  # add shared_preload_libraries to postgresql.conf
  shared_preload_libraries='/usr/lib64/data_encryption.so'
$ pg_ctl restart

cipher_setup.shスクリプトを実行しTDE機能をインストールします。

$ cd ${TDEHOME}/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 : <port_number>
Please enter database user name to connect : <user_name>
Please enter password for authentication : <password>
Please enter database name to connect : <db_name>

RPMからインストールする場合

RPMパッケージからインストールする手順を説明します。 インストールするOSの環境はRedhat Linux Enterprise Linux 7を想定しています。 rpmファイルは https://github.com/nec-postgres/tdeforpg/releases からダウンロードしてください。

インストールの準備

  1. 安定版 PostgreSQL 9.6 のインストール(with psql)
  2. contrib パッケージのインストール (pgcrypto インストール用)
  3. Transparent Data Encryption Free EditionのRPMパッケージのダウンロード

環境設定

以下の環境変数を設定してください。

  • PGHOME:PostgreSQLがインストールされたディレクトリ
  • TDEHOME:Transparent Data Encryption Free Editionをダウンロードしたディレクトリ
  • PGPORT:PostgreSQLのサービス待ち受けポート番号
  • PGDATA:データベースクラスタのディレクトリパス
  • PGDATABASE:データベース名
  • PGUSER:データベースに接続するためのスーパユーザ名
  • PGPASSWORD:スーパユーザのパスワード
$ export PGHOME="/usr/pgsql969"
$ export TDEHOME="/opt/nec/tdeforpg96-fe"
$ export PGPORT="5432"
$ export PGDATA="/var/lib/pgsql/9.6/data"
$ export PGDATABASE="tdedb"
$ export PGUSER="postgres"
$ export PGPASSWORD="******"

pgcryptoのインストール

Transparent Data Encryption for PostgreSQLを利用するためにpgcryptoをインストールします。 本手順は、以下のパターンごとに手順が異なります。

  • contrib パッケージのpgcryptoを利用する場合

  • PostgreSQL 9.5、 9.6でAES-NI対応のpgcryptoを利用する場合

    ※ AES-NIの利用には前提条件があります。詳細はAES-NIの利用条件をご確認ください。

なお、pgcryptoがインストールされているか次のコマンドで確認することが可能です。

$ psql -c "SELECT * FROM pg_extension;"
contrib パッケージのpgcryptoを利用する場合

既にインストールしている場合は、 このステップをスキップします。

$ sudo yum install uuid #contribの依存関係パッケージインストール
$ sudo rpm -ivh postgresql96-contrib-9.6.9-1PGDG.rhel7.x86_64 # contribのインストール
$ pg_ctl start
$ psql -c "CREATE EXTENSION pgcrypto;"

AES-NI対応pgcryptoのインストール

PostgreSQL 9.5、9.6に同梱されているpgcryptoはAES-NIをサポートしません。 PostgreSQL 9.5、9.6でAES-NI対応したpgcryptoを利用したい場合は、以下の手順でAES-NI対応のpgcryptoをインストールします。なお、pgcryptoが既にインストールされている場合は、後述の手順を実施後、以下の手順を実施します。

$ cp -ip ${TDEHOME}/SOURCES/data_encryption/96/libpgcrypto96.so.1.2.1.0 \
> ${PGHOME}/lib/pgcrypto.so
$ pg_ctl start
$ psql -c "CREATE EXTENSION pgcrypto;"

pgcryptoが既にインストールされている場合は、前述の手順の前に以下の手順を実行します。

$ psql -c "DROP EXTENSION pgcrypto;"

PostgreSQLサーバにTDE機能をインストールする

以下の手順でPostgreSQLにTDE機能をインストールします。

ライブラリファイルのシンボリックリンクファイルをlib64に生成し、 PostgreSQLサーバを立ち上げるとき読み込むようにします。

$ sudo ln -s ${PGHOME}/lib/pgcrypto.so /usr/lib64/libpgcrypto.so
$ sudo ln -s ${TDEHOME}/SOURCES/data_encryption/96/data_encryption96.so.1.2.1.0 \ 
> /usr/lib64/data_encryption.so
$ vim ${PGDATA}/postgresql.conf  # add shared_preload_libraries to postgresql.conf
  shared_preload_libraries='/usr/lib64/data_encryption.so'
$ pg_ctl restart

cipher_setup.shスクリプトを実行しTDE機能をインストールします。

$ cd ${TDEHOME}/SOURCES
$ sudo 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 : <port_number>
Please enter database user name to connect : <user_name>
Please enter password for authentication : <password>
Please enter database name to connect : <db_name>

Windows版インストール手順

本書ではPostgreSQL 9.6をベースにインストール手順を紹介します。

ソースコードからインストールする場合

Windows版のTDEforPGのビルド手順は、PostgreSQLのcontribパッケージと同様です。 詳細について、Windows版のビルド手順を参照してください。

インストーラからインストールする場合

Windows版Transparent Data Encryption Free Editionをインストーラを利用してインストールする手順を説明します。

インストーラは https://github.com/nec-postgres/tdeforpg/releases からダウンロードしてください。

インストールの準備

  1. コミュニティ推奨Windowsインストーラによりインストールされた安定版PostgreSQL 9.6 (with psql)
  2. Transparent Data Encryption Free Editionのインストーラのダウンロード

環境設定

コマンドプロンプトを起動し、以下の環境変数を設定してください。

  • PGHOME:PostgreSQLがインストールされたフォルダ
  • TDEHOME:Transparent Data Encryption Free Editionをインストールしたフォルダ
  • PGPORT:PostgreSQLのサービス待ち受けポート番号
  • PGDATA:データベースクラスタのフォルダパス
  • PGDATABASE:データベース名
  • PGUSER:データベースに接続するためのスーパユーザ名
  • PGPASSWORD:スーパユーザのパスワード
CMD> set PGHOME=C:\Program Files\PostgreSQL\9.6
CMD> set TDEHOME=C:\Program Files\NEC\TDEforPG96-FE
CMD> set PGPORT=5432
CMD> set PGDATA=C:\Program Files\PostgreSQL\9.6\data
CMD> set PGDATABASE=tdedb
CMD> set PGUSER=postgres
CMD> set PGPASSWORD=******

Transparent Data Encryption for PostgreSQLのインストール

  1. 事前にダウンロードしたインストーラをクリックします。

    インストーラの命名規則は以下の通りです。

    TDEforPG<PostgreSQLバージョン>_<Transparent Data Encryption for PostgreSQLバージョン>-FE.exe

    • PostgreSQLバージョン: Transparent Data Encryption for PostgreSQLが対応するPostgreSQLバージョンを示します。9.5は95、9.6は96、10は10と表示されます。

    • Transparent Data Encryption for PostgreSQLバージョン: 表記形式はX_Y_Zです。X_Yはメジャーバージョン、Zはマイナーバージョンを示します。

  2. 「Transparent Data Encryption for PostgreSQL Enterprise Edition (PostgreSQL XX)用のInstallShieldウィザードへようこそ」画面が表示されますので、「次へ」をクリックします。
    TDEforPG_Install_Start

  3. 「インストール先のフォルダー」画面が表示されます。変更する場合は「変更」をクリックしてフォルダを指定し、「次へ」をクリックします。

  4. 「プログラムをインストールする準備ができました」画面が表示されますので、「インストール」をクリックしてインストールを開始します。

  5. 「InstallShield ウィザードを完了しました」画面が表示されます。完了をクリックします。
    TDEforPG_Install_Finish

pgcryptoのインストール

Transparent Data Encryption for PostgreSQLを利用するためにpgcryptoをインストールします。 本手順は、以下のパターンごとに手順が異なります。

  • コミュニティ推奨Windowsインストーラのpgcryptoを利用する場合

  • PostgreSQL 9.5、 9.6でAES-NI対応のpgcryptoを利用する場合

    ※ AES-NIの利用には前提条件があります。詳細はAES-NIの利用条件をご確認ください。

なお、pgcryptoがインストールされているか次のコマンドで確認することが可能です。

$ psql -c "SELECT * FROM pg_extension;"
コミュニティ推奨Windowsインストーラのpgcryptoを利用する場合

既にインストールしている場合は、 このステップをスキップします。

CMD> psql -c "CREATE EXTENSION pgcrypto;"
PostgreSQL 9.5, PostgreSQL 9.6でAES-NI対応のpgcryptoを利用する場合

PostgreSQL 9.5、9.6に同梱されているpgcryptoはAES-NIをサポートしません。 PostgreSQL 9.5、9.6でAES-NI対応したpgcryptoを利用したい場合は、以下の手順でAES-NI対応のpgcryptoをインストールします。なお、pgcryptoが既にインストールされている場合は、後述の手順を実施後、以下の手順を実施します。

CMD> copy "%TDEHOME%\lib\pgcrypto.dll" "%PGHOME%\lib"
CMD> sc start postgresql-x64-9.6 # サービス登録していない場合は、pg_ctl start
CMD> psql -c "CREATE EXTENSION pgcrypto;"

pgcryptoが既にインストールされている場合は、前述の手順の前に以下の手順を実行します。

CMD> psql -c "DROP EXTENSION pgcrypto;"

PostgreSQLの設定ファイルの変更

PostgreSQLの設定ファイル(postgresql.conf)のshared_preload_librariesパラメータにTransparent Data Encryption for PostgreSQLのダイナミックリンクライブラリdata_encryption.dllを設定します。

shared_preload_libraries = '"C:\\Program Files\\NEC\\TDEforPG96-FE\\lib\\data_encryption.dll"'

変更した設定を有効にするため、PostgreSQLを再起動します。次の例ではサービスを再起動することでPostgreSQLを再起動します。

CMD>sc stop postgresql-x64-9.6
CMD>sc start postgresql-x64-9.6

サービスとして登録していない場合は、pg_ctlコマンドを利用してPostgreSQLを再起動します。

CMD>pg_ctl restart

透過的暗号化機能を対話型で有効化

  1. 「スタートメニュー」 > 「cipher_setupの実行」をクリックします。

  2. 「NEC TDE for PG Free Edition V1.2.1」画面が表示されます。以下の表を参考に各項目を入力し、「Activate TDE Feature」をクリックします。
    TDEforPG_cipher_setup

項目 説明 入力例
Database Port Number ポート番号 5432
Database Name データベース名 tdedb
Database User Name スーパユーザ名 postgres
Database User Password スーパユーザのパスワード ******
PostgreSQL Install Folder PostgreSQLがインストールされたフォルダパス C:\Program Files\PostgreSQL\9.6

3 「Activate confirm」画面が表示されます。「はい」をクリックします。

  1. 入力した情報に問題が無ければActivate successダイアログが表示されます。表示されたメッセージを確認し、OKをクリックします。これで指定したデータベースに対して透過的暗号化機能が有効化されます。

Linux版旧バージョンからのアップグレード

旧バージョンの透過的暗号化機能のアップグレードにデータのマイグレーションが必要な場合※は、PostgreSQL の標準機能であるpg_dump/pg_restore コマンドを利用して、暗号化されたデータを旧バージョンで使用していたデータベースから新バージョンで使用するデータベースに移行してください。

※:データのマイグレーションが必要かはリリースノートをご確認ください。

以下に透過的暗号化機能のアップグレード手順を示します。

【注意事項】

  • 移行前には必ず$PGDATAディレクトリのファイルシステムレベルのバックアップ(物理バックアップ)を作成してください。

環境設定

以下の環境変数を設定してください。

  • PGHOME:PostgreSQLがインストールされたディレクトリ
  • TDEHOME:Transparent Data Encryption Free Editionをインストールしたディレクトリ
  • PGPORT:PostgreSQLのサービス待ち受けポート番号
  • PGDATA:データベースクラスタのディレクトリパス
  • PGDATABASE:データベース名
  • PGUSER:データベースに接続するためのスーパユーザ名
  • PGPASSWORD:スーパユーザのパスワード
$ export PGHOME="/usr/pgsql969"
$ export TDEHOME="/opt/nec/tdeforpg96-fe"
$ export PGPORT="5432"
$ export PGDATA="/var/lib/pgsql/9.6/data"
$ export PGDATABASE="tdedb"
$ export PGUSER="postgres"
$ export PGPASSWORD="******"

旧バージョンのDBに対するpg_dumpコマンドによるダンプファイル取得

以下のコマンド例を参考にし、対象のデータベースに対してpg_dumpを実行します。<dump_file>には出力先ダンプファイル名を、<database>にはバックアップ対象データベース名を指定してください。pg_dump実行前にPGOPTIONS 環境変数でencrypt.enableパラメータをoffにすることでユーザデータを暗号化したままの状態でバックアップすることが可能です。

$ PGOPTIONS="-c encrypt.enable=off" pg_dump -f <dump_file> -Fc <database>

ダンプファイルからリストアリストを作成

ダンプファイルには旧バージョンの透過的暗号化機能への設定が含まれているため、正しくバージョンアップができません。 そこで、旧バージョンの透過的暗号化機能への設定を除いたユーザデータのみをリストアする為のリストアリストを作成します。以下の手順を用いて作成してください。「<>」でくくられた各変数の意味は以下になります。

  • <dumplist_file> : ダンプファイルに含まれている情報リストの出力先
  • <database> : バックアップしたデータベース名
  • <tdeoperator_list_file> : 透過的暗号化機能のオペレータ情報の出力先
  • <restorelist_file> : ダンプファイルに含まれている情報リストから透過的暗号化機能を除いたリストの出力先
  • <old_version> : 旧バージョンのTransparent Data Encryption for PostgreSQLのバージョン番号
$ pg_restore -l <dump_file> > <dumplist_file>
$ psql -F ' ' -d <database>  << EOF | grep -E [0-9]+ > <tdeoperator_list_file>
\t
\a
SELECT a.oid, 
       'OPERATOR', 
       c.nspname , 
       oprname, 
       rolname
  FROM pg_operator a 
  JOIN pg_authid b 
    ON a.oprowner=b.oid
  JOIN pg_namespace c 
    ON  c.oid=a.oprnamespace
 WHERE a.oprcode in (select oid 
                       from pg_proc 
                      where probin like '%data_encryption.so');
EOF

Transparent Data Encryption 旧バージョンの無効化

セットアップスクリプトファイルを実行して、旧バージョンの透過的暗号化機能を無効化します。

$ sh ${TDEHOME}/SOURCES/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] > 2
Please enter database server port to connect : <port_number>
Please enter database user name to connect : <user_name>
Please enter password for authentication : <password>
Please enter database name to connect : <database>
INFO: The transparent data encryption feature has been inactivated

古いデータベースを削除

バックアップが終わったデータベースを削除してください。

$ dropdb <database>

元の名前のデータベースを作成

リストア対象のPostgreSQLに透過的暗号化機能用データベースを作成してください。

$ createdb <database>

旧バージョン透過的暗号化機能のライブラリファイルを削除

$ sudo rm /usr/lib64/data_encryption.so

Transparent Data Encryption 新バージョンのインストール

新バージョンの透過的暗号化機能をインストールしてください。インストール手順についてはLinux版インストール手順を参考にしてください。

pg_restore コマンドによるダンプファイルのリストア

以下のコマンド例を参考にし、対象DB に対してバックアップファイルをpg_restore を使用してリストアします。オプションなしでリストアを実行するとpublic スキーマに定義された新バージョンの透過的暗号化機能と競合してエラーが発生するため、2で作成したリストアリストを利用してリストアを実行してください。「<>」でくくられた各変数の意味はダンプファイルからリストアリストを作成を ご確認ください。

$ grep -v -f $TDEHOME/SOURCES/lib/upgrade/installed_list_fe_<old_version>.txt \
> -f <tdeoperator_list_file> <dumplist_file> > <restorelist_file>
$ PGOPTIONS="-c encrypt.enable=off" pg_restore -d <new_database> \
> -L <restorelist_file> -e <dump_file>

アップグレード前の暗号鍵を登録

暗号化データを復号するためにアップグレード前の暗号鍵(パスフレーズ)を登録します。

$ sh ${TDEHOME}/SOURCES/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 : <port_number>
Please enter database user name to connect : <user_name>
Please enter password for authentication : <password>
Please enter database name to connect : <database>
INFO: The transparent data encryption feature has been inactivated

Windows版旧バージョンからのアップグレード

旧バージョンの透過的暗号化機能のアップグレードにデータのマイグレーションが必要な場合、PostgreSQL の標準機能であるpg_dump/pg_restore コマンドを利用して、暗号化されたデータを旧バージョンで使用していたデータベースから新バージョンで使用するデータベースに移行します。

※:データのマイグレーションが必要かはリリースノートをご確認ください。

以下に透過的暗号化機能のアップグレード手順を示します。

【注意事項】

  • 移行前には必ずPGDATAディレクトリのファイルシステムレベルのバックアップ(物理バックアップ)を作成してください。

旧バージョンのDBに対するpg_dumpコマンドによるダンプファイル取得

以下のコマンド例を参考にし、対象のデータベースに対してpg_dumpを実行します。<dump_file>には出力先ダンプファイル名を、<database>にはバックアップ対象データベース名を指定してください。pg_dump実行前にPGOPTIONS環境変数でencrypt.enableパラメータをoffにすることでユーザデータを暗号化したままの状態でバックアップすることが可能です。

CMD> set PGOPTIONS=-c encrypt.enable=off
CMD> pg_dump -f <dump_file> -Fc <database>

ダンプファイルからリストアリストを作成

ダンプファイルには旧バージョンの透過的暗号化機能への設定が含まれているため、正しくバージョンアップができません。 そこで、旧バージョンの透過的暗号化機能への設定を除いたユーザデータのみをリストアする為のリストアリストを作成します。以下の手順を用いて作成してください。<>でくくられた各変数の意味は以下になります。

  • <dumplist_file> : ダンプファイルに含まれている情報リストの出力先
  • <database> : バックアップしたデータベース名
  • <tdeoperator_list_file> : 透過的暗号化機能のオペレータ情報の出力先
  • <restorelist_file> : ダンプファイルに含まれている情報リストから透過的暗号化機能を除いたリストの出力先
  • <old_version> : 旧バージョンのTransparent Data Encryption for PostgreSQLのバージョン番号
  • <tdeoperator_sql>:<tdeoperator_list_file>を作成するためのSQL文
  • <tdeoperator_sql>の内容:
    \t
    \a
    SELECT a.oid, 
           'OPERATOR', 
           c.nspname , 
           regexp_replace(oprname, '\*','\*'),
           rolname 
      FROM pg_operator a 
      JOIN pg_authid b 
        ON a.oprowner=b.oid 
      JOIN pg_namespace c 
        ON c.oid=a.oprnamespace 
     WHERE a.oprleft in (select oid from pg_type where typname like 'encrypt_%') 
        or a.oprright in (select oid from pg_type where typname like 'encrypt_%') ;
    
CMD> pg_restore -l <dump_file> > <dumplist_file>
CMD> psql -d <database> -f  <tdeoperator_sql> -F " " | ^
More? findstr /R [0-9] > <tdeoperator_list_file>

Transparent Data Encryption 旧バージョンのアンインストール

  1. 「スタートメニュー」 > 「cipher_setup」の実行をクリックします。

  2. 「NEC TDE for PG Free Edition V1.2.1」画面が表示されます。以下の表を参考に各項目を入力し、「Inactivate TDE Feature」をクリックします。

    項目 説明 入力例
    Database Port Number ポート番号 5432
    Database Name データベース名 tdedb
    Database User Name スーパユーザ名 postgres
    Database User Password スーパユーザのパスワード ******
    PostgreSQL Install Folder PostgreSQLがインストールされたフォルダパス C:\Program Files\PostgreSQL\9.6
  3. 「Inactivate confirm」画面が表示されます。「はい」をクリックします。

  4. 入力した情報に問題が無ければ「Inactivate success」ダイアログが表示されます。表示されたメッセージを確認し、「OK」をクリックします。これで指定したデータベースに対して透過的暗号化機能が無効化されます。

  5. コントロールパネルプログラムと機能を選択し、プログラムと機能画面を起動します。

  6. Transparent Data Encryption for PostgreSQL Free Edition (PostgreSQL XX) を右クリックし、「アンインストール」をクリックします。 ※XXはPostgreSQLのメジャーバージョンです。

  7. プログラムと機能ダイアログが起動し、アンインストールを実行するか確認されるので「はい」を選択します。

  8. アンインストールの前に透過的暗号化機能を無効化したか確認するダイアログが表示されるので「はい」を選択します。

  9. 「アンインストールを続行します」と確認するダイアログが表示されるので「OK」をクリックします。

  10. セットアップを完了するためには再起動が必要なことを通知するダイアログが表示されるので「OK」をクリックします。

  11. 必要に応じて、再起動します。

  12. PostgreSQLの設定ファイル(postgresql.conf)のshared_preload_librariesパラメータにTransparent Data Encryption for PostgreSQLのダイナミックリンクライブラリdata_encryption.dllを削除、またはパラメータ自体をコメントアウトします。

    shared_preload_libraries = ''
    
  13. 変更した設定を有効にするため、PostgreSQLを再起動します。

    CMD>sc stop postgresql-x64-9.6
    CMD>sc start postgresql-x64-9.6
    

    サービスとして登録していない場合は、pg_ctlコマンドを利用してPostgreSQLを再起動しています。

    CMD> pg_ctl restart
    

古いデータベースを削除

バックアップが終わったデータベースを削除してください。

CMD> dropdb <database>

データベースを作成

リストア対象のPostgreSQLに透過的暗号化機能用データベースを作成してください。

CMD> createdb <database>

Transparent Data Encryption 新バージョンのインストール

新バージョンの透過的暗号化機能をインストールしてください。インストール手順についてはWindows版インストール手順を参考にしてください。

アップグレード前の暗号鍵を登録

暗号化データを復号するためにアップグレード前の暗号鍵(パスフレーズ)を登録します。

  1. 「スタートメニュー」 > 「cipher_key_registの実行」をクリックします。

  2. 「NEC TDE for PG Free Edition V1.2.1 Cipher Key Regist」画面が表示されます。以下の表を参考に各項目を入力し、「Key Regist」をクリックします。
    TDEforPG_pgtde_regist

項目 説明 入力例
current cipher key 現在の暗号鍵(パスフレーズ) ******
new cipher key 新しい暗号鍵(パスフレーズ) ******
new cipher key algorithm 利用する暗号化アルゴリズム aes
Database Port Number ポート番号 5432
Database Name データベース名 tdedb
Database User Name スーパユーザ名 postgres
Database User Password スーパユーザのパスワード ******
PostgreSQL Install Folder PostgreSQLがインストールされたフォルダパス C:\Program Files\PostgreSQL\9.6

pg_restore コマンドによるダンプファイルのリストア

以下のコマンド例を参考にし、対象DB に対してバックアップファイルをpg_restore を使用してリストアします。オプションなしでリストアを実行するとpublic スキーマに定義された新バージョンの透過的暗号化機能と競合してエラーが発生するため、2で作成したリストアリストを利用してリストアを実行してください。

CMD>findstr /V /G:installed_list_fe_<old_version>.txt ^
More? <dumplist_file> > <restorelist_file_tmp>
CMD>findstr /V /G:<tdeoperator_list_file> ^
More? <restorelist_file_tmp> > <restorelist_file>
CMD>set PGOPTIONS=-c encrypt.enable=off
CMD>pg_restore -d <new_database> -L <restorelist_file> -e <dump_file>

運用

暗号化データ型の列の宣言

暗号化列の定義

透過的暗号化を実現するために、新しくデータ型を定義します。暗号化対象の列のデータ型として使用することで、暗号化処理を意識せずにSQLを発行することが可能になります。

暗号化データ型として「ENCRYPT_TEXT」「ENCRYPT_BYTEA」を提供します。「ENCRYPT_TEXT」はテキスト型データを透過的に暗号化処理するデータ型であり、「ENCRYPT_BYTEA」はバイナリ型データを透過的に暗号化処理するデータ型になります。

ENCRYPT_TEXT 型の列に対してTEXT 型以外の文字列型のデータを挿入する場合、明示的にTEXT型にキャストをする必要があります。また、ENCRYPT_TEXT 型に対するデータの挿入時に、ビット文字列定数(B'01'など)や数値定数(10 など)を指定することはできません。

データ型名 概要
ENCRYPT_TEXT 暗号/復号化されるTEXT型データ
ENCRYPT_BYTEA 暗号/復号化されるBYTEA型データ

COPY文を利用した暗号化データの入出力

COPY文でデータを入出力するとき、BINARY形式を利用することで、暗号化されたままデータを入出力することができます。

【注意事項】

  • COPY文で暗号化されたデータをBINARY形式で出力したあと、暗号鍵を更新すると、出力したデータをテーブルに戻しても暗号鍵が不一致になるため、データを正しく読み込むことができません。

暗号鍵の管理

暗号鍵の登録/更新

透過的暗号化機能を使用するためには、暗号鍵の登録を行う必要があります。暗号鍵は運用する中で、定期的に更新することが可能です。暗号鍵の登録または更新をするためには、本ツールで提供する暗号鍵の登録/更新コマンドを使用します。 暗号鍵を更新すると、現在データベースに格納されている全ての暗号化列を新しく更新された暗号鍵で再暗号化します。

【注意事項】

  • 暗号鍵を更新する前に全てのユーザ接続を切断するかセッション終了関数で全ての透過的暗号化セッションを終了してください。暗号鍵の更新中に挿入・更新した暗号化データ型のレコードは読めなくなる可能性があります。
暗号化アルゴリズム名 概要 暗号化後データサイズ
aes (Rijndael-128) AESで暗号化を行います。 ( ( <元データサイズ> / 16 ) + 1 ) * 16 + 2 + < 長さ情報※> ※ 元データサイズが 111バイトまでは 1 バイト、112 バイト以上は 4 バイト となります。
bf (Blowfish) Blowfishで暗号化を行います。 ( ( <元データサイズ> / 8 ) + 1 ) * 8 + 2 + < 長さ情報※> ※ 元データサイズが 119バイトまでは 1 バイト、120 バイト以上は 4 バイト となります。

暗号鍵の長さ

暗号化・復号に使用される暗号鍵の長さは一般的に長くなるほどセキュリティレベルは向上しますが、性能は遅くなります。 セキュリティ性と性能の両方を考慮した上で適切な暗号鍵の長さを選択してください。 暗号化アルゴリズム別に使用可能な暗号鍵の長さの詳細は以下を参照してください。

  • aes (Rijndael-128)

    • 16byte(128bit) : (暗号鍵長<=16byte)のとき使われます。暗号鍵の長さが16byteより短いときは16byteまでパディングされます。
    • 24byte(198bit) : (16byte<暗号鍵長<=24byte)の時使われます。暗号鍵の長さが24byteより短いときは24byteまでパディングされます。
    • 32byte(256bit) : (24byte<暗号鍵長)の時使われます。暗号鍵の長さが32byteより短いときは32byteまでパディングされます。暗号鍵の長さが32byteを超える場合は32byteを超過した部分の暗号鍵は無視されます。
  • bf (Blowfish)

    • 最大56byte(448bit) : 56byteまでの入力した暗号鍵がそのまま使われます。暗号鍵の長さが56byteを超える場合は56byteを超過した部分の暗号鍵は無視されます。

暗号鍵のバックアップ

本ツールでは、暗号鍵登録・更新モードで追加された暗号鍵を管理しています。鍵情報が壊されるなど何らかの原因で鍵情報を取得できない状態になると、暗号化列を復号化してデータを参照することができなくなってしまいます。この様な状態を避ける為、暗号鍵情報のバックアップを行ってください。 バックアップ方法は暗号鍵バックアップを参照してくだい。

透過的暗号化セッションの開始と終了

透過的暗号化機能を利用するには、本ツールで提供するセッション開始ファンクションを利用する必要があります。セッション開始ファンクションを利用するには、セッション対象で使用している最新の暗号鍵情報が必要になります。詳細はセッション開始をご覧ください。セッションを開始しアプリケーション処理が完了したら、本ツールで提供するセッション終了ファンクションを利用して明示的に終了させる必要があります。詳細はセッション終了をご覧ください。 上記で述べたようにセッション開始ファンクションには、接続対象が使用している暗号鍵情報を渡す必要があります。この際、PostgreSQLサーバのログ出力設定によっては、暗号鍵の内容が`PostgreSQLサーバのログに出力されてしまう可能性があります。このため、本ツールでは現在のログ出力設定を保存して、暗号鍵情報のログ出力を抑制する設定に変更するファンクションを提供します。また、保存したログ出力設定に戻すファンクションを提供します。詳細はログ出無有効化ログ出力有効化をご覧ください。 次にセッションファンクションとログ出力設定ファンクションの使用方法について解説します。

暗号化データ型の利用

本ツールで提供する暗号化データ型の利用方法について解説します。

比較方法

暗号化データ型に対する演算子は、等価演算子のみを提供しています。暗号化データは、暗号化した状態では大小比較が正しく実施できないため、大小比較用の演算子は提供していませんが、TEXTやBYTEA型への暗黙的なキャストを利用することにより復号化してから比較を行います。なお、暗号化データ型の大小比較演算子が存在しないため、暗号化データ型の列をORDER BYやPARTITION BYの対象列に指定する際には、TEXTやBYTEAに明示的なキャストを行う必要があります。 次に暗号化データ型との比較対応表を示します。

比較対象 等価比較 大小比較
リテラル値 リテラル値を暗号化することにより暗号化データ型と比較します。 暗号化データ型を復号化することによりTEXTもしくはBYTEAとして比較します。
TEXT or BYTEA 暗号化データ型を復号化することにより比較します。 暗号化データ型を復号化することによりTEXTもしくはBYTEAとして比較します。
暗号化列 暗号化データ型同士で比較します。 暗号化データ型をそれぞれ復号化することによりTEXTもしくはBYTEAとして比較します。

キャスト

比較方法で示している通り、本ツールで提供する暗号化データ型との比較を実行するためには、キャストする必要があります。本ツールでは「ENCRYPT_TEXT」「ENCRYPT_BYTEA」から「TEXT」「BYTEA」へのキャストを提供します。また、「TEXT」「BYTEA」から「ENCRYPT_TEXT」「ENCRYPT_BYTEA」へのキャストも併せて提供します。暗黙的なキャストを使用することにより、アプリケーションなどはキャストを意識せずに、暗号化データ型との比較を行うことが可能です。

インデックス定義

暗号化データ型のインデックス定義には、ハッシュインデックスのみ使用することが可能です。また、完全一致検索のみをサポートしています。なお、部分インデックスや式インデックスについては現在サポートしていません。

暗号化データ型の定義に関する制限事項

暗号化データ型を下記オブジェクト/制約/ルールで使用することは現在サポートしていません。

暗号化データ型サポート外定義一覧

  • 一時テーブル(TEMP TABLE)
  • 外部データ(FOREIGN TABLE)
  • 主キー制約(PRIMARY KEY)
  • 一意性制約(UNIQUE)
  • 検査制約(CHECK)
  • デフォルト値(DEFAULT)
  • 排他制約(EXCLUDE)
  • 外部キー制約(REFERENCES)
  • ルール(RULE)
  • トリガ(TRIGGER)

通信経路の暗号化

Transparent Data Encryption for PostgreSQLが提供するコマンドやファンクションは暗号鍵を入力として受け付けます。暗号化処理はデータベースサーバ側で実行されるため、暗号鍵の情報や暗号化対象のデータについては平文で通信されることになります。PostgreSQLデータベースへの接続には、ローカル接続もしくはSSL接続の利用を推奨します。

暗号化データ型の論理バックアップ/リストア

pg_dumpを利用した論理バックアップ

以下の実行例を参考にし、対象のDB に対してpg_dump を実行します。<dump file>には出力先ダンプファイル名を、<database>にはバックアップ対象データベース名を指定してください。pg_dump 実行前にPGOPTIONS 環境変数でencrypt.enable パラメータをoff にすることでユーザデータを暗号化したままの状態でバックアップすることが可能です。

$ PGOPTIONS="-c encrypt.enable=off" pg_dump -f <dump file> -Fc <database>

【注意事項】

  • pg_dumpを利用して特定のテーブルのみをバックアップする場合は、cipher_key_tableも同時バックアップしてください。
  • pg_dumpを利用して暗号化されたデータを含むデータベースをバックアップするときは、セッション開始を実行することができないため、暗号化されたデータを復号してバックアップすることは出来ません。

pg_restoreを利用したダのリストア

以下の実行例を参考にし、対象DBに対してバックアップファイルをpg_restoreを使用してリストアします。-aや--data-onlyオプションなどを利用してデータのみリストアする場合は、リストア先データベースに既に透過的暗号化機能が設置されていなければなりません。

$ PGOPTIONS="-c encrypt.enable=off" pg_restore -d <database> -e <dump file>

【注意事項】

  • pg_restoreを利用して暗号鍵の更新前に取得した論理バックアップから特定のテーブルのみリストアする場合、リストアしたデータが読めなくなります。暗号鍵の更新前に取得した論理バックアップから特定のテーブルのみリストアしたい場合はクリーンな環境にcipher_key_tableテーブルごとクリーンな環境にリストアしてください。 以上の理由から暗号鍵を更新するたびに新しいバックアップを取得することをお勧めします。

コマンドリファレンス

コマンド名 機能内容
暗号鍵の登録/更新コマンド 暗号鍵を登録または更新します。

暗号鍵の登録/更新コマンド

コマンド構文

cipher_key_regist.sh <POSTGRESQL_DIR>

概要

透過的暗号化で利用する暗号鍵を登録または更新します。 暗号鍵を更新したときは、新しく更新された暗号鍵で、全ての暗号化列を再暗号化します。

パラメータ情報

  • POSTGRESQL_DIR : PostgreSQLがインストールされているディレクトリ名

接続情報

  • port : PostgreSQLサーバに接続するポート番号
  • user name : 暗号鍵を登録・更新するデータベースの全てのテーブルに対して参照、更新、削除権限があるPostgreSQLのユーザ名
  • password : PostgreSQLのパスワード
  • database name : 新しい暗号鍵を登録・更新するデータベース名

暗号鍵情報

  • current cipher key : 現在の暗号鍵
  • new cipher key : 新しい暗号鍵
  • algorithm : 新しい暗号鍵の暗号化アルゴリズム
    • aesまたはbfを指定することができます

暗号鍵の条件

登録する暗号鍵に空文字を使用することはできません。半角英数字、もしくは以下を除いた記号のみ使用可能です。

  • {「!」,「'」}の同時使用,「\」,「'」,「"」の使用を禁止しています。

注意事項

  • 暗号鍵を更新する前に全てのユーザ接続を切断するかセッション終了関数で全ての透過的暗号化セッションを終了してください。暗号鍵の更新中に挿入・更新した暗号化データ型のレコードは読めなくなる可能性があります。

実行例

暗号鍵の更新およびデータの初期登録

$ sh cipher_key_regist.sh /usr/local/pgsql/
=== 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 : postgres
=== 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
 cipher_key_regist
-------------------
                 1
(1 row)

暗号鍵の更新およびデータの再暗号化

$ sh cipher_key_regist.sh /usr/local/pgsql/
=== 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 : postgres
=== Regist new cipher key ===
Please enter the current 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
INFO:  TDE-I0001 re-encryption of table "public"."bin_enc" was started(01)
CONTEXT:  SQL statement "SELECT cipher_key_reencrypt_data(current_cipher_key, current_cipher_algorithm, cipher_key)"
PL/pgSQL function cipher_key_regist(text,text,text) line 65 at PERFORM
INFO:  TDE-I0002 re-encryption of table "public"."bin_enc" was completed(01)
CONTEXT:  SQL statement "SELECT cipher_key_reencrypt_data(current_cipher_key, current_cipher_algorithm,  cipher_key)"
PL/pgSQL function cipher_key_regist(text,text,text) line 65 at PERFORM
INFO:  TDE-I0001 re-encryption of table "public"."txt_enc" was started(01)
CONTEXT:  SQL statement "SELECT cipher_key_reencrypt_data(current_cipher_key, current_cipher_algorithm, cipher_key)"
PL/pgSQL function cipher_key_regist(text,text,text) line 65 at PERFORM
INFO:  TDE-I0002 re-encryption of table "public"."txt_enc" was completed(01)
CONTEXT:  SQL statement "SELECT cipher_key_reencrypt_data(current_cipher_key, current_cipher_algorithm, cipher_key)"
PL/pgSQL function cipher_key_regist(text,text,text) line 65 at PERFORM
 cipher_key_enable_log
-----------------------
 t
(1 row)

ファンクションリファレンス

機能名 機能内容
ログ出力無効化 ログへの暗号鍵情報出力を抑制します。
セッション開始 透過的暗号化に使用する暗号鍵情報をセッションに設定します。
ログ出力有効化 「ログ出力無効化」により変更されたログ出力設定を元に戻します。
セッション終了 透過的暗号化に使用する暗号鍵情報をセッションからクリアします。
暗号鍵バックアップ 鍵管理機能で管理している暗号鍵情報をバックアップします。

ログ出力無効化

実行ファンクション名

cipher_key_disable_log

ファンクション構文

cipher_key_disable_log()

概要

透過的暗号化を使用するためには、本ツールで提供する「セッション開始」ファンクションを使用する必要があります。「セッション開始」ファンクションを使用するには、接続対象情報と暗号鍵情報を指定します。この際、ログ出力設定によっては、暗号鍵情報がログに出力されてしまう可能性があります。本ファンクションでは、現在のログ出力設定を保存して、ログに暗号鍵情報が出力されないように設定することができます。なお、「セッション開始」ファンクションを実行する前に、本ファンクションを実行する必要があります。

引数

  • なし

戻り値

  • true : 正常終了

注意事項

  • 「セッション開始」ファンクションを実行する際は予め本ファンクションを実行する必要があります。
  • ログ出力無効化中は、実行されるSQL の最初の"("から最後の")"までの全ての文字列がログに出力されないようになります。

実行権限

PostgreSQLの一般ユーザ権限以上

実行例

  • 「cipher_key_disable_log」ファンクションを実行します。

SELECT cipher_key_disable_log()

セッション開始

実行ファンクション名

pgtde_begin_session

ファンクション構文

  • 透過的暗号化機能を適用したDBの場合 pgtde_begin_session(key)

概要

透過的暗号化を使用するためには、本ファンクションにより暗号化に使用する暗号鍵の情報をセッションに設定します。本ファンクションに接続対象の最新の暗号鍵を指定することにより、セッションを開始することができます。

引数

  • key : 透過的暗号化機能を適用したDBに登録されている最新の暗号鍵を指定します。接続対象テナント、ロールグループで透過的暗号化機能を使用している場合には、そのテナント、ロールグループが参加するテナントグループで使用している最新の暗号鍵を指定する必要があります。

戻り値

  • true : 正常終了
  • false : 暗号鍵が未登録の場合

実行権限

  • 透過的暗号化機能を適用したDBの場合 PostgreSQLの一般ユーザ権限以上
  • 透過的暗号化機能とテナント管理機能を適用したDBの場合 PostgreSQLのスーパユーザ権限

実行例

  • 透過的暗号化機能のみを利用している場合(最新の暗号鍵は「key」が登録されています)

SELECT pgtde_begin_session('key')

ログ出力有効化

実行ファンクション名

cipher_key_enable_log

ファンクション構文

cipher_key_enable_log ()

概要

本ファンクションでは、「cipher_key_disable_log」ファンクションで保存したログ出力設定内容を復元することができます。

引数

  • なし

戻り値

  • true : 正常終了

実行権限

PostgreSQLの一般ユーザ権限以上

実行例

  • 「cipher_key_enable_log」ファンクションを実行します。

SELECT cipher_key_enable_log()

セッション終了

実行ファンクション名

pgtde_end_session

ファンクション構文

pgtde_end_session()

概要

本ツールで提供している「セッション開始」ファンクションを使用して開始したセッションを終了することができます。また、本ファンクションは、セッションを終了する際に暗号鍵情報をクリアします。なお、コネクションプール機能を使用している場合には、本ファンクションを使用してセッションを終了しない場合、暗号鍵の情報がメモリ上に残留してしまうので注意が必要です。

引数

  • なし

戻り値

  • true : 正常終了
  • false : セッションを開始していない場合

実行権限

  • 透過的暗号化機能を適用したDBの場合 PostgreSQLの一般ユーザ権限以上
  • 透過的暗号化機能とテナント管理機能を適用したDBの場合 PostgreSQLのスーパユーザ権限

実行例

  • 「pgtde_end_session」ファンクションを実行します。

SELECT pgtde_end_session()

暗号鍵バックアップ

実行ファンクション名

cipher_key_backup

ファンクション構文

cipher_key_backup()

概要

本ツールでは、透過的暗号化機能で使用する暗号鍵を管理しています。暗号鍵情報が何らかの原因で壊れ暗号鍵情報を取得できない状態になると暗号化列を復号化してデータを参照することができなくなります。そのため、暗号鍵情報を本ファンクションを利用して予めバックアップする必要があります。なお、本ツールで提供している暗号鍵登録・更新コマンドを使用した際には、自動的にバックアップが実行されます。本ファンクションで取得したバックアップファイルの保存先は、「バックアップファイル出力設定」オプションで任意の場所に変更することができます。詳細はバックアップファイル出力先設定をご覧ください。

バックアップファイル名

バックアップファイル名は「ck_backup_DB名」になります。また、一世代前のバックアップファイルを「ck_backup_DB名.sv」として残しています。 (注)バックアップファイル名のDB名には、暗号鍵のバックアップを実施したDB名が入ります。

バックアップファイル出力先設定

  • パラメータ名 : encrypt.backup
  • 設定値 : バックアップファイルの保存先ディレクトリパスを指定します。絶対パスで指定してください。指定したディレクトリにはPostgreSQLの起動ユーザにファイル書き込み可能な権限が必要になります。空文字の場合は$PGDATAディレクトリにバックアップファイルが出力されます。
  • 実行例 : 「/backup」にバックアップファイル出力先を変更します。

SET encrypt.backup TO '/backup'

引数

  • なし

戻り値

  • true : 正常終了
  • false : 異常終了

実行権限

PostgreSQLのスーパユーザ権限

実行例

  • 「cipher_key_backup」ファンクションを実行します。

SELECT cipher_key_backup()

メッセージリファレンス

エラーレベル:INFO

  • ログ番号:I0001
    • エラーメッセージ:re-encryption of table “スキーマ名”.”テーブル名” was started
    • 対象機能:cipher_key_regist
    • 出力条件:再暗号化対象のテーブル処理開始時
  • ログ番号:I0002
    • エラーメッセージ:re-encryption of table “スキーマ名”.”テーブル名” was completed
    • 対象機能:cipher_key_regist
    • 出力条件:再暗号化対象のテーブル処理完了時

エラーレベル:ERROR

  • ログ番号:E0002
    • エラーメッセージ:new cipher key is invalid
    • 対象機能:cipher_key_regist
    • 出力条件:新しく登録する暗号鍵にNULLもしくは空文字が指定された場合
  • ログ番号:E0003
    • エラーメッセージ:invalid cipher algorithm "アルゴリズム名"
    • 対象機能: cipher_key_regist
    • 出力条件:指定した暗号アルゴリズムが'aes'、'bf'以外
  • ログ番号:E0008
    • エラーメッセージ:current cipher key is not correct
    • 対象機能:cipher_key_regist
    • 出力条件:暗号鍵を登録しようとしたテナントグループの現在の暗号鍵の指定が正しくない場合
  • ログ番号:E0009
    • エラーメッセージ:too many encryption keys are exists in cipher_key_table
    • 対象機能:cipher_key_regist
    • 出力条件:登録された暗号化鍵が2個以上の場合
  • ログ番号:E0012
    • エラーメッセージ:cipher key is not correct
    • 対象機能:pgtde_begin_session
    • 出力条件:引数に指定した暗号鍵が正しくない
  • ログ番号:E0014
    • エラーメッセージ:could not get data directory path
    • 対象機能:cipher_key_regist, cipher_key_backup
    • 出力条件:encrypt.backupが設定されて無いときに、PostgreSQLのデータディレクトリにバックアップファイルを格納するが、データディレクトリの取得に失敗した場合
    • 対処法:バックアップファイル出力先設定を行ってください
  • ログ番号:E0015
    • エラーメッセージ:could not rename old backup file of cipher key
    • 対象機能:cipher_key_regist, cipher_key_backup
    • 出力条件:暗号鍵テーブルのバックアップ時に、前回のバックアップファイルをリネームしようとしてエラー
    • 対処法:バックアップファイル出力先設定で指定したディレクトリにはPostgreSQLの起動ユーザにファイル書き込み可能な権限が必要になります
  • ログ番号:E0016
    • エラーメッセージ:could not encrypt data, because key was not set
    • 対象機能:暗号化データ型
    • 出力条件:encrypt.enable = onの時に、pgtde_begin_sessionで暗号鍵をセットせずに暗号化データを格納した場合
  • ログ番号:E0017
    • エラーメッセージ:could not decrypt data, because key was not set
    • 対象機能:暗号化データ型
    • 出力条件: encrypt.enable = onの時に、pgtde_begin_sessionで暗号鍵をセットせずに暗号化データを参照した場合

開発サンプル

本章では、本ツールで提供する透過的暗号化機能を利用したテーブルを検索するサンプルコードについて説明します。なお、既存のDBに透過的暗号化機能を正常にセットアップして、データベースに対して暗号鍵が登録されているものとします。

環境構築

サンプルテーブル

サンプルテーブルを作成します。以下の「SampleTable.sql」で示すテーブル定義ファイルを作成し、psqlコマンドの「-f」パラメータに作成したファイルを指定して実行してください。

SampleTable.sql
--Employeeテーブル作成
CREATE TABLE Employee(
 EmployeeID Integer PRIMARY KEY,
 Name TEXT,
 Address ENCRYPT_TEXT,
 TelephoneNumber ENCRYPT_TEXT
);

サンプルデータ

サンプルテーブルにサンプルデータを挿入します。以下の「DataModelA.sql」で示すデータ挿入スクリプトファイルを作成し、psqlコマンドの「-f」パラメータに作成したファイルを指定して実行してください。なお、「cipherkey」には、データベースに設定した最新の暗号鍵を指定してください。

DataModelA.sql
--ログ出力無効化
select cipher_key_disable_log();
--セッション開始
select pgtde_begin_session('cipherkey');
--ログ出力有効化
select cipher_key_enable_log ();
--サンプルデータ挿入
insert into Employee values(1,'従業員1','滋賀','003-0001-0001');
insert into Employee values(2,'従業員2','京都','003-0001-0002');
insert into Employee values(3,'従業員3','大阪','003-0001-0003');
insert into Employee values(4,'従業員4','兵庫','003-0001-0004');
insert into Employee values(5,'従業員5','奈良','003-0001-0005');
insert into Employee values(6,'従業員6','和歌山','003-0001-0006');
insert into Employee values(7,'従業員7','鳥取','003-0002-0001');
insert into Employee values(8,'従業員8','島根','003-0002-0002');
insert into Employee values(9,'従業員9','岡山','003-0002-0003');
insert into Employee values(10,'従業員10','広島','003-0002-0004');
insert into Employee values(11,'従業員11','山口','003-0002-0005');
insert into Employee values(12,'従業員12','徳島','003-0002-0006');
--セッション終了
select pgtde_end_session();

データ検索

「host」、「port」、「databaseName」、「userName」、「password」については、それぞれの環境の値を指定してください。また、「cipherkey」にはデータベースで使用している最新の暗号鍵を指定してください。

サンプルコード
import java.sql.*;
public class PgTdeSample {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        try{
            conn = DriverManager.getConnection(
                    "jdbc:postgresql://host:port/databaseName",
                    "userName", "password");
            stmt = conn.createStatement();
            //ログ出力無効化
            stmt.executeQuery("select cipher_key_disable_log()");
            //セッション開始
            stmt.executeQuery("select pgtde_begin_session('cipherkey')");
            //ログ出力有効化
            stmt.executeQuery("select cipher_key_enable_log()");
            //データの検索をする
            rs = stmt.executeQuery("select * from Employee");
            Integer count = rs.getMetaData().getColumnCount();
            while( rs.next() ){
                for( int i = 1 ; i <= count ; i++ ){
                    System.out.print( rs.getObject(i) );
                    if( i != count )
                        System.out.print(" , ");
                }
                System.out.println();
            }
            rs.close();
            //アクセスを終了する。
            stmt.executeQuery("select pgtde_end_session()");
            stmt.close();
            conn.close();
        }catch(Exception e){
            // 例外処理
            System.err.println(e.getMessage());
        }
    }
}
検索結果
1 , 従業員1 , 滋賀 , 003-0001-0001
2 , 従業員2 , 京都 , 003-0001-0002
3 , 従業員3 , 大阪 , 003-0001-0003
4 , 従業員4 , 兵庫 , 003-0001-0004
5 , 従業員5 , 奈良 , 003-0001-0005
6 , 従業員6 , 和歌山 , 003-0001-0006
7 , 従業員7 , 鳥取 , 003-0002-0001
8 , 従業員8 , 島根 , 003-0002-0002
9 , 従業員9 , 岡山 , 003-0002-0003
10 , 従業員10 , 広島 , 003-0002-0004
11 , 従業員11 , 山口 , 003-0002-0005
12 , 従業員12 , 徳島 , 003-0002-0006

注意制限事項

  • log_statement 設定

    • 本機能はlog_statement が‘all’に設定されている場合には動作いたしません。
  • 暗号化データ型にハッシュインデックス以外のインデックス作成不可

    • 暗号化データ型に設定することができるインデックスはハッシュインデックスのみです。また、暗号鍵バージョンが統一されていない場合、インデックス検索で抽出できない可能性があります。
  • 暗号化データ型を含む式インデックス、部分インデックス未サポート

    • 暗号化データ型の列を使用した式インデックスや部分インデックスについては現在サポートしていません。
  • 暗号化データ型の列に対するORDER BY、PARTITION BY の実施に関する注意事項

    • 暗号化データ型の列をORDER BY、PARTITION BY の対象列に指定する際には、非暗号化データ型に明示的なキャストを行う必要があります。
  • 暗号化データ型の列に対するGROUPING SETS、CUBE、 ROLLUPの適用

    • SETS、CUBE、ROLLUPを使用して複数のグループ化セットを作成し、暗号化データ型の列をその対象列に指定する際には、非暗号化データ型に明示的なキャストを行う必要があります。これはグループ化セットの演算でソートを利用したグループ化が行われる場合があり、暗号化データ型がソート処理をサポートしていないため、当該処理を行えないことに起因しています。この条件に合致する場合、以下のエラーが出力されます。
      ERROR:  operator 0 is not a valid ordering operator
      
  • 暗号化データ型と一部のデータ型を一緒に扱うことが出来ないキーワード

    • UNION、INTERSECT [ALL]、EXCEPT [ALL]、DISTINCT、GROUP BY 句の対象列に、record、 money、 varbit、 tid、 tsquery、 tinterval、bit、tsvector データ型と一緒に 暗号化データ型を扱うことはできません。この場合、暗号化データ型は非暗号化データ型に明示的なキャストを行う必要があります。これは暗号化データ型がハッシュ処理のみをサポートしており、上記データ型がハッシュ処理をサポートしていないため、上記キーワードによる処理が行えないことに起因しています。
      例えばGROUP BY 句において上記条件に合致する場合、以下のエラーが出力されます。
      ERROR: could not implement GROUP BY  
      DETAIL: Some of the datatypes only support hashing, while others only support sorting.
      
  • データ定義に関する制限事項

  • pg_dump/pg_restore の実行

  • 再暗号化実行時の注意事項

    • 暗号鍵の更新による再暗号化は実行時の負荷状況に注意する必要があります。
  • 暗号鍵バックアップ

    • pg_dump 等で論理バックアップを取得する際、リストアで必要になるため暗号化に使用した暗号鍵も併せて保存する必要があります。
  • O/R マッパサポート

    • O/Rマッパで暗号化属性を使うためには専用のJDBCドライバを利用する必要があります。透過的暗号化に対応したJDBCドライバはhttps://github.com/nec-postgres/pgjdbcで取得してください。
  • Transparent Data Encryption for PostgreSQL対応JDBCドライバに関する注意事項

    • 本JDBCドライバを使用してPostgreSQL9.5以降にアクセスする場合、プロトコルバージョン2.0を利用して接続することは現在サポートしていません。
  • EXPLAIN ANALYZE に関する注意事項

    • ANALYZE オプション付きの EXPLAIN は、実際にコマンドを実行して実行時間等を取得しますが、カラムをそのまま出力するようなクエリの場合、データ型の出力処理がスキップされます。そのため、暗号化データ型を含むテーブルの場合、復号処理のオーバヘッドが含まれずに、実際の実行時間とは大きく異なってしまう可能性があります。

      (例) t1 テーブルの c1 列が暗号化されている場合

       EXPLAIN ANALYZE SELECT c1 FROM t1;  
       → 復号処理がスキップされます。  
       EXPLAIN ANALYZE SELECT substring(c1, 1, 3) FROM t1;  
       → substring 関数への適用のため復号処理が実行されます。
      
  • 行単位のセキュリティポリシーの定義に関する注意事項

    • CREATE POLICY構文のUSING句に指定する検査式の文字列は、pg_policiesシステムカタログに記録されます。

      (例)

      CREATE POLICY a_user_select ON test_acl FOR SELECT TO a_user USING ('A' = ANY(acl));  
      testtde=> select qual from pg_policies where tablename = 'test_acl' limit 1;  
                    qual  
      ‐--------------------------------  
      ('A'::encrypt_text = ANY (acl))  
      (1 row)  
      

      暗号化データ型と比較するリテラル文字列は暗号化されずに保存されますのでご注意ください。

  • 透過的暗号化機能におけるサポート対象外のPostgreSQLの機能

    • ロジカルデコーディング
      • Windows版TDEforPGではサポート対象外です。Linux版ではサポートしますが、PostgreSQL 10.3までPostgreSQLの不具合により'cache lookup failed for type' エラーが発生する可能性があります。既に修正パッチがコミュニティにコミットされておりPostgreSQL 10.4以降では本エラーは発生しません。
    • バックグラウンドワーカプロセス
    • サーバプログラミングインタフェース
    • バイナリ書式モード
    • パラレルクエリ(PostgreSQL 9.6以降)
    • CREATE STATISTICS(PostgreSQL 10以降)
    • 宣言的Partitioning(PostgreSQL 10以降)
  • 透過的暗号化機能におけるサポート対象外のPostgreSQLのcontribパッケージ

    • citext
    • fuzzystrmatch
  • サポート対象外のPostgreSQLの手続き言語

    • PL/Tcl
    • PL/Perl
    • PL/Python

リリースノート

release V1.2.1.0

リリース日:2018-07-10

本リリースの変更点は以下の通り。

  • 利用可能環境にWindows Server 2012, Windows Server 2012R2, Windows Server 2016を追加しました。
  • 利用可能バージョンにPostgreSQL9.6, PostgreSQL 10を追加しました。
  • AESによる暗号化および復号の高速化を目的としたCPUの命令セットAES-NIに対応しました。
  • 暗号化データ型の性能が向上されました。

V1.2.1.0へのマイグレーション

  • pg_dump, pg_restoreを利用したデータマイグレーションが必要です。詳細の手順はwikiのマニュアルまたはUPGRADE-GUIDE.TXTを参照してください。

release V1.1.2.0

リリース日:2017-03-10

本リリースの変更点は以下の通り。

  • 利用可能環境にRed Hat Enterprise Linux 7を追加しました。
  • 利用可能バージョンにPostgreSQL9.5を追加しました。
  • cipher_setup.sh: 既にTDE機能を有効化・無効化データベースに対して、再度有効化・無効化した場合の出力と戻り値を、ERROR(戻り値1)からWARNING(戻り値0)に変更しました。
  • cipher_setup.sh: TDE機能を有効化時の処理のセキュリティ強化をしました。

V1.1.2.0へのマイグレーション

  • pg_dump, pg_restoreを利用したデータマイグレーションが必要です。詳細の手順はwikiのマニュアルまたはUPGRADE-GUIDE.TXTを参照してください。

リリースノート

release V1.1.1.1

リリース日:2015-12-10

本リリースの変更点は以下の通り。

  • 内部関数名が衝突する可能性があった問題を修正しました。

V1.1.1.1へのマイグレーション

  • V1.1.1.0からアップグレードする場合、データのマイグレーションは必要ありません。シェアードオブジェクトファイル(.so)を置き換えてからPostgreSQLサーバを再起動して、以下のスクリプトを実行してください。
  • SOURCES/lib/init/cipher_key_function.sql

release V1.1.1.0

リリース日:2015-12-07

本リリースの変更点は以下の通り。

  • 利用可能バージョンにPostgreSQL9.4を追加しました。
  • 暗号鍵の登録時に秘密情報がログに残る可能性があった問題を修正しました。
  • pgtde_begin_session()とcipher_key_regist()の仕様が変更されました。 上記の関数を実行する前には必ずcipher_key_disable_log()を実行する必要があります。
  • cipher_key_disable_log()の仕様が変更されました。 関数を実行すると、ログを停止する代わりに秘密情報をマスキングします。
  • 透過的暗号化機能のバージョン確認関数を追加されました。
  • 暗号化データ型の性能が向上されました。
  • ORM(オブジェクト関係マッピング)ソフトから透過的暗号化機能を利用するための専用JDBCドライバをリリースしました。専用JDBCドライバはhttps://github.com/nec-postgres/pgjdbcから取得してください。

V1.1.1.0へのマイグレーション

  • pg_dump, pg_restoreを利用したデータマイグレーションが必要です。詳細の手順はwikiのマニュアルまたはUPGRADE-GUIDE.TXTを参照してください。

release V1.1.0.0

リリース日:2015-06-05

本リリースの変更点は以下の通り。

  • ENCRYPT_TEXT型のcategoryをTEXT型と同じ'S'に変更し、TEXT型と同等なキャストが出来るように修正しました。これにより ENCRYPT_TEXT型で'||'オペレータを使えない問題、tsquery, tsvectorにキャスト出来ない問題が解決されました。
  • TEXT型からENCRYPT_TEXT型へのキャストをAS ASSIGNMENTに変更しました。
  • search_pathにpublic以外が設定されたとき、pgtde_begin_session/pgtde_end_session関数が失敗する問題を修正
  • 関数変動性の見直しました。これによりSQL実行時に動くオプティマイザへの影響をより良くしています。
  • 暗号化セッション終了時に暗号鍵がメモリ上に残留する可能性がある問題を修正しました。
  • 暗号鍵の長さについて、マニュアルの記載が間違っていたことを修正しました。

V1.1.0.0へのマイグレーション

  • pg_dump, pg_restoreを利用したデータマイグレーションが必要です。詳細の手順はwikiのマニュアルまたはUPGRADE-GUIDE.TXTを参照してください。
Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.