介绍
ack-secret-manager支持以Kubernetes Secret实例的形式向集群导入或同步KMS凭据信息,确保您集群内的应用能够安全地访问敏感信息。通过该组件,您可以实现密钥数据的自动更新,使应用负载通过文件系统挂载指定Secret实例来使用凭据信息,同时帮助您解决负载应用和阿里云凭据管家交互的兼容性问题。
模块图(Modules Digram)
集成
ACK 即是Aliyun Kubernetes, 阿里云提供了若干版本的k8s云上集群,这边测试选用ack-serverless版本。
假设你有一套ack(ali cloud k8s)集群,一般来说我们的敏感数据会选用k8s secrets组件来存储。如下:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
namespace: my-namespace
type: Opaque
data:
xx_token: <BASE64ENCODE Your Secret Value>
xx_token 一般来说默认的加密是基于base64。但是这样的加密程度是远远不够的。几乎还是裸奔的存在。但是我们也可以依赖一些插件选择合适的加密算法进行加密来避免简单base64 encode。这是一种解决方案。
由于aliyun已经提供了一个密钥凭据管理的组件KMS。他在提供了加密存储的同时也对加解密的性能提供了SLA和Latency的保证。支持一些rotate的策略,并且支持多个VPC账号的访问,对于企业级应用来说是个不错的选择。
那么我们接下来就操作下如何在ack中集成kms,让你的pod可以访问使用kms的凭据。
安装ack-secret-manager组件
手动方式
- 登录容器服务管理控制台,在左侧导航栏选择集群。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择应用 > Helm。
- 在Helm页面,单击创建,在Chart区域搜索并选中ack-secret-manager,其他设置保持默认,然后单击下一步。根据弹出的页面提示确认,组件将被安装在默认的kube-system命名空间中,并以组件名称发布应用。如果您需要自定义应用名和命名空间,请根据页面提示设置。
- 在参数配置页面,选择Chart版本为最新版本,并设置相应参数,然后单击确定。- 如需开启RRSA认证功能,您需要将参数rrsa.enable设置为true。
创建成功后,会自动跳转到目标集群的ack-secret-manager页面,检查安装结果。若下图中所有资源创建成功,则表明组件安装成功。
Helm安装ack-secret-manager
helm 配置链接你的ack集群,请自行查询helm 使用。简单来说是在kubectl之上封装了一层,可以帮我们生成我们需要发布的yaml并且带有版本控制概念。
- 首先安装helm,然后下载ack-secret-manger的chart包 下载地址:https://github.com/AliyunContainerService/ack-secret-manager/tree/master
- 运行命令安装
helm install ./ack-secret-manager ack-secret-manager
配置组件认证信息RRSA
说明
安装ack-secret-manager时,需要将参数rrsa.enable设置为true,以启用RRSA功能。
- 在容器服务管理控制台开启集群的RRSA功能。具体操作,请参见启用RRSA功能。
- 创建可信实体为身份提供商的RAM角色,以供ack-secret-manager使用。说明阿里云账号(主账号)对账号中的资源具有完全管理权限,您也可以在RAM中创建一个RAM用户,授予AdministratorAccess权限,充当账号管理员,该管理员可以对账号下所有云资源进行管控操作。更多信息,请参见创建RAM用户作为账号管理员。1. 使用阿里云账号(主账号)登录RAM控制台。2. 在左侧导航栏,选择身份管理 > 角色。3. 在角色页面,单击创建角色。4. 在创建角色页面,选择可信实体类型为身份提供商,然后单击下一步。5. 在配置角色页面,配置如下角色信息后,单击完成。
置项
描述
角色名称
自定义角色名称。
备注
选填有关该角色的备注信息。
身份提供商类型
OIDC。
选择身份提供商
ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。
限制条件
说明
如果您将ack-secret-manager安装在其他的命名空间,请将
kube-system
替换为对应命名空间的名称。
- oidc:iss:保持默认。
- oidc:aud:选择sts.aliyuncs.com。
- oidc:sub:条件判定方式选择StringEquals,值的格式为**system:serviceaccount:<namespace>:<serviceAccountName>**。-
<namespace>
:应用所在的命名空间。-<serviceAccountName>
:服务账户名称。 - 根据测试应用的信息,此处需要填入
system:serviceaccount:kube-system:ack-secret-manager
。
terraform 创建, 关于terraform语法自行百度或者查阅官方文档。
# Role
resource "alicloud_ram_role" "default" {
name = role_name
document = <<EOF
{
"Statement": [
{
"Action": "sts:AssumeRole",
"Condition": {
"StringEquals": {
"oidc:aud": [
"sts.aliyuncs.com"
],
"oidc:iss": "https://oidc-ack-<region>.oss-<regionID>.aliyuncs.com/<your-ack-cluster-id>",
"oidc:sub": "system:serviceaccount:<your namespace>:<service account name>"
}
},
"Effect": "Allow",
"Principal": {
"Federated": [
"<oidc-provider-arn>"
]
}
}
],
"Version": "1"
}
EOF
description = "desc"
}
创建自定义授权策略并为上一步创建的RAM角色授权。
- 创建ack-secret-manager导入KMS凭据时所需的权限策略。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow"}
使用terraform创建, 关于terraform语法自行百度或者查阅官方文档。resource "alicloud_ram_policy" "default" { policy_name = your policy name policy_document = <<EOF { "Version": "1", "Statement": [ { "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": "*", "Effect": "Allow" } ] } EOF description = "desc"}
- 为上一步创建的RAM角色授权。具体操作,请参见为RAM角色授权。- 创建自定义资源SecretStore关联对应的认证方式并部署。- 使用以下内容,替换相关字段后,创建secretstore-rrsa.yaml文件。 1.
{roleName}
:替换为步骤2中创建的RAM角色名称。 2.{clusterID}
:替换为您的集群ID。 3.{accountID}
:替换为同步KMS凭据的阿里云账号ID。
- 为上一步创建的RAM角色授权。具体操作,请参见为RAM角色授权。- 创建自定义资源SecretStore关联对应的认证方式并部署。- 使用以下内容,替换相关字段后,创建secretstore-rrsa.yaml文件。 1.
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}"
执行以下命令,部署SecretStore。
配置数据同步信息
认证信息配置完成后,您需要通过自定义资源ExternalSecret来配置待访问的KMS凭据信息,从而将KMS凭据导入到Kubernetes Secret。
创建自定义资源ExternalSecret并部署。
- 使用以下内容,替换相关字段后,创建external.yaml文件。
apiVersion: 'alibabacloud.com/v1alpha1'kind: ExternalSecretmetadata: name: esdemospec: data: # 无需特殊处理的数据源。 - key: {KMS secret name} name: {Kubernetes secret key} versionStage: {KMS secret version stage} secretStoreRef: name: {secret store name} namespace: {secret store namespace}
2.执行以下命令,部署ExternalSecret。kubectl apply -f external.yaml
执行以下命令,查看集群中是否存在对应的Kubernetes Secret生成。
kubectl get secret esdemo
查询存在Secret,表明Secret同步成功。
版权归原作者 Cat_Xu 所有, 如有侵权,请联系我们删除。