第 2 章 为 Record Encryption 过滤器准备 HashiCorp Vault
要将 Vault 与 OpenShift 集群中的 Record Encryption 过滤器一起使用,请为您的 Vault 实例使用以下设置:
- 启用 Transit Engine,因为 Record Encryption 过滤器依赖于其 API。
- 为过滤器创建一个 Vault 策略,其具有生成和解密用于信封加密的数据加密密钥(DEK)的权限。
- 获取包含过滤器策略的 Vault 令牌。
代理的部署配置使用 Vault Transit Engine 服务的 URL。
Vault 可以部署为现有实例、云实例或 OpenShift。通过对代理的可访问性,它可以与 Apache Kafka 代理的 Streams 共存,也可以远程部署。
有关在 OpenShift 上安装 Vault 并设置访问权限的详情,请参考 HashiCorp Vault 产品文档。
此流程概述了准备 Vault 的两个选项:
- 使用带有 Apache Kafka 代理的 Streams 提供的临时部署配置的 Helm 将 Vault 部署到 OpenShift 集群。
- 更新现有的 Vault 实例。
准备 Vault 实例时,您必须为 Record Encryption 过滤器创建 Vault 策略和令牌。
示例部署配置不适用于生产环境。
Apache Kafka 的 Streams 在 examples/proxy/record-encryption/vault
文件夹中包括示例安装工件,其中包含与代理和记录加密过滤器兼容的预先配置 Vault 部署文件。
-
AMQstreams_proxy_encryption_filter_policy.hcl
为 Record Encryption 过滤器定义一个 Vault 策略 -
helm-dev-values.yaml
指定 Vault 的 Helm 部署配置
这些安装文件为尝试代理提供了一个快速设置。
先决条件
-
安装需要具有
cluster-admin
角色的 OpenShift 用户,如system:admin
。 -
oc
命令行工具已安装并配置为连接到具有 admin 访问权限的 OpenShift 集群。 -
helm
命令行工具已安装并配置为连接到具有 admin 访问权限的 OpenShift 集群。 -
名为
proxy
的 OpenShift 项目命名空间,这是默认安装代理的同一命名空间。
有关此流程中使用的 oc
和 helm
命令行选项的信息,请查看 --help
。
使用 Helm 部署配置示例部署 Vault
下载并提取 Apache Kafka 代理安装工件的 Streams。
代理可从 Apache Kafka 软件下载页面 的 Streams 获取。
文件包含部署 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} \ --wait
root 令牌用于 Vault 实例。
检查部署的状态:
oc get pods -n vault
输出显示部署名称和就绪
NAME READY STATUS RESTARTS vault-0 1/1 Running 0
标识创建的 pod 的 pod ID。
使用默认部署,您可以安装单个代理 pod。
READY 显示就绪/预期的副本数。当 STATUS 显示为 Running 时,部署成功。
创建 Vault 地址(
VAULT_ADDR
)环境变量以指向新的 Vault 实例:export VAULT_ADDR=$(oc get route -n vault vault --template='https://{{.spec.host}}')
以管理员身份登录到 Vault,并启用 Vault Transit secret 引擎:
vault secrets enable transit
如果已经启用了 secret 引擎,请忽略错误。
创建指向 Vault Transit 地址的环境变量:
export VAULT_TRANSIT_URL=${VAULT_ADDR}/v1/transit
地址在代理部署配置中使用。
- 创建 Vault 策略和令牌。
配置您自己的 Vault 实例
如果您已经安装了 Kafka 实例,您可以更新它以用于 Apache Kafka 代理的 Streams。
创建一个 Vault 地址环境变量(
VAULT_ADDR
和VAULT_NAMESPACE
,如果使用 Enterprise)以指向 Vault 实例:export VAULT_ADDR=https://<vault server>:8200 export VAULT_NAMESPACE=<namespaces>
以管理员身份登录到 Vault,并启用 Vault Transit secret 引擎:
vault secrets enable transit
如果已经启用了 secret 引擎,请忽略错误。
创建指向 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.hcl
使用由 Apache Kafka Proxy 的 Streams 提供的 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
该命令使用指定策略创建令牌,且没有关联的父令牌或默认策略。
创建包含令牌的 secret:
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 令牌存储在机密中,并将 secret 创建为
代理
命名空间中的 YAML 文件。当使用 Record Encryption 过滤器部署流 for Apache Kafka Proxy 时,
proxy-encryption-vault-token-secret.yaml
secret 会被应用到 OpenShift 集群。
定期轮转密钥,以最大程度降低被入侵的密钥的影响。当使用密钥管理系统(KMS)时,如 HashiCorp Vault,轮转保存在 KMS 中的密钥加密密钥(KEK)。Apache Kafka 代理的流会自动管理 DEK 轮转。代理可能需要执行 occasional 重启才能获取新密钥。另外,加密的消息应包含密钥版本元数据来指示密钥轮转。