Securing the data encryption key¶
透過的なデータ暗号化のキー(データキー)は、通常initdb
によって生成され、dataディレクトリの下のファイル
pg_encryption/key.bin
に保存されます。このファイルには、実際には実行時にさまざまな目的で使用されるいくつかのキーが含まれています。ただし、データキーに関しては、単一のランダムバイトシーケンスが含まれています。
さらにアクションを行わないと、このファイルには安全ではないプレーンテキストのキーが含まれています。暗号化されたデータディレクトリにアクセスできる人は誰でも平文のキーにアクセスできますが、これは暗号化の目的に反します。したがって、このセットアップはテスト目的のみに適しています。
データキーを適切に保護するには、別のキーで暗号化して「ラップ」します。大まかに、これを調整するには2つのアプローチを使用できます。
データキーをパスフレーズで保護します。ラッピングキーはパスフレーズから取得され、データキーの暗号化に使用されます。
ラッピング鍵は、キーストアとも呼ばれるキー管理システムなど、他の場所に保存されています。この2番目のキーは、キーラッピングキーまたはマスターキーとも呼ばれます。
テストなどでキーのラッピングが必要ない場合は、 wrapコマンドとunwrapコマンドを空の文字列に設定する必要があります。この設定は、さらに処理せずにファイルのキーを使用することを指定します。このアプローチは、 wrapまたはunwrapコマンドをまったく設定しないこととは異なります。透過的なデータ暗号化が使用されているときにwrapまたはunwrapコマンドを設定しないと、影響を受けるユーティリティプログラムの実行時に致命的なエラーが発生します。
Postgresはこの構成をユーザーに任せるため、ローカルの要件に合わせてセットアップを調整し、既存のキー管理ソフトウェアなどと統合できます。データキー保護を構成するには、ラッピング(暗号化)とアンラッピング(復号化)を行う一対の外部コマンドを指定する必要があります。
パスフレーズの使用¶
opensslコマンドラインユーティリティを使用して、パスフレーズでデータキーを保護できます。以下は、この保護を設定する例です。
initdb -D datadir -y --key-wrap-command=openssl enc -e -aes128-wrap -pbkdf2 -out "%p" --key-unwrap-command=openssl enc -d -aes128-wrap -pbkdf2 -in "%p"
この例では、ランダムに生成されたデータキー(initdbによって内部的に実行)を、
AES-128-WRAP
(AESKW)アルゴリズムを使用して暗号化することによりラップします。暗号化には、PBKDF2キー導出関数とランダムに生成されたソルトを使用してパスフレーズから導出されたキーが使用されます。ターミナルはパスフレーズの入力を求めます。
(これらのオプションの詳細については、openssl-encのマニュアルページを参照してください。使用可能なオプションはバージョンによって異なります。)プレースホルダー
%p は、ラップされたキーを保存するファイルの名前に置き換えられます。
unwrap コマンドは逆の操作を実行します。
initdbにはアンラップ操作は必要ありません。ただし、起動時に使用する初期化されたクラスターのpostgresql.conf
ファイルに保存します。
注釈
サーバーがpg_ctlまたはsystemdなどのサービスマネージャーを介して起動された場合、端末でパスワードの入力を求めるキーのラップ解除コマンドが機能しません。これらの環境では、サーバーは端末から切断されます。サーバーの起動時に対話型のパスワードプロンプトが必要な場合は、systemd-ask-passwordを使用するなど、より複雑な構成が必要です。
key
wrapコマンドは標準入力でプレーンテキストキーを受け取り、ラップされたキーを%p
プレースホルダーで指定されたファイルシステムの場所に配置する必要があります。
key unwrapコマンドは、 %p
プレースホルダーで指定されたファイルシステムの場所からラップされたキーを読み取り、アンラップされたキーを標準出力に書き込む必要があります。
pg_rewindやpg_upgradeなどのユーティリティプログラムは、データディレクトリまたはバックアップなどのコピーを直接操作します。これらのプログラムは、状況に応じて、key unwrapコマンドについても通知する必要があります。これらにはそれぞれ、この目的のためのコマンドラインオプションがあります。
操作を簡素化するために、環境変数にキーのラップコマンドとラップ解除コマンドを設定することもできます。これらは、対応するコマンドラインオプションを指定しない場合、影響を受けるすべてのアプリケーションで受け入れられます。例:
PGDATAKEYWRAPCMD=openssl enc -e -aes128-wrap -pbkdf2 -out "%p"
PGDATAKEYUNWRAPCMD=openssl enc -d -aes128-wrap -pbkdf2 -in "%p"
export PGDATAKEYWRAPCMD PGDATAKEYUNWRAPCMD
キーストアの使用¶
外部のキー管理システムのキーストアを使用して、データ暗号化キーを管理できます。テスト済みでサポートされているキーストアは次のとおりです。
Amazon AWS Key Management Service (KMS)
Google Cloud - Cloud Kay Management Service
Microsoft Azure Key Vault
タレス暗号トラストマネージャー
AWS Key Management Serviceの例¶
AWS Key Management Service でキーを作成します。
aws kms create-key
aws kms create-alias --alias-name alias/pg-tde-master-1 --target-key-id "..."
alias/pg-tde-master-1 キーを指定してaws kms
コマンドを使用して、データ暗号化キーをラップおよびアンラップします。
PGDATAKEYWRAPCMD=aws kms encrypt --key-id alias/pg-tde-master-1 --plaintext fileb:///dev/stdin --output text --query CiphertextBlob | base64 -d > "%p"
PGDATAKEYUNWRAPCMD=aws kms decrypt --key-id alias/pg-tde-master-1 --ciphertext-blob fileb://"%p" --output text --query Plaintext | base64 -d
注釈
この例のように、パイプを使用したシェルコマンドには問題があります。パイプの終了ステータスは最後のコマンドの終了ステータスであるためです。最初のより興味深いコマンドの失敗は、適切に報告されません。 Postgresは、 wrapまたはunwrapコマンドが何も書いていないかどうかを認識することにより、これをいくらか処理します。ただし、これをより堅牢にすることをお勧めします。たとえば、一部のシェルで使用可能な`pipefail` オプション、または一部のオペレーティングシステムで使用可能な`mispipe` コマンドを使用します。より複雑なコマンドをインラインで定義するのではなく、外部シェルスクリプトまたは他のプログラムに配置します。
または、 crypt utility を使用して、データ暗号化キーをラップおよびラップ解除できます。
PGDATAKEYWRAPCMD=crypt encrypt aws --out %p --region us-east-1 --kms alias/pg-tde-master-1
PGDATAKEYUNWRAPCMD=crypt decrypt aws --in %p --region us-east-1
Azure Key Vaultの例¶
Azure Key Vault でキーを作成します。
az keyvault key create --vault-name pg-tde --name pg-tde-master-1
pg-tde-master-1 キーを指定してaz keyvault
コマンドを使用して、データ暗号化キーをラップおよびアンラップします。
PGDATAKEYWRAPCMD=crypt encrypt azure --vaultURL https://pg-tde.vault.azure.net --name pg-tde-master-1 --version fa2bf368449e432085318c5bf666754c --out %p
PGDATAKEYUNWRAPCMD=crypt decrypt azure --vaultURL https://pg-tde.vault.azure.net --name pg-tde-master-1 --version fa2bf368449e432085318c5bf666754c --in %p
この例では、 Securing the data encryption key を使用します。一部の機能がないため、この目的で Azure CLI を直接使用することはできません。
Google Cloud KMSの例¶
Google Cloud KMSでキーを作成します。
gcloud kms keys create pg-tde-master-1 --location=global --keyring=pg-tde --purpose=encryption
pg-tde-master-1 キーを指定してaz keyvault
コマンドを使用して、データ暗号化キーをラップおよびアンラップします。
PGDATAKEYWRAPCMD=gcloud kms encrypt --plaintext-file=- --ciphertext-file=%p --location=global --keyring=pg-tde --key=pg-tde-master-1
PGDATAKEYUNWRAPCMD=gcloud kms decrypt --plaintext-file=- --ciphertext-file=%p --location=global --keyring=pg-tde --key=pg-tde-master-1
または、 crypt utility を使用して、データ暗号化キーをラップおよびラップ解除できます。
PGDATAKEYWRAPCMD=crypt encrypt gcp --out=%p --location=global --keyring=pg-tde --key=pg-tde-master-1 --project your-project-123456
PGDATAKEYUNWRAPCMD=crypt decrypt gcp --in=%p --location=global --keyring=pg-tde --key=pg-tde-master-1 --project your-project-123456