csi-secrets-store-provider-alibabacloud支持以Kubernetes Secret实例的形式向集群导入或同步KMS凭据信息,确保您集群内的应用能够安全地访问敏感信息;还支持通过CSI Inline的形式将凭据密钥作为文件系统直接挂载到应用程序中,适用于通过文件系统接口(例如读取文件)来获取敏感信息的应用。通过该组件,您可以实现密钥数据的自动更新,从而降低凭据密文在Secrets实例中暴露的可能,同时帮助您解决负载应用和阿里云凭据管家交互的兼容性问题。
安全说明
默认情况下,您直接从文件系统读取密钥和阿里云KMS凭据管家之间的直接交互可能存在兼容性问题,csi-secrets-store-provider-alibabacloud可以用于解决此类兼容性问题,同时支持将密钥同步创建为集群中的Kubernetes原生Secrets实例,以供环境变量挂载使用。使用前请您评估如下的安全风险。
当密钥在文件系统中可以被访问时,如果应用中存在某些有缺陷的软件,该软件的漏洞可能会造成目录遍历的风险,导致敏感信息泄露。
由于一些Debug端点或Logs权限的误配置都可能导致密钥泄露,所以通过环境变量挂载引用的方式消费密钥是一个不安全且不推荐的方式。
当开启Secret实例同步特性时,需要基于权限最小化原则严格控制访问权限。
鉴于上述原因,如果应用中并不需要密文的持久化存储,推荐使用通过RRSA配置ServiceAccount的RAM权限实现Pod权限隔离为应用配置Pod维度的最小化权限,并通过凭据管理直接在应用中获取密钥凭据,以减少密钥内容在Pod文件系统或Kubernetes集群Secrets中的暴露风险。
前提条件
已创建符合如下要求的ACK集群。具体操作,请参见创建ACK托管集群、通过控制台创建注册集群。
集群为1.20及以上版本。支持ACK托管集群、ACK专有集群、ACK注册集群,暂不支持ACK Serverless集群。
集群与您的KMS服务凭据需要在同一地域。
步骤一:配置组件认证信息
您需要配置csi-secrets-store-provider-alibabacloud的认证信息,以确保该组件有权限获取KMS服务中的凭据信息,否则csi-secrets-store-provider-alibabacloud将无法向集群中导入或同步凭据信息。您可以根据集群类型选择如下三种授权方式进行配置。
通过RRSA授权:适用于1.22及以上版本的ACK托管集群。
为集群对应的Worker RAM角色添加权限:适用于ACK托管集群、ACK专有集群和ACK注册集群。
通过设置AK扮演指定RAM角色:适用于所有容器服务Kubernetes集群。
通过RRSA授权
RRSA适用于1.22及以上版本的ACK托管集群。相比其他授权方式,RRSA授权方式可以实现Pod维度的权限隔离,还可以避免直接使用AK、SK引起的凭据泄露风险。
创建可信实体为身份提供商的RAM角色,以供csi-secrets-store-provider-alibabacloud使用。
使用阿里云账号(主账号)登录RAM控制台。
说明阿里云账号(主账号)对账号中的资源具有完全管理权限,您也可以在RAM中创建一个RAM用户,授予AdministratorAccess权限,充当账号管理员,该管理员可以对账号下所有云资源进行管控操作。更多信息,请参见创建RAM用户作为账号管理员。
在左侧导航栏,选择 。
在角色页面,单击创建角色。
在创建角色页面,选择可信实体类型为身份提供商,然后单击下一步。
在配置角色页面,配置如下角色信息后,单击完成。
配置项
描述
角色名称
自定义角色名称。
备注
选填有关该角色的备注信息。
身份提供商类型
OIDC。
选择身份提供商
ack-rrsa-<cluster_id>。其中,<cluster_id>为您的集群ID。
限制条件
oidc:iss:保持默认。
oidc:aud:选择sts.aliyuncs.com。
oidc:sub:条件判定方式选择StringEquals,值的格式为system:serviceaccount:<namespace>:<serviceAccountName>。
<namespace>
:应用所在的命名空间。<serviceAccountName>
:服务账户名称。
根据测试应用的信息,此处需要填入
system:serviceaccount:kube-system:csi-secrets-store-provider-alibabacloud
。说明建议您将组件安装在默认的
kube-system
命名空间下。如果您将csi-secrets-store-provider-alibabacloud安装在其他的命名空间,请将kube-system
替换为对应命名空间的名称。
创建自定义授权策略并为上一步创建的RAM角色授权。
在集群中创建名为alibaba-credentials的Secret,配置模板如下,需要替换部分字段。
使用以下内容,替换相关字段后,创建secretstore-rrsa.yaml文件。
{rolearn}
:替换为步骤2创建的RAM角色的ARN(需要Base64编码)。{sessionname}
:替换为角色会话名称(需要Base64编码)。{oidcproviderarn}
:替换为集群开启RRSA后生成的提供商ARN(需要Base64编码)。
apiVersion: v1 data: rolearn: {rolearn} rolesessionname: {sessionname} oidcproviderarn: {oidcproviderarn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque
执行以下命令,部署Secret。
kubectl apply -f secretstore-rrsa.yaml
为集群对应的Worker RAM角色添加权限
适用于ACK托管集群、ACK专有集群和ACK注册集群
创建如下自定义权限策略。具体操作,请参见创建自定义权限策略。
{ "Action": [ "kms:GetSecretValue", "kms:Decrypt" ], "Resource": [ "*" ], "Effect": "Allow" }
为集群的WorkerRole添加上一步创建的自定义权限。具体操作,请参见为集群的Worker RAM角色授权
通过设置AK扮演指定RAM角色
适用于所有容器服务Kubernetes集群。
创建可信实体为阿里云账号的RAM角色,以供csi-secrets-store-provider-alibabacloud组件使用。具体操作,请参见创建可信实体为阿里云账号的RAM角色。
创建自定义授权策略并为上一步已创建的RAM角色授权。
创建扮演上述角色的自定义授权策略,并为指定的RAM用户授权。
在集群中创建名为alibaba-credentials的Secret,配置模板如下,需要替换部分字段。
使用以下内容,替换相关字段后,创建alibaba-credentials.yaml文件。
{rolearn}
:替换为步骤1已创建的RAM角色的ARN(需要Base64编码)。{sessionname}
:替换为角色会话名称 (需要Base64编码)。{ak}
:替换为RAM用户的AK(需要Base64编码)。{sk}
:替换为RAM用户的SK(需要Base64编码)。apiVersion: v1 data: id: {ak} rolesessionname: {sessioname} secret: {sk} rolearn: {rolearn} kind: Secret metadata: name: alibaba-credentials namespace: kube-system type: Opaque
执行以下命令,部署Secret。
kubectl apply -f alibaba-credentials.yaml
步骤二:安装csi-secrets-store-provider-alibabacloud组件
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在Helm页面,单击创建,在Chart区域搜索并选中csi-secrets-store-provider-alibabacloud,其它设置保持默认,然后单击下一步。
根据弹出的页面提示确认,组件将被安装在默认的kube-system命名空间中,并以组件名称发布应用。如果您需要自定义应用名和命名空间,请根据页面提示设置。
选择Chart版本为最新版本,在参数区域根据步骤一选择的认证方式,设置相关参数,然后单击确定。
如果选择通过RRSA授权,您需要将参数
rrsa.enable
设置为true,以开启RRSA认证功能。其他相关参数配置如下。
envVarsFromSecret: # ACCESS_KEY_ID: # secretKeyRef: alibaba-credentials # key: id # SECRET_ACCESS_KEY: # secretKeyRef: alibaba-credentials # key: secret ALICLOUD_ROLE_ARN: secretKeyRef: alibaba-credentials key: rolearn ALICLOUD_ROLE_SESSION_NAME: secretKeyRef: alibaba-credentials key: rolesessionname # ALICLOUD_ROLE_SESSION_EXPIRATION: # secretKeyRef: alibaba-credentials # key: rolesessionexpiration ALICLOUD_OIDC_PROVIDER_ARN: secretKeyRef: alibaba-credentials key: oidcproviderarn
如果选择为集群对应的Worker RAM角色添加权限,您可以采用默认参数配置直接安装。
如果选择通过设置AK扮演指定RAM角色,您需要配置如下相关参数。
envVarsFromSecret: ACCESS_KEY_ID: secretKeyRef: alibaba-credentials key: id SECRET_ACCESS_KEY: secretKeyRef: alibaba-credentials key: secret ALICLOUD_ROLE_ARN: secretKeyRef: alibaba-credentials key: rolearn ALICLOUD_ROLE_SESSION_NAME: secretKeyRef: alibaba-credentials key: rolesessionname # ALICLOUD_ROLE_SESSION_EXPIRATION: # secretKeyRef: alibaba-credentials # key: rolesessionexpiration # ALICLOUD_OIDC_PROVIDER_ARN: # secretKeyRef: alibaba-credentials # key: oidcproviderarn
如需开启定时同步凭据的功能,需要配置如下相关参数。
secrets-store-csi-driver.enableSecretRotation
:是否开启凭据的自动轮询功能,设置为true,开启凭据自动轮询功能。secrets-store-csi-driver.rotationPollInterval
:凭据同步的频率,设置为120s,此处以两分钟同步一次凭据为例,您可以根据实际需求调整。
创建成功后,会自动跳转到目标集群的csi-secrets-store-provider-alibabacloud页面,检查安装结果。若下图中所有资源创建成功,则表明组件安装成功。
步骤三:配置数据同步信息
认证信息配置完成后,您需要通过SecretProviderClass来进行KMS凭据信息的配置。
配置模板说明
SecretProviderClass模板格式定义如下所示。
apiVersion: secrets-store.csi.x-k8s.io/v1alpha1
kind: SecretProviderClass
metadata:
name: <NAME>
spec:
provider: alibabacloud # 此处配置固定为'alibabacloud'。
parameters:
其中parameters
通常包含挂载请求的三个字段:
参数 | 类型 | 说明 |
objects | 必选 | 挂载Secrets凭据的YAML配置声明。例如
|
region | 可选 | 用于请求指定Region下的阿里云凭据管家后端。如果不指定该参数,则默认使用节点对应的阿里云Region。但在大规模应用Pod部署时,可能会带来额外的性能开销,所以推荐配置该参数指定Region。 |
pathTranslation | 可选 |
|
配置使用示例
本示例以ACK托管集群同一地域下的KMS服务凭据test
为例,介绍如何通过SecretProviderClass将其导入到集群应用中。
使用以下简单的SecretProviderClass示例,创建secretstore.yaml文件。
apiVersion: secrets-store.csi.x-k8s.io/v1 kind: SecretProviderClass metadata: name: test-secrets spec: provider: alibabacloud # 此处固定配置为alibabacloud。 parameters: objects: | - objectName: "test"
执行以下命令,部署SecretProviderClass。
kubectl apply -f secretstore.yaml
使用以下内容,创建deploy.yaml。
包含一个Nginx Deployment实例,通过CSI Inline文件系统的形式声明使用了上面示例中已经创建的SecretProviderClass,并在Pod中的
/mnt/secrets-store
目录下挂载凭据密钥。关于Deployment实例更多信息,请参见Deployment示例。apiVersion: apps/v1 # 1.8.0之前版本请使用apps/v1beta1。 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: volumes: - name: secrets-store-inline csi: driver: secrets-store.csi.k8s.io readOnly: true volumeAttributes: secretProviderClass: "test-secrets" containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 # 替换为您的实际镜像。 ports: - containerPort: 80 resources: limits: cpu: "500m" volumeMounts: - name: secrets-store-inline mountPath: "/mnt/secrets-store" readOnly: true
执行以下命令,部署Deploy应用。
kubectl apply -f deploy.yaml
验证密钥是否被正常挂载。
登录Pod查看Secret的目标挂载路径
/mnt/secrets-store
下是否已经创建了SecretProviderClass实例中指定密钥名称为文件名的密钥文件,同时查看文件内容是否为KMS凭据中指定的密文。
相关文档
如果您需要为ACK Serverless集群中的应用导入阿里云KMS凭据,请参见使用ack-secret-manager导入阿里云KMS服务凭据。
为了保护从KMS读取后缓存在ACK集群中的Secret,您可以对ACK集群Secret进行一键加密。具体操作,请参见使用阿里云KMS进行Secret的落盘加密。