Transparent Data Encryption (TDE)#
重要
TDEは、それをサポートするオペランドでのみ使用できます。EPASおよびPG Extended、バージョン15以降。
Transparent Data EncryptionTDEは、 保存データ 、つまりディスク上のデータベースファイルを暗号化するために複数のデータベースベンダーが使用しているテクノロジーです。ただし、TDEは使用中のデータを暗号化しません。
TDEは、バージョン15からEDB Postgres Advanced ServerおよびEDB Postgres Extended Serverに含まれ、 EDB Postgres for Kubernetesオペレーターによってサポートされています。
重要
続行する前に、時間をかけて TDE feature in the EPAS documentation を理解してください。
TDEをアクティブにすると、WALファイルとテーブルのファイルの両方が暗号化されます。データの暗号化/復号化は、アプリケーションの変更やクライアントドライバーの更新を必要とせずにデータベースによって管理されるため、ユーザーに対して完全に透過的です。
注釈
以下に示すコードサンプルでは、 YAMLマニフェストの`postgresql` の`epas` サブセクションを使用してTDEをアクティブにします。 epas セクションを使用して、PG拡張イメージおよびEPASイメージのTDEを有効にできます。
EDB Postgres for Kubernetesは、TDEを使用する3つの方法を提供します
パスフレーズを含むシークレットを使用する
カスタムパスフレーズコマンドを含むシークレットを使用する
カスタムwrap/unwrapコマンドを含むシークレットのペアを使用する
パスフレーズシークレット#
基本的なアプローチは、パスフレーズをKubernetesシークレットに保存することです。このようなパスフレーズは、EPASバイナリキーの暗号化に使用されます。
参考
the EPAS documentation を参照してください。
EPAS暗号化キーの詳細については、
オペレーターでTDEをアクティブにするのは簡単です。マニフェストのepas
セクションで、 tde
スタンザを使用してTDEを有効にし、TDE暗号化キーを保持するKubernetesシークレットを設定します。
例
[…]
postgresql:
epas:
tde:
enabled: true
secretKeyRef:
name: tde-key
key: key
に例があります。
- --
apiVersion: v1
kind: Secret
metadata:
name: tde-key
data:
key: bG9zcG9sbGl0b3NkaWNlbnBpb3Bpb3Bpb2N1YW5kb3RpZW5lbmhhbWJyZWN1YW5kb3RpZW5lbmZyaW8=
- --
apiVersion: postgresql.k8s.enterprisedb.io/v1
kind: Cluster
metadata:
name: cluster-example
spec:
instances: 3
imageName: docker.enterprisedb.com/k8s_enterprise/edb-postgres-advanced:16
postgresql:
epas:
tde:
enabled: true
secretKeyRef:
name: tde-key
key: key
storage:
size: 1Gi
注釈
このファイルには、暗号化キーを保持するためのシークレットの定義も含まれています。この目的でシークレットを作成する方法に関する例については、次のセクションを参照してください。
シークレットに保存されているキーは、openssl
を呼び出してEPAS暗号化キーをラップ/ラップ解除するためのパスフレーズとして使用されます。
パスフレーズを含むシークレットを作成する方法#
最初にパスフレーズを選択します。ランダムに生成されたパスフレーズを使用することをお勧めしますが、この例では、パスフレーズとしてPostgresRocks
を使用し、kubectl に依存してシークレット定義を生成します。
kubectl create secret generic -o yaml tde-key \
--from-literal=key=PostgresRocks
これにより、次のようなものが返されます。
apiVersion: v1
data:
key: UG9zdGdyZXNSb2Nrcw==
kind: Secret
metadata:
creationTimestamp: "YYYY-MM-DDTHH:MM:SSZ"
name: tde-key
namespace: default
resourceVersion: ....
uid: ....
type: Opaque
クラスター内にシークレットを実際に作成するには、 kubectl apply
を実行するか、上記のcreate コマンドの-o yaml
オプションを削除してください。
カスタムパスフレーズコマンド#
上記のクラスターマニフェストスニペットのsecretKeyRef
の代わりに、シークレットに保存されているpassphraseCommand
を指定できます。 passphraseコマンドを実行して、openssl
で使用するパスフレーズを生成できます。
[…]
postgresql:
epas:
tde:
enabled: true
passphraseCommand:
name: tde-passphrase
key: command
passphraseコマンドは標準出力に書き込む必要があります。たとえば、単にecho my-passphrase
を使用できます。
コマンドによって生成されたパスフレーズは、secretKeyRefが使用されたのと同じ方法、つまりopenssl
のパスフレーズ引数として使用されます。
カスタムwrap/unwrapコマンド#
openssl
のデフォルトの呼び出しに依存するのではなく、wrapおよびunwrapコマンドを指定することもできます。これは、カスタムコマンドを含むシークレットを作成し、
tde スタンザでこれらのシークレットを宣言することにより実行できます。
次のスニペットは、カスタムコマンドを使用してTDEが有効になっているクラスターを示しています。
[…]
postgresql:
epas:
tde:
enabled: true
wrapCommand:
name: tde-wrap-command
key: command
unwrapCommand:
name: tde-unwrap-command
key: command
カスタムコマンドは、次の規則に従う必要があります。
カスタムwrapコマンドは、EPASがバイナリキーをフィードするために使用する標準入力からの入力を受け入れる必要があります。明示的な引数シェルのリダイレクトではなくを介してファイルに書き込む必要があります。さらに、 file引数には文字列「%p」を指定する必要があります。これは、EPASが新しいラップされた暗号化キーファイルのファイルパスを渡すために使用するプレースホルダーです。
custom unwrapコマンドは、標準出力に書き込む必要があります。入力には明示的なファイルパス引数が必要ですシェルリダイレクトではありません。繰り返しますが、 file引数には文字列「%p」を指定する必要があります。これは、EPASがラップされた暗号化キーファイルパスで埋められるプレースホルダーです。
例
Wrapコマンド
openssl enc -aes-128-cbc -pass pass:temp-pass -e -out %punwrapコマンド
openssl enc -aes-128-cbc -pass pass:temp-pass -d -in %p
HashiCorp Vaultを使用した例#
次の例は、 HashiCorp
Vaultを使用して暗号化キーを保存し、それを使用してTDEをアクティブにする方法を示しています。
vault CLIは、Vaultと対話するために使用され、デフォルトでEDB Postgres
Advanced Serverイメージに含まれています。
まず、ボールトを実行している場所はどこでも、Transit Secretsエンジンを有効にし、キーを作成する必要があります。
vault secrets enable transit
vault write -f transit/keys/pg-tde
次に、カスタムwrap/unwrapコマンドを含むシークレットを作成します。 Wrapおよびunwrapコマンドは、EPASイメージにあるバイナリを「ラップ」します。バイナリはvault APIと対話して、EPAS暗号化を暗号化/復号化します。
バイナリには、4つのフラグ--host 、--secret 、--key
、および--vault-endpoint が必要です。 --host
フラグはhttp://vault-host:vault-port
のフォーマットであり、Vaultに到達するには提供する必要があります。
server--secret
フラグは、ボールトトークンを含むKubernetesシークレットの名前であり、
--key
フラグは、ボールトトークンをポイントするそのシークレットのキーです。
--vault-endpoint
フラグは、ボールト内で作成されたキーの名前です。上記の例では、pg-tde
です。
KubernetesでVaultオペレーターを実行している場合、次の2つのコマンドからルートトークンを取得できます。
kubectl exec vault-0 -- vault operator init -key-shares=1 -key-threshold=1 -format=json > cluster-keys.json
cat cluster-keys.json | jq -r ".root_token"
kubectl create secret generic -o yaml vault-token \
--from-literal=wrap="/bin/vault wrap --file %p --host http://vault:8200 --secret vault-token --key token --vault-endpoint pg-tde" \
--from-literal=unwrap="/bin/vault unwrap --file %p --host http://vault:8200 --secret vault-token --key token --vault-endpoint pg-tde" \
--from-literal=token="hvs.whatever"
これで、シークレットを参照するクラスターを作成できます。
apiVersion: postgresql.k8s.enterprisedb.io/v1
kind: Cluster
metadata:
name: hashicorp-vault-tde
spec:
instances: 3
storage:
size: 1Gi
postgresql:
epas:
tde:
enabled: true
wrapCommand:
name: vault-token
key: wrap
unwrapCommand:
name: vault-token
key: unwrap