透過的データ暗号化

PostgreSQL では、認証とアクセス制御によって、データベース内のデータは認可されていないデータベースユーザによるアクセスから保護されます。 しかし、データベースサーバの認証とアクセス制御を迂回する攻撃者に対しては、OS ファイルは保護されません。

透過的データ暗号化 (TDE: Transparent Data Encryption) は、データベースに格納するデータを暗号化します。 OS のファイル内のデータが暗号化されているため、たとえそのファイルやディスクが盗まれても、貴重な情報は保護されます。

透過的データ暗号化の特徴

ユーザの意識やアプリケーションの変更なしでデータが透過的に暗号化 / 復号される

データはデータファイルに書き出されるときに暗号化され、読みだされるときに復号されます。 これはデータベースサーバによって自動的に行われるので、ユーザやアプリケーションはキーの管理や暗号化 / 復号の処理を意識する必要はありません。

指定したテーブル空間内のすべてのユーザデータが暗号化される

暗号化を指定する単位はテーブル空間です。 暗号化テーブル空間内に作成されるテーブルとインデックス、一時テーブルと一時インデックスの全体が暗号化されます。 利用者はどのテーブルや列を暗号化するかを考える必要はありません。 そのような細かい単位での暗号化対象の選択は、パッケージ・アプリケーションや過去に構築したカスタム・アプリケーションの導入時には、しばしば不可能あるいは困難です。

バックアップデータも暗号化されている

pgx_dmpallpg_basebackup は、OS ファイルをコピーすることによりバックアップデータを作成します。 そのため、暗号化されたデータのバックアップは暗号化されたままです。 バックアップ・メディアが盗まれても、情報は漏えいから保護されます。

WAL と一時ファイルも自動的に暗号化される

暗号化されたテーブルとインデックスの更新で生成される WAL は、更新対象と同じセキュリティ強度で暗号化されます。 大きな結合やソートを実行するときには、暗号化データは一時ファイルにも暗号化された形で書き出されます。

強力な暗号化アルゴリズムが利用可能

暗号化アルゴリズムとしてAES (Advanced Encryption Standard) を使用します。 AES は 2002 年に米国連邦政府の標準として採用され、世界中で広く使われています。

二層の暗号化キーとキーストア

各テーブル空間には、その中のすべてのデータを暗号化 / 復号するテーブル空間暗号化キーがあります。 テーブル空間暗号化キーは、マスター暗号化キーで暗号化されて保存されます。

マスター暗号化キーは、データベースクラスタに 1 つだけ存在します。 マスター暗号化キーは乱数発生器で生成されるランダムなビット列です。 利用者が指定するパスフレーズに基づいて暗号化され、キーストアに保存されます。 PowerGres Plus は、ファイルベースのキーストアを提供します。 パスフレーズを知らない攻撃者は、キーストアからマスター暗号化キーを読みだすことはできません。

ハードウェアに基づく暗号化 / 復号の高速化

Intel® Xeon® プロセッサの 5600 番台以降に搭載された AES-NI (Advanced Encryption Standard New Instructions) を活用し、暗号化と復号のオーバヘッドを極小化します。 これにより、従来は性能とセキュリティとのトレードオフのために最少限の暗号化対象を選別していた場面でも、アプリケーション全体のデータを暗号化できるようになります。

記憶領域のゼロ・オーバヘッド

テーブルやインデックス、WAL に格納されるデータの大きさは、暗号化しても変わりません。 そのため、追加の見積もりやディスクは不要です。

ストリーミングレプリケーションのサポート

ストリーミングレプリケーションと透過的データ暗号化を組み合わせて使うことができます。 プライマリサーバで暗号化されたデータと WAL は、暗号化されたままスタンバイサーバに転送され、格納されます。

サポートしていないフィーチャ

次のものは将来サポートを検討します。

セットアップ

マスター暗号化キーの設定

透過的データ暗号化を使用するには、キーストアを作成し、マスター暗号化キーを設定する必要があります。 まず、postgresql.confkeystore_location パラメータに、キーストアを格納するディレクトリを設定します。 これにはデータベースクラスタごとに異なる場所を指定する必要があります。 そして、データベースサーバを再起動してください。

keystore_location = '/key/store/location'

次に、下のような SQL 関数を実行してマスター暗号化キーを設定します。 これはスーパーユーザで実行する必要があります。

SELECT pgx_set_master_key('passphrase');

passphrase は今後キーストアをオープンするために使われるパスフレーズです。 マスター暗号化キーはこのパスフレーズによって保護されるため、短く単純で推測されやすい文字列を指定しないよう注意してください。

注意

ここで指定したパスフレーズを忘れてしまうと、暗号化されたデータにはアクセスできなくなります。 忘れたパスフレーズを取り戻したり、データを復号する方法はありません。 決してパスフレーズを忘れないようにしてください。

この SQL 関数は、キーストア格納ディレクトリに keystore.ks というファイルを作成します。 そして、ランダムなビット列からなるマスター暗号化キーを生成し、それを指定されたパスフレーズで暗号化して keystore.ks に格納します。 キーストアはオープンされた状態になります。

キーストアのオープン

暗号化テーブル空間を作成したり暗号化データにアクセスするには、キーストアをオープンしておく必要があります。 キーストアをオープンすると、マスター暗号化キーがデータベースサーバのメモリにロードされ、暗号化と復号に利用できるようになります。

データベースサーバを起動するたびにキーストアをオープンしてください。 キーストアをオープンするには、スーパーユーザが次のように SQL 関数を実行します。

SELECT pgx_open_keystore('passphrase');

ここで、passphrase はキーストアの作成時に指定したパスフレーズです。

データベースサーバの起動時にリカバリが実行される場合、上記の方法ではデータベースサーバを起動できません。 なぜなら、暗号化された WAL を復号する必要があるためです。 この場合には、pgx_open_keystore 関数を実行する代わりに、pg_ctl--keystore-passphrase オプションを指定します。 これはパスフレーズ入力を促すプロンプトを表示します。

$ pg_ctl --keystore-passphrase start
パスフレーズを入力してください:
サーバは起動中です

Windows サービスの起動時にはこの方法は利用できません。 リカバリが必要な場合は、いったんコマンドプロンプトから pg_ctl で非 Windows サービスとして起動・停止するか、または後述の 自動オープン・キーストア を使用してください。

テーブル空間の暗号化

暗号化テーブル空間を作成するには、事前にキーストアがオープンされている必要があります。

暗号化するテーブル空間を作成するときに、実行時パラメータに暗号化アルゴリズムを設定します。 たとえば、暗号化アルゴリズムとしてキー長が 128 ビットの AES を用い、secure_tablespace という名前のテーブル空間を作成するには、次のようにします。

-- 以降に作成するテーブル空間の暗号化アルゴリズムを指定
SET tablespace_encryption_algorithm = 'AES128';
CREATE TABLESPACE secure_tablespace LOCATION '/My/Data/Dir';
-- 以降に作成するテーブル空間は暗号化しないように指定
SET tablespace_encryption_algorithm = 'none';

暗号化アルゴリズムとして、キー長が 128 または 256 ビットの AES を使用できます。 実行時パラメータの指定方法については リファレンス を参照してください。 テーブル空間 pg_default および pg_global を暗号化することはできません。

そして、作成した暗号化テーブル空間にテーブルやインデックスを作成します。 暗号化テーブル空間に作成されたリレーションは自動的に暗号化されます。

例 1: 作成時に暗号化テーブル空間を指定
CREATE TABLE my_table (...)
    TABLESPACE secure_tablespace;
例 2: 作成時にはテーブル空間を明示せず、デフォルト・テーブル空間を使用
SET default_tablespace = 'secure_tablespace';
CREATE TABLE my_table (...);

一時テーブルと一時インデックスを暗号化する場合も同様です。 つまり、TABLESPACE 句を明示的に指定するか、または temp_tablespaces パラメータに暗号化テーブル空間を列挙し、CREATE TEMPORARY TABLECREATE INDEX を実行します。

データベースを作成するときに、CREATE DATABASE 文の TABLESPACE 句に暗号化テーブル空間を指定すると、明示的にテーブル空間を指定しないでそのデータベースに作成されたリレーションは暗号化されます。 さらに、システムカタログも暗号化されるので、ユーザ定義関数のソースコードも保護されます。

暗号化されているテーブル空間の確認

システムビュー pgx_tablespaces は、各テーブル空間が暗号化されているかどうか、および暗号化アルゴリズムについての情報を示します。 列の詳細については リファレンス を参照してください。

次のような SQL 文を実行することで、どのテーブル空間が暗号化されているかを知ることができます。

SELECT spcname, spcencalgo
FROM pg_tablespace ts, pgx_tablespaces tsx
WHERE ts.oid = tsx.spctablespace;

psql で上記 SQL 文を実行したときの出力例を下に示します。

      spcname      | spcencalgo
-------------------+------------
 pg_default        | none
 pg_global         | none
 secure_tablespace | AES256
(3 rows)

キーストアの管理

マスター暗号化キーの変更

同じ暗号化キーを長期間使い続けることは、攻撃者に対して暗号データの解読の機会を与えてしまいます。 一定期間ごと、あるいはキーが危険にさらされたときには、キーを変更することを薦めます。

どのくらいの期間でキーを変更したほうがよいかについては、暗号化アルゴリズムとキー管理についての業界のベストプラクティスに従ってください。 たとえば、米国の NIST が発行している「NIST Special Publication 800-57」があります。 PCI DSS もこれに言及しています。 その中では、マスター暗号化キーは 1 年ごとに一度変更することが推奨されています。

マスター暗号化キーを変更するには、最初に設定したときと同じく pgx_set_master_key 関数を実行します。 マスター暗号化キーを変更したら、直ちにキーストアをバックアップしてください。

キーストアのパスフレーズの変更

組織のセキュリティ・ポリシーでは通常、パスフレーズを知るセキュリティ管理者が異動や退職で職務から外れるときには、パスフレーズを変更することが求められます。 また、万一ソーシャル・エンジニアリングのような手口でパスフレーズが危険にさらされたときには、パスフレーズを変更することを薦めます。

キーストアのパスフレーズを変更するには、スーパーユーザで次のように SQL 関数を実行します。

SELECT pgx_set_keystore_passphrase('old_passphrase', 'new_passphrase');

パスフレーズを変更したら、直ちにキーストアをバックアップしてください。

キーストアの自動オープンの有効化

自動オープン・キーストアを使用すると、パスフレーズを入力することなく、データベースサーバの起動時に自動的にキーストアをオープンできます。 キーストアの自動オープンを有効にするには、次のようにコマンドを実行します。

$ pgx_keystore --enable-auto-open keystore.ks
パスフレーズを入力してください:
キーストアの自動オープンが有効になりました

自動オープンを有効にすると、元のキーストアと同じディレクトリに自動オープン・キーストアが作成されます。 自動オープン・キーストアのファイル名は keystore.aks です。 keystore.aks は、keystore.ks の復号された内容を難読化したコピーです。 このファイルが存在すると、データベースサーバの起動時に、キーストアをオープンするためのパスフレーズを入力する必要はありません。 キーストアの自動オープンを無効にするには、keystore.aks を削除してください。

元のキーストアのファイル keystore.ks を削除しないでください。 マスター暗号化キーやパスフレーズを変更するために必要です。 これらを変更すると、元のキーストアのファイル keystore.ks から keystore.aks が再作成されます。

キーストアを格納したディレクトリ、および keystore.kskeystore.aks は、データベースサーバを起動するユーザのみがアクセスできるように保護してください。 たとえば、Linux では次のようにします。

なお、これらのファイルを作成する SQL 関数およびコマンドは、そのようにファイルの許可モードを設定します。 そのため、ファイルをリストアしたときなどに手動でこのような許可モードを設定してください。

# chown -R postgres:postgres /key/store/location
$ chmod 700 /key/store/location
$ chmod 600 /key/store/location/keystore.ks
$ chmod 600 /key/store/location/keystore.aks

自動オープン・キーストアは、それが作成されたコンピュータでのみオープンします。

リファレンス

実行時パラメータ

keystore_location (string)

キーストアのファイルを格納するディレクトリを指定します。 他のデータベースクラスタとは異なる場所を指定してください。

このパラメータはサーバ起動時のみ設定可能です。

tablespace_encryption_algorithm (enum)

作成するテーブル空間の暗号化アルゴリズムを指定します。 有効な値は AES128AES256、または none です。 none を指定した場合、暗号化は行いません。 デフォルト値は none です。 スーパユーザのみこの設定を変更できます。

クライアントアプリケーション

pg_dumpall

次のオプションを追加しています。

--no-tablespace-encryption

テーブル空間を暗号化するコマンドを出力しません。 生成された SQL スクリプトを実行すると、もともと暗号化されていたデータが暗号化せずにリストアされます。

サーバアプリケーション

pg_ctl

start モードまたは restart モードに次のオプションを指定できます。

--keystore-passphrase

キーストアをオープンするためのパスフレーズの入力を促します。

postgres

シングルユーザモード用のオプションとして、次を追加します。

-K

キーストアをオープンするためのパスフレーズの入力を促します。

pgx_keystore

キーストア自動オープンの有効化

pgx_keystore [option...] keystore_location

このユーティリティは、データベースサーバが稼働中でも停止中でも実行できます。 データベースサーバには接続しません。

オプション
-a
--enable-auto-open

キーストアの自動オープンを有効にします。 これにより、データベースサーバの起動時にパスフレーズを入力しなくても、自動的にキーストアがオープンします。

自動オープンを有効にすると、キーストアのファイル keystore.ks と同じディレクトリに、難読化されたコピーである keystore.aks が作成されます。 自動オープンを無効にするには keystore.aks を削除してください。

例えば、以下のように実行します。

$ pgx_keystore -a /key/store/location/keystore.ks
-P passphrase
--passphrase=passphrase

キーストアをオープンするために使用しているパスフレーズを指定します。 このオプションを省略すると、パスフレーズを入力するためのプロンプトが表示されます。

keystore_location

キーストアのファイルの場所を絶対パスまたは相対パスで指定します。

システム管理関数

名前 戻り型 説明
pgx_open_keystore(passphrase text) void キーストアをオープンする
pgx_set_master_key(passphrase text) void マスター暗号化キーを設定する
pgx_set_keystore_passphrase(old_passphrase text, new_passphrase text) void キーストアのパスフレーズを変更する
pgx_open_keystore

指定したパスフレーズを使ってキーストアをオープンします。

キーストアをオープンすると、マスター暗号化キーがデータベースサーバのメモリにロードされます。 これにより、暗号化データへのアクセスや暗号化テーブル空間の作成ができます。 キーストアがすでにオープンしている場合、この関数はエラーを報告します。 スーパーユーザのみがこの関数を実行可能です。 また、トランザクションブロック内でこの関数を実行することはできません。

pgx_set_master_key

マスター暗号化キーを生成してキーストアに格納します。

キーストアがまだ存在しない場合、キーストアを作成します。 すでにキーストアが存在する場合、マスター暗号化キーを変更します。 もしキーストアがオープンされていなければ、キーストアがオープンされます。 パスフレーズは 8 〜 200 バイトの文字列です。 スーパーユーザのみがこの関数を実行可能です。 また、トランザクションブロック内でこの関数を実行することはできません。 キーストアはオープンしていてもオープンしていなくてもかまいません。

pgx_set_keystore_passphrase

キーストアのパスフレーズを変更します。

old_passphrase には現在のパスフレーズを、new_passphrase には新しいパスフレーズを指定します。 パスフレーズは 8 〜 200 バイトの文字列です。 スーパーユーザのみがこの関数を実行可能です。 また、トランザクションブロック内でこの関数を実行することはできません。 キーストアはオープンしていてもオープンしていなくてもかまいません。

システムビュー

pgx_tablespaces

pgx_tablespaces カタログはテーブル空間の暗号化に関する情報を提供します。

名前 参照先 説明
spctablespace oid pg_tablespace.oid テーブル空間の OID
spcencalgo text テーブル空間の暗号化アルゴリズム

spcencalgo 列は次のいずれかの値を示します。

none テーブル空間は暗号化されていません
AES128 キー長 128 ビットの AES
AES256 キー長 256 ビットの AES