文档中心>容器服务>实践教程>安全>使用 ExternalSecretOperator 导入腾讯云 SSM 凭据

使用 ExternalSecretOperator 导入腾讯云 SSM 凭据

最近更新时间:2024-06-07 11:08:41

我的收藏
ExternalSecretOperator 可以帮助您将统一存储和管理在 腾讯云凭据管理系统(SSM)中的密钥凭据,以 K8S 原生 Secret 对象的形式导入到集群中,并实现密钥数据的自动同步,实现由 SSM 来统一存储和管理密钥的生命周期。

限制条件

使用 ExternalSecrets 组件需要 Kubernetes 版本大于等于1.19。
操作系统镜像支持 x86 架构。

启用外部密钥访问能力

安装扩展组件

2. 为集群安装 ExternalSecrets(外部密钥访问组件)组件。
如果您还没有创建集群,可以在创建集群的时候安装 ExternalSecrets 组件。详情请参见 通过集群创建页安装
如果您需要给已创建好的集群开启外部密钥访问能力,请在组件管理中安装 ExternalSecrets 组件。详情请参见 通过组件管理页安装



3. 在组件管理页面查看组件状态。如组件状态为“成功”,代表组件部署完成。如下图所示:




使用方式

方式一:通过 AKSK 授权

步骤1:通过 AKSK 授权方式配置认证信息

1. 登录 腾讯云访问管理控制台,选择左侧导航中的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建
3. 按策略语法创建页面,选择空白模板,如下图所示:



4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"qcs::ssm:$region:uin/$uin:secret/creatorUin/$creatorUin/$secretName"
]
}
],
"version": "2.0"
}
说明:
授权接口访问特定资源:创建访问控制策略
5. 单击完成即可添加策略。
6. 策略页面查看已创建的自定义策略,选择自定义策略 > 关联用户/组/角色,如下图所示:



关联用户/组/角色页面选择需要绑定的用户,如下图所示:



7. 单击确定

步骤2:组件使用说明

该组件涉及两种自定义资源(CRD):SecretStore 用于存放访问凭据,ExternalSecret 用于指定 SecretStore 并存放需要同步的凭据基础信息。通过这种方式,权限和数据得到分离,提高了使用的灵活性。
在 SSM 凭据管理系统中,您需要添加以下凭据:
SecretName: hello-test
SecretData: {"name":"jack","password":"123"}
VersionId: v1
请参见 腾讯云凭据管理系统文档 以获取详细的创建凭据流程。
注意:
以下 secret、SecretStore、ExternalSecret 均在 default 命名空间中。
1. 创建 secret。
您可以使用以下命令创建 secret:
echo -n 'KEYID' > ./accessKeyId
echo -n 'SECRETKEY' > ./accessKeySecret
kubectl create secret generic tencent-credentials --from-file=./accessKeyId --from-file=./accessKeySecret
说明:
密钥可前往 访问管理 进行获取。
2. 创建 SecretStore。
您可以将以下内容保存到 my-secretstore.yaml 文件中:
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: my-secretstore spec: provider: tencent: regionID: ap-guangzhou auth: secretRef: accessKeyIDSecretRef: name: tencent-credentials key: accessKeyId accessKeySecretSecretRef: name: tencent-credentials key: accessKeySecret
3. 创建 ExternalSecret。
您可以将以下内容保存到 my-externalsecret.yaml 文件中:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: my-externalsecret spec: refreshInterval: 1m secretStoreRef: kind: SecretStore name: my-secretstore target: name: my-secret-key-to-be-created creationPolicy: Owner data: - secretKey: secret-key-to-be-managed remoteRef: key: hello-test version: v1 # option property: password
4. 部署示例,请执行以下命令:
kubectl apply -f my-secretstore.yaml kubectl apply -f my-externalsecret.yaml
5. 使用获取的凭据。
您可以将以下内容保存到 my-pod.yaml 文件中:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: busybox command: - /bin/sh - -c - 'echo "Secret value: ${SECRET_KEY_TO_BE_MANAGED}"' env: - name: SECRET_KEY_TO_BE_MANAGED valueFrom: secretKeyRef: name: my-secret-key-to-be-created key: secret-key-to-be-managed restartPolicy: Never
然后,使用以下命令部署 Pod 资源:
kubectl apply -f my-pod.yaml
最后,使用以下命令查看获取的凭据:
kubectl logs my-pod
您将看到获取的凭据信息:
# ExternalSecret中获取的凭据信息如下所示。 Secret value: 123

方式二:通过 AKSK 与角色扮演授权

步骤1:创建获取 SSM 凭据的策略

1. 登录 腾讯云访问管理控制台,选择左侧导航中的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建
3. 按策略语法创建页面,选择空白模板,如下图所示:



4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容:
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"qcs::ssm:$region:uin/$uin:secret/creatorUin/$creatorUin/$secretName"
]
}
],
"version": "2.0"
}
说明:
授权接口访问特定资源:创建访问控制策略
5. 单击完成即可添加策略。

步骤2:为子账号赋予扮演角色策略

1. 登录 腾讯云访问管理控制台,选择左侧导航中的用户 > 用户列表。
2. 用户列表页面,单击新建用户。新建用户流程详情请参见 新建子用户
3. 为创建的子用户赋予扮演角色的策略。详情请参见 为子账号赋予扮演角色策略

步骤3:为角色赋予访问 SSM 凭据的策略

1. 策略页面查看已创建的自定义策略,选择自定义策略 > 关联用户/组/角色,如下图所示:


2. 关联用户/组/角色页面选择需要绑定的角色,如下图所示:



3. 单击确定

步骤4:组件使用说明

该组件涉及两种自定义资源(CRD):SecretStore 用于存放访问凭据,ExternalSecret 用于指定 SecretStore 并存放需要同步的凭据基础信息。通过这种方式,权限和数据得到分离,提高了使用的灵活性。
在 SSM 凭据管理系统中,您需要添加以下凭据:
SecretName: hello-test
SecretData: {"name":"jack","password":"123"}
VersionId: v1
请参见 腾讯云凭据管理系统文档 以获取详细的创建凭据流程。
注意:
以下 secret、SecretStore、ExternalSecret 均在 default 命名空间中。
1. 创建 secret。
您可以使用以下命令创建 secret:
echo -n 'KEYID' > ./accessKeyId
echo -n 'SECRETKEY' > ./accessKeySecret
kubectl create secret generic tencent-credentials --from-file=./accessKeyId --from-file=./accessKeySecret
说明:
密钥可前往 访问管理 进行获取。
2. 创建 SecretStore。
您可以将以下内容保存到 my-secretstore.yaml 文件中:
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: secretstore-assumerole spec: provider: tencent: regionID: ap-guangzhou role: "qcs::cam::uin/12345:roleName/test-assume-role" auth: secretRef: accessKeyIDSecretRef: name: tencent-credentials key: accessKeyId accessKeySecretSecretRef: name: tencent-credentials key: accessKeySecret
说明:
role 字段在 步骤2 中获取。
3. 创建 ExternalSecret。
您可以将以下内容保存到 my-externalsecret.yaml 文件中:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: external-secret-assumerole spec: refreshInterval: 1m secretStoreRef: kind: SecretStore name: secretstore-assumerole target: name: my-secret-key-to-be-created creationPolicy: Owner data: - secretKey: secret-key-to-be-managed remoteRef: key: hello-test version: v1 property: password
4. 部署示例,请执行以下命令:
kubectl apply -f my-secretstore.yaml kubectl apply -f my-externalsecret.yaml
5. 使用获取的凭据。
您可以将以下内容保存到 my-pod.yaml 中:
apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: my-container image: busybox command: - /bin/sh - -c - 'echo "Secret value: ${SECRET_KEY_TO_BE_MANAGED}"' env: - name: SECRET_KEY_TO_BE_MANAGED valueFrom: secretKeyRef: name: my-secret-key-to-be-created key: secret-key-to-be-managed restartPolicy: Never

然后,使用以下命令部署 Pod 资源:
kubectl apply -f my-pod.yaml
最后,使用以下命令查看获取的凭据:
kubectl logs my-pod
您将看到获取的凭据信息:
# ExternalSecret中获取的凭据信息如下所示。 Secret value: 123

方式三:通过 TKE OIDC 授权

步骤1:开启 OIDC 资源访问控制能力

1. 登录 容器服务控制台,选择左侧导航中的集群
2. 集群管理页面,选择集群 ID,进入集群的基本信息页面。
3. 在集群基本信息中,单击 ServiceAccountIssuerDiscovery 右侧的

。如下图所示:
说明:
如果您需要体验 ServiceAccountIssuerDiscovery 功能,请 提交工单 进行申请。



4. 进入修改 ServiceAccountIssuerDiscovery 相关参数页面,若系统提示您无法修改相关参数,请先进行服务授权。

在角色管理页面,查看授权策略 QcloudAccessForTKERoleInOIDCConfig,单击同意授权



5. 授权完毕后,勾选“创建 CAM OIDC 提供商”和“创建webhook组件”,并填写客户端 ID,单击确定。如下图所示:
说明
客户端 ID 是选填参数,当不填写时,默认值是 "sts.cloud.tencent.com",本文示例中创建 CAM OIDC 提供商采用默认值。



6. 返回集群详情页,当 ServiceAccountIssuerDiscovery 可再次编辑时,表明本次开启 OIDC 资源访问控制结束。
注意
"service-account-issuer" 和 "service-account-jwks-uri" 参数值不允许编辑,采用默认规则。
7. 进入修改 ServiceAccountIssuerDiscovery 相关参数页面,系统将提示“您创建的身份提供商已存在,前往查看”。单击前往查看。如下图所示:



8. 集群信息 > 组件管理中,如在列表看到 pod-identity-webhook 组件状态是“成功”,即表示安装组件成功。如下图所示:



步骤2:创建获取 SSM 凭据的策略

1. 登录 腾讯云访问管理控制台,选择左侧导航中的策略
2. 进入策略页面,单击新建自定义策略 > 按策略语法创建
3. 按策略语法创建页面,选择“空白模板”,如下图所示:



4. 单击下一步,进入编辑策略页面,在策略内容编辑框中添加以下内容。创建访问控制策略,详情请参见创建访问控制策略
{
"statement": [
{
"action": [
"ssm:GetSecretValue"
],
"effect": "allow",
"resource": [
"qcs::ssm:$region:uin/$uin:secret/creatorUin/$creatorUin/$secretName"
]
}
],
"version": "2.0"
}
说明:
授权接口访问特定资源:创建访问控制策略
5. 单击完成即可添加策略。

步骤3:新建 OIDC 角色

1. 登录 腾讯云访问管理控制台,选择左侧导航中的角色
2. 角色页面,选择新建角色 > 身份提供商
3. 新建自定义角色页面,参考以下信息进行设置。



身份提供商类型:选择 OIDC。
选择身份提供商:选择本次为哪个身份提供商创建角色。
使用条件:填写 oidc:aud 的 value 值。
注意:
身份提供商的 value 值标识为 $my_provider_id。
oidc:aud 的 value 值需要和 CAM OIDC 提供商的客户端 ID value 值保持一致。
oidc:aud 的 value 值标识为$my_pod_audience,当oidc:aud的 value 值有多个时,任选其中之一即可。
4. 单击下一步,进入配置角色策略页面,选择在 步骤2 中创建并获取 SSM 的策略,如下图所示:



5. 单击下一步,进入配置角色标签页面,若不需要设置标签可直接下一步,如下图所示:



6. 单击下一步,进入审阅页面,编辑角色名称角色描述,如下图所示:



7. 单击完成。角色创建完成后,进入角色详情页,可以查看 OIDC 角色的 RoleArn 与该角色拥有的权限,如下图所示:



注意:
RoleArn 的 value 值标识为$my_pod_role_arn

步骤4:组件使用说明

1. 创建 ServiceAccount。
您可以将以下内容保存到 my-serviceaccount.yaml 中:
apiVersion: v1 kind: ServiceAccount metadata: name: my-serviceaccount annotations: tke.cloud.tencent.com/role-arn: $my_pod_role_arn tke.cloud.tencent.com/audience: $my_pod_audience tke.cloud.tencent.com/providerID: $my_provider_id
说明:
将 $my_pod_role_arn 替换为 RoleArn 的 value 值。
将 $my_pod_audience 替换为 oidc:aud 的 value 值。
将 $my_provider_id 替换为“身份提供商”。
2. 创建 SecretStore。
您可以将以下内容保存到 my-secretstore.yaml 中:
apiVersion: external-secrets.io/v1beta1 kind: SecretStore metadata: name: secretstore-tkeoidc spec: provider: tencent: regionID: ap-guangzhou auth: serviceAccountRef: name: my-serviceaccount
3. 创建 ExternalSecret。
您可以将以下内容保存到 my-externalsecret.yaml 中:
apiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: external-secret-tkeoidc spec: refreshInterval: 1h secretStoreRef: kind: SecretStore name: secretstore-tkeoidc target: name: my-secret-key-to-be-created creationPolicy: Owner data: - secretKey: secret-key-to-be-managed remoteRef: key: hello-test version: v1 # option property: password
4. 部署示例,请执行以下命令:
kubectl apply -f my-serviceaccount.yaml kubectl apply -f my-secretstore.yaml kubectl apply -f my-externalsecret.yaml
5. 查看目标 Secret 是否创建成功,请执行以下命令:
kubectl get secret my-secret-key-to-be-created -o yaml
注意:
在没有关闭同步刷新的前提下,可以修改 SSM 凭据管理系统中的密钥内容,等到刷新时间到达后,目标 secret 会完成同步。