azure+key-vault使用(国区cloud下)

[toc]

概述

本文主要记录按文档实验的两种获取 key vault 机密(secret)的方式:

    1. REST API 方式获取。
    1. AKS 服务中(Azure Kubernetes)获取 。

关键知识

  • Azure 是微软的云平台,key vault 是其众多服务的一种。
  • 本文涉及的操作完全是在 Azure 在中国独立运营的云平台上操作的,官方叫世纪互联运营的 Microsoft Azure,下面提到的 Azure 全部指的是 世纪互联运营的 Microsoft Azure

注意

  • 基于上面这个前提,操作中涉及 API 相关的 host,参数等,可能会和文档里不一样,注意区分才能正常使用。
  • 网页登录访问的地址域名 https://portal.azure.cn/
  • 我不知道个人账户是否能够使用 世纪互联 的服务。
  • 官方文档繁多,如果错误欢迎评论区指出。
  • 操作时间 2023年2月。

Prerequisites(先决条件)

  • 前提, 已创建好资源组

  • 安装好 Azure CLI。

  • 设置中国区 cloud,az cloud set --name AzureChinaCloud,设置之后,用
    az cloud list --output table 查看。

    az cloud list --output table

  • az login 登录。

REST API 方式获取

待记录

AKS 中获取

已有创建好的资源组前提下

aks

  • 没有 aks 自己创建:
1
az aks create -n <aks名称> -g <资源组名称> --enable-addons azure-keyvault-secrets-provider --enable-managed-identity
  • 已有 aks 可以升级
    1
    az aks enable-addons --addons azure-keyvault-secrets-provider --name <aks名称> --resource-group <资源组名称>

验证安装

参考验证适用于机密存储 CSI 驱动程序的 Azure 密钥保管库提供程序安装

1
kubectl get pods -n kube-system -l 'app in (secrets-store-csi-driver, secrets-store-provider-azure)'

创建 Key Vault(密钥保管库)

在资源组内手动创建即可,已创建好的:

新建密钥保管库

新建机密(Secret),名称为:test-keyvault,值随便:

新建一个机密

托管标识

本人实验过程中,新建 aks,系统自动新建了另一个资源组,在新的资源组中自动生成了托管标识。并且该托管标识的访问控制中,新建好了给 aks 的一个参与者的权限。

但托管标识在哪个资源组不重要,重要的是分配我们新建的 aks 正确的角色。

检查是否存在托管标识
下面的命令可能会打印出托管标识的客户端 ID:

1
az aks show -g <资源组名称> -n <aks名称> --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId -o tsv

托管标识授予访问查看密钥保管库的权限

可以手动操作也可以命令行操作

命令行操作

下面的 <identity-client-id>托管标识的客户端 id,也就是上一步打印的字符串,命令:

1
2
3
4
5
6
# set policy to access keys in your key vault
az keyvault set-policy -n <keyvault-name> --key-permissions get --spn <identity-client-id>
# set policy to access secrets in your key vault
az keyvault set-policy -n <keyvault-name> --secret-permissions get --spn <identity-client-id>
# set policy to access certs in your key vault
az keyvault set-policy -n <keyvault-name> --certificate-permissions get --spn <identity-client-id>

手动操作

密钥保管库的访问策略中新建:

新建访问策略给密钥保管库01

新建访问策略给密钥保管库02

新建访问策略给密钥保管库03

检查托管标识中是否允许 aks 访问,否则新建角色分配

检查

检查aks是否能访问托管标识

如果没有,则新建

托管标识->访问控制->添加->添加分配角色

分配角色给aks01

分配角色给aks02

创建 SecretProviderClass 和 Pod 实验

创建 SecretProviderClass

新建 Yaml 文件 secretproviderclass.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# This is a SecretProviderClass example using user-assigned identity to access your key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
name: azure-kvname-user-msi
spec:
provider: azure
parameters:
usePodIdentity: "false"
useVMManagedIdentity: "true" # Set to true for using managed identity
# 下面这个指的是 托管标识(用户标识符)对应的客户端 ID,在之前的
# az aks show -g <资源组名称> -n <aks名称> --query addonProfiles.azureKeyvaultSecretsProvider.identity.clientId -o tsv
# 展示的那个 id
userAssignedIdentityID: <client-id> # Set the clientID of the user-assigned managed identity to use
keyvaultName: <key-vault-name> # Set to the name of your key vault
cloudName: "AzureChinaCloud" # [OPTIONAL for Azure] if not provided, the Azure environment defaults to AzurePublicCloud
objects: |
array:
- |
objectName: test-keyvault # 之前新建的机密
objectType: secret # 类型为:secret 机密
objectVersion: ""
tenantId: <tenant-id> # The tenant ID of the key vault,密钥保管库概述中的,目录 ID

将 SecretProviderClass 应用到群集:

1
kubectl apply -f secretproviderclass.yaml

创建 pod

新建 Yaml 文件 pod.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# This is a sample pod definition for using SecretProviderClass and the user-assigned identity to access your key vault
kind: Pod
apiVersion: v1
metadata:
name: busybox-secrets-store-inline-user-msi
spec:
containers:
- name: busybox
image: k8sgcr.azk8s.cn/e2e-test-images/busybox:1.29-1
command:
- "/bin/sleep"
- "10000"
volumeMounts:
- name: secrets-store01-inline
mountPath: "/mnt/secrets-store"
readOnly: true
volumes:
- name: secrets-store01-inline
csi:
driver: secrets-store.csi.k8s.io
readOnly: true
volumeAttributes:
secretProviderClass: "azure-kvname-user-msi"

将 Pod 应用到群集:

1
kubectl apply -f pod.yaml

连接 pod 容器获取密钥保管库中的机密 test-keyvault

1
2
3
kubectl exec -it busybox-secrets-store-inline-user-msi -- /bin/sh

cat /mnt/secrets-store/test-keyvault

参考


azure+key-vault使用(国区cloud下)
https://hutaoren.cn/2023/02/25/azure+key-vault使用(国区cloud下)/
作者
胡桃仁
发布于
2023年2月25日
许可协议