透過的データ暗号化
PostgreSQL では、認証とアクセス制御によって、データベース内のデータは認可されていないデータベースユーザによるアクセスから保護されます。 しかし、データベースサーバの認証とアクセス制御を迂回する攻撃者に対しては、OS ファイルは保護されません。
透過的データ暗号化 (TDE: Transparent Data Encryption) は、データベースに格納するデータを暗号化します。 OS のファイル内のデータが暗号化されているため、たとえそのファイルやディスクが盗まれても、貴重な情報は保護されます。 TDE には次の特徴があります。
- ユーザの意識やアプリケーションの変更なしでデータが透過的に暗号化 / 復号される
- 指定したテーブル空間内のすべてのユーザデータが暗号化される
- バックアップデータも暗号化されている
- WAL と一時ファイルも自動的に暗号化される
- 強力な暗号化アルゴリズムが利用可能
- 二層の暗号化キーとキーストア
- ハードウェアに基づく暗号化 / 復号の高速化
- 記憶領域のゼロ・オーバヘッド
- ストリーミングレプリケーションのサポート
マスター暗号化キーの設定
透過的データ暗号化を使用するには、キーストアを作成し、マスター暗号化キーを設定する必要があります。 まず、postgresql.conf の keystore_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 TABLE や CREATE INDEX を実行します。
データベースを作成するときに、CREATE DATABASE 文の TABLESPACE 句に暗号化テーブル空間を指定すると、明示的にテーブル空間を指定しないでそのデータベースに作成されたリレーションは暗号化されます。 さらに、システムカタログも暗号化されるので、ユーザ定義関数のソースコードも保護されます。
暗号化されているテーブル空間の確認
システムビュー pgx_tablespaces は、各テーブル空間が暗号化されているかどうか、および暗号化アルゴリズムについての情報を示します。 列の詳細については リファレンス を参照してください。
次のような SQL 文を実行することで、どのテーブル空間が暗号化されているかを知ることができます。
SELECT spcname, spcencalgo, spclocation FROM pg_tablespace ts, pgx_tablespaces tsx WHERE ts.oid = tsx.spctablespace;
キーストアの管理
マスター暗号化キーの変更
同じ暗号化キーを長期間使い続けることは、攻撃者に対して暗号データの解読の機会を与えてしまいます。 一定期間ごと、あるいはキーが危険にさらされたときには、キーを変更することを薦めます。
どのくらいの期間でキーを変更したほうがよいかについては、暗号化アルゴリズムとキー管理についての業界のベストプラクティスに従ってください。 たとえば、米国の 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.ks と keystore.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
自動オープン・キーストアは、それが作成されたコンピュータでのみオープンします。
サポートしていないフィーチャ
次のものは将来サポートを検討します。
- HSM (ハードウェア・セキュリティ・モジュール) による堅牢なキー管理
- GIN インデックスの WAL の暗号化: GIN インデックスが格納されたデータファイルは暗号化されますが、その更新により生成される WAL は暗号化されません。
- pg_dump および pg_dumpall の出力ファイルの暗号化
- COPY コマンドの出力ファイルの暗号化
- LISTEN / NOTIFY コマンドでやりとりする通知イベントのペイロードの暗号化
リファレンス
実行時パラメータ
- keystore_location (string)
-
キーストアのファイルを格納するディレクトリを指定します。 他のデータベースクラスタとは異なる場所を指定してください。 このパラメータはサーバ起動時のみ設定可能です。
- tablespace_encryption_algorithm (enum)
-
作成するテーブル空間の暗号化アルゴリズムを指定します。 有効な値は AES128、AES256、または none です。 none を指定した場合、暗号化は行いません。 デフォルト値は none です。 スーパユーザのみこの設定を変更できます。
クライアントアプリケーション
pg_dumpall
次のオプションを追加します。
- --no-tablespace-encryption
-
テーブル空間を暗号化するコマンドを出力しません。 生成された SQL スクリプトを実行すると、もともと暗号化されていたデータが暗号化せずにリストアされます。
サーバアプリケーション
pg_ctl
start モードまたは restart モードに次のオプションを指定できます。
- --keystore-passphrase
-
キーストアをオープンするためのパスフレーズの入力を促します。
postgres
シングルユーザモード用のオプションとして、次を追加します。
- -K
-
キーストアをオープンするためのパスフレーズの入力を促します。
pgx_keystore
名前
pgx_keystore – キーストアを管理する
概要
pgx_keystore [option...] keystore_location
説明
pgx_keystore はキーストアの自動オープンの有効化を行います。
オプション
- -a
--enable-auto-open -
キーストアの自動オープンを有効にします。 これにより、データベースサーバの起動時にパスフレーズを入力しなくても、自動的にキーストアがオープンします。
自動オープンを有効にすると、キーストアのファイル keystore.ks と同じディレクトリに、難読化されたコピーである keystore.aks が作成されます。 自動オープンを無効にするには keystore.aks を削除してください。
- -P passphrase
--passphrase=passphrase -
キーストアをオープンするために使用しているパスフレーズを指定します。 このオプションを省略すると、パスフレーズを入力するためのプロンプトが表示されます。
- keystore_location
-
キーストアのファイルの場所を絶対パスまたは相対パスで指定します。
診断
0: | 正常終了 |
0 以外: | 異常終了 |
注釈
このユーティリティは、データベースサーバが稼働中でも停止中でも実行できます。 データベースサーバには接続しません。
例
キーストアの自動オープンを有効にします。
$ pgx_keystore -a /key/store/location/keystore.ks
システム管理関数
名前 | 戻り型 | 説明 |
---|---|---|
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 |