Azure Key Vault 密钥存储
组件格式
要设置 Azure Key Vault 密钥存储,创建一个类型为 secretstores.azure.keyvault 的组件。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName # 必需
value: [your_keyvault_name]
- name: azureEnvironment # 可选,默认为 AZUREPUBLICCLOUD
value: "AZUREPUBLICCLOUD"
# 请参阅下面的身份验证部分以获取所有选项
- name: azureTenantId
value: "[your_service_principal_tenant_id]"
- name: azureClientId
value: "[your_service_principal_app_id]"
- name: azureCertificateFile
value : "[pfx_certificate_file_fully_qualified_local_path]"
通过 Microsoft Entra ID 进行身份验证
Azure Key Vault 密钥存储组件仅支持通过 Microsoft Entra ID 进行身份验证。在启用此组件之前,请确保:
- 阅读Azure 身份验证文档。
- 创建一个 Microsoft Entra ID 应用程序(也称为服务主体)。
- 或者,为您的应用程序平台创建一个托管身份。
规范元数据字段
| 字段 | 必需 | 详细信息 | 示例 |
|---|---|---|---|
vaultName | Y | Azure Key Vault 的名称 | "mykeyvault" |
azureEnvironment | N | 如果使用不同的 Azure 云,则为 Azure 环境的可选名称 | "AZUREPUBLICCLOUD"(默认值),"AZURECHINACLOUD","AZUREUSGOVERNMENTCLOUD","AZUREGERMANCLOUD" |
| 身份验证元数据 | 有关更多信息,请参阅Azure 身份验证 |
此外,您必须提供Azure 身份验证文档中解释的身份验证字段。
可选的每请求元数据属性
从此密钥存储检索密钥时,可以提供以下可选查询参数:
| 查询参数 | 描述 |
|---|---|
metadata.version_id | 给定密钥的版本。 |
metadata.maxresults | (仅适用于批量请求)要返回的密钥数量,超过此数量后请求将被截断。 |
示例
先决条件
- Azure 订阅
- Azure CLI
- jq
- 您正在使用 bash 或 zsh shell
- 您已根据Azure 身份验证中的说明创建了一个 Microsoft Entra ID 应用程序(服务主体)。您将需要以下值:
值 描述 SERVICE_PRINCIPAL_ID您为给定应用程序创建的服务主体的 ID
创建 Azure Key Vault 并授权服务主体
- 使用您创建的服务主体设置一个变量:
SERVICE_PRINCIPAL_ID="[your_service_principal_object_id]"
- 设置一个变量,指定创建所有资源的位置:
LOCATION="[your_location]"
(您可以使用以下命令获取完整的选项列表:az account list-locations --output tsv)
- 创建一个资源组,给它任何您喜欢的名称:
RG_NAME="[resource_group_name]"
RG_ID=$(az group create \
--name "${RG_NAME}" \
--location "${LOCATION}" \
| jq -r .id)
- 创建一个使用 Azure RBAC 进行授权的 Azure Key Vault:
KEYVAULT_NAME="[key_vault_name]"
az keyvault create \
--name "${KEYVAULT_NAME}" \
--enable-rbac-authorization true \
--resource-group "${RG_NAME}" \
--location "${LOCATION}"
- 使用 RBAC,为 Microsoft Entra ID 应用程序分配一个角色,以便它可以访问 Key Vault。 在这种情况下,分配“Key Vault Secrets User”角色,该角色具有对 Azure Key Vault 的“获取密钥”权限。
az role assignment create \
--assignee "${SERVICE_PRINCIPAL_ID}" \
--role "Key Vault Secrets User" \
--scope "${RG_ID}/providers/Microsoft.KeyVault/vaults/${KEYVAULT_NAME}"
根据您的应用程序,您可以使用其他限制较少的角色,例如“Key Vault Secrets Officer”和“Key Vault Administrator”。有关 Key Vault 的 Azure 内置角色的更多信息,请参阅 Microsoft 文档。
配置组件
使用客户端密钥
要使用客户端密钥,请在组件目录中创建一个名为 azurekeyvault.yaml 的文件。使用以下模板,填写您创建的 Microsoft Entra ID 应用程序:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "[your_keyvault_name]"
- name: azureTenantId
value: "[your_tenant_id]"
- name: azureClientId
value: "[your_client_id]"
- name: azureClientSecret
value : "[your_client_secret]"
使用证书
如果您想使用保存在本地磁盘上的证书,请使用以下模板。填写您创建的 Microsoft Entra ID 应用程序的详细信息:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: azurekeyvault
spec:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "[your_keyvault_name]"
- name: azureTenantId
value: "[your_tenant_id]"
- name: azureClientId
value: "[your_client_id]"
- name: azureCertificateFile
value : "[pfx_certificate_file_fully_qualified_local_path]"
在 Kubernetes 中,您将客户端密钥或证书存储到 Kubernetes 密钥存储中,然后在 YAML 文件中引用它们。在开始之前,您需要您创建的 Microsoft Entra ID 应用程序的详细信息。
使用客户端密钥
使用以下命令创建一个 Kubernetes 密钥:
kubectl create secret generic [your_k8s_secret_name] --from-literal=[your_k8s_secret_key]=[your_client_secret][your_client_secret]是上面生成的应用程序的客户端密钥[your_k8s_secret_name]是 Kubernetes 密钥存储中的密钥名称[your_k8s_secret_key]是 Kubernetes 密钥存储中的密钥键
创建一个
azurekeyvault.yaml组件文件。组件 yaml 使用
auth属性引用 Kubernetes 密钥存储,并且secretKeyRef引用存储在 Kubernetes 密钥存储中的客户端密钥。apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: azurekeyvault spec: type: secretstores.azure.keyvault version: v1 metadata: - name: vaultName value: "[your_keyvault_name]" - name: azureTenantId value: "[your_tenant_id]" - name: azureClientId value: "[your_client_id]" - name: azureClientSecret secretKeyRef: name: "[your_k8s_secret_name]" key: "[your_k8s_secret_key]" auth: secretStore: kubernetes应用
azurekeyvault.yaml组件:kubectl apply -f azurekeyvault.yaml
使用证书
使用以下命令创建一个 Kubernetes 密钥:
kubectl create secret generic [your_k8s_secret_name] --from-file=[your_k8s_secret_key]=[pfx_certificate_file_fully_qualified_local_path][pfx_certificate_file_fully_qualified_local_path]是您之前获得的 PFX 文件的路径[your_k8s_secret_name]是 Kubernetes 密钥存储中的密钥名称[your_k8s_secret_key]是 Kubernetes 密钥存储中的密钥键
创建一个
azurekeyvault.yaml组件文件。组件 yaml 使用
auth属性引用 Kubernetes 密钥存储,并且secretKeyRef引用存储在 Kubernetes 密钥存储中的证书。apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: azurekeyvault spec: type: secretstores.azure.keyvault version: v1 metadata: - name: vaultName value: "[your_keyvault_name]" - name: azureTenantId value: "[your_tenant_id]" - name: azureClientId value: "[your_client_id]" - name: azureCertificate secretKeyRef: name: "[your_k8s_secret_name]" key: "[your_k8s_secret_key]" auth: secretStore: kubernetes应用
azurekeyvault.yaml组件:kubectl apply -f azurekeyvault.yaml
使用 Azure 托管身份
确保您的 AKS 集群已启用托管身份,并按照使用托管身份的指南进行操作。
创建一个
azurekeyvault.yaml组件文件。组件 yaml 引用特定的 KeyVault 名称。您将在后续步骤中使用的托管身份必须被授予对此特定 KeyVault 实例的读取访问权限。
apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: azurekeyvault spec: type: secretstores.azure.keyvault version: v1 metadata: - name: vaultName value: "[your_keyvault_name]"应用
azurekeyvault.yaml组件:kubectl apply -f azurekeyvault.yaml通过以下方式在 pod 级别创建并分配托管身份:
重要:虽然 Microsoft Entra ID pod 身份和工作负载身份都处于预览状态,但目前计划将 Microsoft Entra ID 工作负载身份推向普遍可用(稳定状态)。
创建工作负载身份后,授予其
read权限:- 在您期望的 KeyVault 实例上
- 在您的应用程序部署中。通过标签注释注入 pod 身份,并通过指定与期望的工作负载身份关联的 Kubernetes 服务帐户
apiVersion: v1 kind: Pod metadata: name: mydaprdemoapp labels: aadpodidbinding: $POD_IDENTITY_NAME
直接使用 Azure 托管身份与通过 Microsoft Entra ID 工作负载身份
当直接使用托管身份时,您可以为应用程序关联多个身份,需要 azureClientId 来指定应使用哪个身份。
然而,当通过 Microsoft Entra ID 工作负载身份使用托管身份时,azureClientId 是不必要的且无效。要使用的 Azure 身份是从与 Azure 身份关联的服务帐户推断出来的。