第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 をデプロイするために必要なデプロイメント設定が含まれています。
ルートトークンを作成し、メモしておきます。
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 をインストールします。
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} \ --waitroot トークンは Vault インスタンスに使用されます。
デプロイメントのステータスを確認します。
oc get pods -n vaultデプロイメント名と準備状態が表示されている出力
NAME READY STATUS RESTARTS vault-0 1/1 Running 0Pod ID は、作成された Pod を識別します。
デフォルトのデプロイメントでは、単一のプロキシー Pod をインストールします。
READY は、ready/expected 状態のレプリカ数を表示します。STATUS が Running と表示されれば、デプロイメントは成功です。
新しい Vault インスタンスを指す Vault アドレス (
VAULT_ADDR) 環境変数を作成します。export VAULT_ADDR=$(oc get route -n vault vault --template='https://{{.spec.host}}')管理者として Vault にログインし、Vault Transit シークレットエンジンを有効にします。
vault secrets enable transitシークレットエンジンがすでに有効になっている場合は、エラーを無視します。
Vault Transit アドレスを指す環境変数を作成します。
export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/transitアドレスはプロキシーデプロイメント設定で使用されます。
- Vault ポリシーとトークンを作成します。
独自の Vault インスタンスの設定
すでに Kafka インスタンスがインストールされている場合は、それを更新して Streams for Apache Kafka Proxy で使用できます。
Vault インスタンスを指す Vault アドレス環境変数 (Enterprise を使用している場合は
VAULT_ADDRとVAULT_NAMESPACE) を作成します。export VAULT_ADDR=https://<vault server>:8200 export VAULT_NAMESPACE=<namespaces>管理者として Vault にログインし、Vault Transit シークレットエンジンを有効にします。
vault secrets enable transitシークレットエンジンがすでに有効になっている場合は、エラーを無視します。
Vault Transit アドレスを指す環境変数を作成します。
export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/${VAULT_NAMESPACE}/transitアドレスはプロキシーデプロイメント設定で使用されます。
Vault インスタンスを参照するようにプロキシーデプロイメント設定を更新します。
sed -i "s/\(vaultTransitEngineUrl:\).*$/\1 ${VAULT_TRANSIT_URL}/" */proxy/proxy-config.yaml- Vault ポリシーとトークンを作成します。
Vault ポリシーとトークンの作成
Vault インスタンスを設定したら、Record Encryption フィルターの Vault ポリシーとトークンを作成します。
Vault ポリシーを作成します。
vault policy write amqstreams_proxy_encryption_filter_policy vault/amqstreams_proxy_encryption_filter_policy.hclStreams for Apache Kafka Proxy に付属する HashiCorp ポリシー定義ファイル (
.hcl) を使用して、ポリシーを Vault に書き込みます。ポリシーの名前はamqstreams_proxy_encryption_filter_policyです。Vault トークンを作成します。
vault token create \ -display-name "amqstreams-proxy encryption filter" \ -policy=amqstreams_proxy_encryption_filter_policy \ -no-default-policy \ -orphan \ -field=token > vault.encryption.tokenこのコマンドは、ポリシーを指定したトークン、および関連付けられた親トークンまたはデフォルトポリシーのないトークンを作成します。
トークンを含むシークレットを作成します。
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 トークンをシークレットに保存し、
proxynamespace に 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 のローテーションを自動的に管理します。プロキシーが新しい鍵を取得するには、再起動が必要になる場合があります。さらに、暗号化されたメッセージには、鍵のローテーションを示す鍵バージョンメタデータが含まれている必要があります。