第2章 Record Encryption フィルター用の HashiCorp Vault の準備
OpenShift クラスターで Record Encryption フィルターを使用して Vault を使用するには、Vault インスタンスに対して次の設定を使用します。
- Record Encryption フィルターは Transit Engine の API に依存しているため、Transit Engine を有効にします。
- エンベロープ暗号化用の Data Encryption Keys (DEK) を生成および復号化する権限を持つ、フィルター専用の Vault ポリシーを作成します。
- フィルターポリシーを含む Vault トークンを取得します。
プロキシーのデプロイメント設定では、Vault Transit Engine サービスの URL が使用されます。
Vault は、既存のインスタンス、クラウドインスタンス、または OpenShift 上にデプロイできます。プロキシーにアクセスできる場合は、Streams for Apache Kafka Proxy と同じ場所に配置することも、リモートでデプロイすることもできます。
OpenShift に Vault をインストールし、アクセスを設定する方法については、HashiCorp Vault 製品のドキュメントを参照してください。
この手順では、Vault を準備するための 2 つのオプションを説明します。
- Streams for Apache Kafka Proxy に付属する一時的なデプロイメント設定の例を使用して、Helm で Vault を OpenShift クラスターにデプロイします。
- 既存の Vault インスタンスを更新しています。
Vault インスタンスを準備したら、Record Encryption フィルター用の Vault ポリシーとトークンを作成する必要があります。
サンプルのデプロイメント設定は、実稼働環境には適していません。
Streams for Apache Kafka には、examples/proxy/record-encryption/vault
フォルダーにサンプルのインストールアーティファクトが含まれています。このフォルダーには、プロキシーおよび Record Encryption フィルターと互換性のある事前設定済みの Vault デプロイメントファイルが含まれています。
-
amqstreams_proxy_encryption_filter_policy.hcl
は、Record Encryption フィルターの Vault ポリシーを定義します。 -
helm-dev-values.yaml
は、Vault の Helm デプロイメント設定を指定します。
これらのインストールファイルは、プロキシーを試すための簡単なセットアップを提供します。
前提条件
-
インストール用に
system:admin
などのcluster-admin
ロールを持つ OpenShift ユーザーを用意する。 -
oc
コマンドラインツールがインストールされ、管理者権限で OpenShift クラスターに接続するように設定されている。 -
Helm
コマンドラインツールがインストールされ、管理者権限で OpenShift クラスターに接続するように設定されている。 -
proxy
と呼ばれる OpenShift プロジェクトの namespace。これは、プロキシーがデフォルトでインストールされている namespace と同じである。
この手順で使用される oc
および Helm
コマンドラインオプションの詳細は、--help
を参照してください。
Helm デプロイメント設定の例を使用した Vault のデプロイ
Streams for Apache Kafka Proxy インストールアーティファクトをダウンロードして展開します。
プロキシーは、Streams for Apache Kafka ソフトウェアダウンロードページ から入手できます。
ファイルには、Vault をデプロイするために必要なデプロイメント設定が含まれています。
ルートトークンを作成し、メモしておきます。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 > vault.root.token export VAULT_TOKEN=$(cat vault.root.token)
cat /dev/urandom | LC_ALL=C tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1 > vault.root.token export VAULT_TOKEN=$(cat vault.root.token)
Helm を使用して Vault をインストールします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow helm repo add hashicorp https://helm.releases.hashicorp.com helm install vault hashicorp/vault \ --create-namespace --namespace=vault \ --version <helm_version> \ --values vault/helm-dev-values.yaml \ --set server.dev.devRootToken=${VAULT_TOKEN} \ --wait
helm repo add hashicorp https://helm.releases.hashicorp.com helm install vault hashicorp/vault \ --create-namespace --namespace=vault \ --version <helm_version> \ --values vault/helm-dev-values.yaml \ --set server.dev.devRootToken=${VAULT_TOKEN} \ --wait
root トークンは Vault インスタンスに使用されます。
デプロイメントのステータスを確認します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods -n vault
oc get pods -n vault
デプロイメント名と準備状態が表示されている出力
Copy to Clipboard Copied! Toggle word wrap Toggle overflow NAME READY STATUS RESTARTS vault-0 1/1 Running 0
NAME READY STATUS RESTARTS vault-0 1/1 Running 0
Pod ID は、作成された Pod を識別します。
デフォルトのデプロイメントでは、単一のプロキシー Pod をインストールします。
READY は、ready/expected 状態のレプリカ数を表示します。STATUS が Running と表示されれば、デプロイメントは成功です。
新しい Vault インスタンスを指す Vault アドレス (
VAULT_ADDR
) 環境変数を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow export VAULT_ADDR=$(oc get route -n vault vault --template='https://{{.spec.host}}')
export VAULT_ADDR=$(oc get route -n vault vault --template='https://{{.spec.host}}')
管理者として Vault にログインし、Vault Transit シークレットエンジンを有効にします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault secrets enable transit
vault secrets enable transit
シークレットエンジンがすでに有効になっている場合は、エラーを無視します。
Vault Transit アドレスを指す環境変数を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/transit
export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/transit
アドレスはプロキシーデプロイメント設定で使用されます。
- Vault ポリシーとトークンを作成します。
独自の Vault インスタンスの設定
すでに Kafka インスタンスがインストールされている場合は、それを更新して Streams for Apache Kafka Proxy で使用できます。
Vault インスタンスを指す Vault アドレス環境変数 (Enterprise を使用している場合は
VAULT_ADDR
とVAULT_NAMESPACE
) を作成します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow export VAULT_ADDR=https://<vault server>:8200 export VAULT_NAMESPACE=<namespaces>
export VAULT_ADDR=https://<vault server>:8200 export VAULT_NAMESPACE=<namespaces>
管理者として Vault にログインし、Vault Transit シークレットエンジンを有効にします。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault secrets enable transit
vault secrets enable transit
シークレットエンジンがすでに有効になっている場合は、エラーを無視します。
Vault Transit アドレスを指す環境変数を作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/${VAULT_NAMESPACE}/transit
export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/${VAULT_NAMESPACE}/transit
アドレスはプロキシーデプロイメント設定で使用されます。
Vault インスタンスを参照するようにプロキシーデプロイメント設定を更新します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow sed -i "s/\(vaultTransitEngineUrl:\).*$/\1 ${VAULT_TRANSIT_URL}/" */proxy/proxy-config.yaml
sed -i "s/\(vaultTransitEngineUrl:\).*$/\1 ${VAULT_TRANSIT_URL}/" */proxy/proxy-config.yaml
- Vault ポリシーとトークンを作成します。
Vault ポリシーとトークンの作成
Vault インスタンスを設定したら、Record Encryption フィルターの Vault ポリシーとトークンを作成します。
Vault ポリシーを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault policy write amqstreams_proxy_encryption_filter_policy vault/amqstreams_proxy_encryption_filter_policy.hcl
vault policy write amqstreams_proxy_encryption_filter_policy vault/amqstreams_proxy_encryption_filter_policy.hcl
Streams for Apache Kafka Proxy に付属する HashiCorp ポリシー定義ファイル (
.hcl
) を使用して、ポリシーを Vault に書き込みます。ポリシーの名前はamqstreams_proxy_encryption_filter_policy
です。Vault トークンを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow vault token create \ -display-name "amqstreams-proxy encryption filter" \ -policy=amqstreams_proxy_encryption_filter_policy \ -no-default-policy \ -orphan \ -field=token > vault.encryption.token
vault token create \ -display-name "amqstreams-proxy encryption filter" \ -policy=amqstreams_proxy_encryption_filter_policy \ -no-default-policy \ -orphan \ -field=token > vault.encryption.token
このコマンドは、ポリシーを指定したトークン、および関連付けられた親トークンまたはデフォルトポリシーのないトークンを作成します。
トークンを含むシークレットを作成します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc create secret generic proxy-encryption-vault-token \ -n proxy \ --from-file=encryption-vault-token.txt=vault.encryption.token \ --dry-run=client \ -o yaml > base/proxy/proxy-encryption-vault-token-secret.yaml
oc create secret generic proxy-encryption-vault-token \ -n proxy \ --from-file=encryption-vault-token.txt=vault.encryption.token \ --dry-run=client \ -o yaml > base/proxy/proxy-encryption-vault-token-secret.yaml
このコマンドは、Vault トークンをシークレットに保存し、
proxy
namespace に YAML ファイルとしてシークレットを作成します。Record Encryption フィルターを使用して Streams for Apache Kafka をデプロイするときに、
proxy-encryption-vault-token-secret.yaml
シークレットが OpenShift クラスターに適用されます。
侵害された鍵の影響を最小限に抑えるために、定期的に鍵をローテーションします。HashiCorp Vault などの Key Management System (KMS) を使用する場合は、KMS に保存されている Key Encryption Key (KEK) をローテーションします。Streams for Apache Kafka Proxy は DEK のローテーションを自動的に管理します。プロキシーが新しい鍵を取得するには、再起動が必要になる場合があります。さらに、暗号化されたメッセージには、鍵のローテーションを示す鍵バージョンメタデータが含まれている必要があります。