-
免改造架构:借助KMS与ACK Secret实现数据库密码的安全托管
在云原生应用的敏捷交付与严格安全要求间,我们常面临一个核心矛盾:如何在不改动业务代码的前提下,消除配置文件中的数据库明文密码? 传统的硬编码方式安全风险极高,而直接集成KMS API又涉及代码改造与测试成本。
为此,我们探寻一条优雅的中间路径:将数据库密码托管于阿里云KMS凭据管家,并借助ACK的Secret管理系统自动同步至应用环境。这一方案实现了凭据的集中管控、自动轮转与安全传递,使应用在无感状态下完成安全升级。
KMS里支持直接创建数据库凭据 创建账号: 凭据管理-数据库凭据-创建数据库凭据

双账号托管和单账号托管的区别:
- 双账号托管用于程序化访问数据库场景:托管两个相同权限的账号,保证口令重置切换的瞬间,程序访问不被中断。
- 单账号托管用于高权限账号或者人工运维账号托管,口令重置切换的瞬间,凭据的“当前版本”可能暂时无法使用。
自动轮转: 
验证结果:


Java连接访问方式:
https://help.aliyun.com/zh/kms/key-management-service/developer-reference/secrets-manager-jdbc?spm=a2c4g.11186623.help-menu-28933.d_5_1_1_1.5276471dzwqAhU
支持KMS里的RDS凭据同步到ACK的secret, 且轮转后也会同步过去 部署流程: - 安装插件ack-secret-manager
- 登录容器服务管理控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm。
- 在Helm页面,单击创建,在Chart区域搜索并选中ack-secret-manager,其他设置保持默认,然后单击下一步。根据弹出的页面提示确认,组件将被安装在默认的kube-system命名空间中,并以组件名称发布应用。如果您需要自定义应用名和命名空间,请根据页面提示设置。

- 在参数配置页面,选择Chart版本为最新版本,并设置相应参数,然后单击确定。
- 需开启RRSA认证功能,您需要将参数rrsa.enable设置为true。

- 如需开启定时同步凭据功能,您需要配置如下参数。

command.disablePolling:是否关闭凭据的自动轮询功能,设置为false,开启凭据自动轮询功能。
command.pollingInterval:凭据同步的频率,设置为120s,此处以两分钟同步一次凭据为例,您可以根据实际需求调整。
注意:这里我们使用自动轮转,定时轮转不开
- 配置限流参数:如果您集群中具有较多的ExternalSecret(待同步的 KMS 凭据),配置不当可能会引发KMS或RAM侧的限流,因此,您需要配置以下限流参数避免发生限流。

command.maxConcurrentKmsSecretPulls:每秒可以同步的最大KMS凭据数量,默认为10。 注意:当待同步的凭据不多,默认即可
- 如需指定KMS服务Endpoint地址,您需要配置kmsEndpoint参数。

command.kmsEndpoint:参数支持KMS服务的共享网关和专属网关,可按需配置,该参数是全局配置,当前也支持凭据级的配置,具体的配置说明请参见下文配置KMS服务Endpoint地址。
配置流程: KMS凭据轮转后会自动同步到ACK Secret。双账号托管时,可通过RRSA认证机制实现跨账号权限访问,确保轮转凭据能同步到目标集群。需提前配置ExternalSecret资源并指定凭据名称与Secret键名。
RRSA适用于1.22及以上版本的ACK托管集群和ACK Serverless集群。相比其他授权方式,RRSA授权方式可以实现Pod维度的权限隔离,还可以避免直接使用AK、SK引起的凭据泄露风险。
- 在容器服务管理控制台开启集群的RRSA功能,用于创建集群的身份提供商信息。具体操作,请参见启用RRSA功能。
- 创建可信实体为身份提供商的RAM角色,以供ack-secret-manager使用。
选择主体为身份提供商,添加主体时主要参数设置如下,具体操作,请参见创建OIDC身份提供商的RAM角色。

c. 创建自定义权限策略并为上一步创建的RAM角色授权。 创建角色:




创建权限策略并授权:

d. 创建自定义资源SecretStore关联对应的认证方式并部署。 使用以下内容,替换相关字段后,创建secretstore-rrsa.yaml文件。
{accountID}:替换为同步KMS凭据的阿里云账号ID(主账号ID)。 {clusterID}:替换为您的集群ID。
{roleName}:替换为步骤2中创建的RAM角色名称。
Plain Text
apiVersion: ‘alibabacloud.com/v1alpha1’
kind: SecretStore
metadata:
name: scdemo-rrsa
spec:
KMS:
KMSAuth:
oidcProviderARN: “acs:ram::{accountID}:oidc-provider/ack-rrsa-{clusterID}”
ramRoleARN: “acs:ram::{accountID}:role/{roleName}”AccountID: 为阿里云主账号ID 
执行以下命令,部署SecretStore。
Bash
kubectl apply -f secretstore-rrsa.yaml -n kube-system# 查看
kubectl –kubeconfig xxx-config get SecretStore -A
NAMESPACE NAME AGE
kube-system scdemo-rrsa 5s配置同步流程: 认证信息配置完成后,您需要通过自定义资源ExternalSecret来配置待访问的KMS凭据信息,从而将KMS凭据导入到Kubernetes Secret。 创建自定义资源ExternalSecret并部署。
i. 使用以下内容,替换相关字段后,创建external.yaml文件。 
RRSA的方式: YAML apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: rds-kms-sync #保密字典的名称 spec: provider: kms data: - key: test name: ack-rds-test #保密字典里的key versionStage: ACSCurrent secretStoreRef: name: scdemo-rrsa #上面创建自定义资源SecretStore的名称 namespace: kube-system
备注: i. {KMS secret name} – KMS凭据名称

ii. {Kubernetes secret key} – k8s保密字典其中一个名称的key

iii. {KMS secret version stage} – 使用的凭据版本号,值写ACSCurrent,这样会一直用当前最新的版本号
iv. {secret store name} – 就是上面创建的自定义资源名称也是K8S存储secret的名称



v. {secret store namespace} – 是k8s的namespace,本例为kube-system Work ram的方式:
YAML apiVersion: 'alibabacloud.com/v1alpha1' kind: ExternalSecret metadata: name: esdemo namespace: kube-system spec: provider: kms # 需要同步的阿里云服务类型,默认是kms,当同步KMS凭据时,可以不填写该字段或者指定字段值为 kms data: # 无需特殊处理的数据源。 - key: test name: ack-rds-test # secretStoreRef: # 组件通过Worker RAM授权时,无需配置该参数。 # name: scdemo-rrsa # namespace: kube-system
查看效果 Plain Text kubectl --kubeconfig xxx-config get ExternalSecret -n kube-system -o yaml
使用Work RAM授权 
结果

注意事项 - 如果要到pod级别的授权,需要调研并测试通过RRSA授权模式
2.轮转后的旧账号保留一个轮转周期,再下次轮转后才会更新
3.可以创建自定义资源同步多个凭据,但建议分开做隔离
参考文献 授权相关:https://help.aliyun.com/zh/kms/key-management-service/user-guide/integrate-kms-secrets-into-ack?spm=5176.2020520104.console-base_help.dexternal.8e143a98wJpzVL 配置参考:https://help.aliyun.com/zh/ack/serverless-kubernetes/security-and-compliance/use-ack-secret-manager-to-import-alibaba-cloud-kms-service-credentials?spm=5176.2020520104.console-base_help.dexternal.8e143a98wJpzVL#9c937a6ae5o18