使用阿里云KMS进行Secret的落盘加密

容器计算服务 ACS(Container Compute Service)中,您可以使用在阿里云密钥管理服务 KMS(Key Management Service)中创建的密钥加密Kubernetes Secret密钥。本文主要介绍如何使用KMS管理的密钥对ACS集群中的Kubernetes Secret密钥数据进行落盘加密。

前提条件

  • 已在密钥管理服务控制台创建KMS密钥,且密钥地域与目标ACS集群所在地域保持一致。

    重要

    Secret落盘加密仅支持1.28及以上版本的ACS集群。

  • 根据您使用账号类型的不同,确认已完成如下授权操作。

    • 阿里云账号:已授权容器服务账号使用AliyunCCManagedSecurityRole系统角色的权限。如果您使用的账号未授权,开启Secret落盘加密时,ACS控制台会提示您进行KMS安全系统角色授权,您也可以访问云资源访问授权页面完成授权。

    • RAM用户或RAM角色:

Secret加密介绍

Kubernetes集群中,通常使用Secret密钥模型存储和管理业务应用涉及的敏感信息,例如应用密码、TLS证书、Docker镜像下载凭据等。Kubernetes会将所有的Secret密钥对象数据存储在集群对应的etcd中。关于密钥的更多信息,请参见Secrets

ACS集群使用社区KMS v2接口实现落盘加密,可以在集群中支持管理更多的Secret实例,并获得更好的加解密性能。同时,ACS集群支持默认密钥、软件密钥和硬件密钥,您可以按业务需求选择。关于KMS密钥管理的更多信息和相关操作,请参见密钥管理快速入门;关于KMS服务计费的详细说明,请参见产品计费

重要

开启落盘加密功能时,请勿使用KMS的控制台或OpenAPI禁用或删除集群Secret加解密所选择的密钥,否则会导致集群API Server不可用,继而无法正常获取SecretServiceAccount等对象,影响业务应用的正常运行。

更多信息,请参见KMS Encryption Provider机制使用KMS密钥进行信封加密

ACS集群开启Secret落盘加密

为新建的ACS集群开启Secret落盘加密

  1. 登录容器计算服务控制台,在左侧导航栏选择集群

  2. 集群页面,单击页面左上角的创建集群

  3. 在页面下方,展开显示高级选项,找到Secret落盘加密,勾选选择KMS密钥,然后在下拉框中选择KMS密钥ID。按需配置其他配置项后,单击确认配置。创建ACS集群的其他配置,请参见创建ACS集群

    image

登录操作审计控制台,在左侧导航栏单击事件查询,如果事件查询页面存在使用aliyuncsmanagedsecurityrole系统角色的加密和解密事件日志,表明该集群后台已成功开启Secret落盘加密特性。

当您不需要使用Secret落盘加密功能时,可在集群信息 > 基本信息页签,然后在安全和审计区域关闭Secret 落盘加密开关。

为已创建的ACS集群开启Secret落盘加密

  1. 登录容器计算服务控制台,在左侧导航栏选择集群

  2. 集群页面,单击目标集群ID,然后在左侧导航栏,选择集群信息

  3. 集群信息页面,单击基本信息页签,然后在安全与审计区域单击Secret 落盘加密后的开启

  4. 在弹出的Secret落盘加密对话框,选择已有的KMS密钥,然后单击确定

    如果您未创建KMS密钥,请单击创建密钥,前往密钥管理服务控制台创建密钥。具体操作,请参见创建密钥

    当集群状态由更新中变为运行中时,表明该集群的Secret落盘加密特性已开启。

    当您不需要使用Secret落盘加密功能时,可在安全与审计区域关闭Secret落盘加密开关。

使用自动轮转密钥开启Secret落盘加密

您可以使用KMS自动轮转密钥功能进行Secret的落盘加密。当密钥发生自动轮转时,存量的Secret仍旧使用轮转前的密钥版本进行加密,新增的Secret将使用轮转后的新密钥版本进行加密。关于自动轮转密钥具体操作,请参见密钥轮转

如需确保存量的Secret也使用新的密钥版本进行加密,请在密钥发生自动轮转后,执行以下命令强制使用新的密钥版本重新加密所有存量的Secret。

kubectl get secrets --all-namespaces -o json | kubectl annotate --overwrite -f - encryption-key-rotation-time="$(date -u +'%Y-%m-%dT%H:%M:%S%z')"

常见问题

开启Secret落盘加密后,通过kubectl命令获取到的Secret是加密后的密文吗?

不是。Secret落盘加密功能所加密的是etcd中存储的原始数据,即开启Secret落盘加密后,etcd中存储的Secret数据将是加密后的密文数据。但客户端通过API Server提供的Secret API获取到的Secret数据仍旧是原始的明文数据。

如何禁止RAM用户或RAM角色在已创建的ACS集群中开启或关闭Secret落盘加密功能

您可以通过为RAM用户或RAM角色授予如下拒绝操作的RAM权限策略,禁止该RAM用户或RAM角色在已创建的ACS集群中开启或关闭Secret落盘加密功能。具体操作,请参见RAM用户或RAM角色授予RAM权限

  {
      "Action": [
          "cs:UpdateKMSEncryption"
      ],
      "Effect": "Deny",
      "Resource": [
          "*"
      ]
  }