在ACK集群中基于机密虚拟机实现CAA机密容器方案

在金融风控、医疗健康等需要实现机密计算的场景下,您可以在ACK集群中通过CAA(Cloud API Adaptor)方案部署机密计算工作负载,基于Intel® TDX技术保护敏感数据免受外部攻击或云厂商的潜在威胁,以满足行业的合规要求。

Intel® TDX是一项基于CPU硬件的ECS保护技术,详情请参见TDX介绍

功能介绍

CAA( Cloud API Adaptor,也称 Peer Pods)是云原生CNCF机密容器Confidential Containers项目的核心组件之一,可通过调用云平台 OpenAPI 将机密计算能力无缝集成到 Kubernetes 集群中,自动创建机密虚拟机。这些虚拟机可作为特殊的“机密沙箱”来运行工作负载 Pod,使用底层硬件的 TEE 技术来保护工作负载的运行时数据安全。优势如下。

  • 简单易用:无需运维底层裸金属架构或嵌套虚拟化技术栈,连接ACK集群后可通过kubectl命令部署机密计算工作负载。

  • 安全机密:工作负载运行在ECS机密虚拟机中,基于硬件级内存加密与隔离机制确保运行时数据的完整性与机密性。

  • 开源兼容:ACK协同Confidential Containers社区实现了在集群中基于 CAA 方案部署机密计算工作负载,通过代码开源透明化(Code Transparency)接受社区持续审计。

您可以在ACK集群中部署 CAA DaemonSet,然后在此基础上部署机密计算工作负载。工作负载会以Pod的形式创建并运行在机密虚拟机内,从而保证整个容器生命周期的运行时数据安全,防止虚拟机之外的攻击者攻击。流程如下。

image

准备工作

步骤一:配置RRSA

为了让CAA在机密容器场景下能够管理和配置机密虚拟机,您需要配置必要的身份(RAM 角色)和权限(RAM 策略)。下文介绍如何让Cloud API Adaptor ServiceAccount获得操作ECSVPC资源的权限,实现Pod级别的精细权限控制。

1、创建RAM角色

请参见创建可信实体为身份提供商的RAM角色创建一个RAM角色。本示例RAM角色名为ack-caa-demo,主要参数如下。

配置项

描述

身份提供者类型

OIDC。

身份提供者

选择ack-rrsa-<CLUSTER_ID>。其中,<CLUSTER_ID>为集群ID。

条件

  • oidc:iss:保持默认。

  • oidc:aud:保持默认。

  • oidc:sub:手动添加该条件,进一步精确可扮演RAM角色的ServiceAccount(confidential-containers-system命名空间下的Cloud API Adaptor)。

    • 条件键:选择oidc:sub

    • 运算符:选择StringEquals

    • 条件值:输入system:serviceaccount:confidential-containers-system:cloud-api-adaptor

角色名称

ack-caa-demo。

创建后,您可以在RAM角色详情页面的基本信息区域,获取其ARN,供后续配置身份认证使用。

2、创建权限策略

  1. 参见下方脚本创建一个名为 ack-caa-policy的 RAM 权限策略,授予ECSVPC的操作权限。操作入口,请参见创建自定义权限策略

    {
      "Version": "1",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "ecs:RunInstances",
            "ecs:DeleteInstance",
            "ecs:DescribeInstanceAttribute",
            "ecs:CreateNetworkInterface",
            "ecs:DeleteNetworkInterface",
            "ecs:AttachNetworkInterface",
            "ecs:ModifyNetworkInterfaceAttribute",
            "ecs:DescribeNetworkInterfaceAttribute"
          ],
          "Resource": "*"
        },
        {
          "Effect": "Allow",
          "Action": [
            "vpc:DescribeVSwitchAttributes",
            "vpc:AllocateEipAddress",
            "vpc:ReleaseEipAddress",
            "vpc:AssociateEipAddress",
            "vpc:UnassociateEipAddress",
            "vpc:DescribeEipAddresses"
          ],
          "Resource": "*"
        }
      ]
    }
  2. 为此前创建的RAM角色授予权限策略ack-caa-policy。操作入口,请参见RAM角色授权

步骤二:创建节点池并配置安全组

您需要创建一个节点池,用于部署 CAA 方案的控制器工作负载。同时,您还需配置节点池的安全组规则,开放 CAA 方案依赖的特定端口。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 单击创建节点池,按照页面提示完成节点池的配置。

    下表仅介绍主要配置项。详细配置项说明请参见创建和管理节点池

    配置项

    描述

    托管配置

    选择不开启

    交换机

    选择可用区IvSwitch,节点池会在该可用区下弹出节点。

    操作系统

    Ubuntu 22.04 64

    期望节点数

    节点池初始节点数量,需为1个节点及以上。

    以下为高级配置(页面下拉,展开高级选项(选填)

    节点标签(Labels)

    新增如下节点标签,便于CAA控制器的调度。

    • 键:node.kubernetes.io/worker

    • 值:留空

  4. 在节点池列表,单击节点池名称,然后单击基本信息页签,在节点池信息区域单击安全组ID,跳转至安全组详情页面。

  5. 入方向区域,单击增加规则,增加如下两条规则。

    协议

    访问来源

    访问目的

    说明

    自定义TCP

    VPC网段

    15150

    支持CAA组件与机密虚拟机之间的安全通信。

    自定义UDP

    VPC网段

    4789

    基于VXLAN实现机密容器的网络管理。

步骤三:部署 CAA

请参见下文部署CAA的两个核心组件:

  • CoCo(Confidential Containers) Operator:负责自动化部署和管理机密容器所需的运行时环境,例如Kata Containers的远程运行时Kata Remote Runtime。

  • CAA(Cloud API Adaptor) DaemonSet:CAADaemonSet的形式部署在节点上,可根据Pod调度请求动态创建机密虚拟机作为Pod的运行时节点。

1、安装CoCo Operator

参见以下命令进行安装。

kubectl apply -k "https://github.com/AliyunContainerService/coco-operator/config/release"
kubectl apply -k "https://github.com/AliyunContainerService/coco-operator/config/samples/ccruntime/peer-pods"

2、部署 CAA DaemonSet

  1. 下载项目源码。

    git clone https://github.com/confidential-containers/cloud-api-adaptor.git -b v0.14.0
    cd cloud-api-adaptor
  2. 修改 src/cloud-api-adaptor/install/overlays/alibabacloud/kustomization.yaml 文件中的安全组和交换机ID,以便虚拟机能够正确接入网络环境。

    参数

    说明

    SECURITY_GROUP_IDS

    修改为步骤二所创建的节点池的安全组ID。

    VSWITCH_ID

    修改为步骤二所创建的节点池在可用区I下的交换机ID。

  3. 新建文件 src/cloud-api-adaptor/install/overlays/alibabacloud/alibabacloud-cred.env,配置身份认证。内容如下。

    替换<role_arn>RAM 角色ARN,<provider_arn>RRSA OIDC的提供商 ARN。

    ALIBABA_CLOUD_ROLE_ARN=<role_arn>
    ALIBABA_CLOUD_OIDC_PROVIDER_ARN=<provider_arn>
    ALIBABA_CLOUD_OIDC_TOKEN_FILE=/var/run/secrets/ack.alibabacloud.com/rrsa-tokens/token
  4. 部署CAA工作负载。

    kubectl apply -k src/cloud-api-adaptor/install/overlays/alibabacloud

    等待大概3分钟后,检查部署状态。

    kubectl -n confidential-containers-system get pod 

    预期输出:

    NAME                                              READY   STATUS    RESTARTS   AGE
    cc-operator-controller-manager-5d79465b47-d8s2k   1/1     Running   0          2m11s
    cc-operator-daemon-install-trlvt                  1/1     Running   0          108s
    cc-operator-pre-install-daemon-qpvzw              1/1     Running   0          117s
    cloud-api-adaptor-daemonset-46spp                 1/1     Running   0          92s

    预期输出包含 cc-operator-* 和 cloud-api-adaptor-daemonset-*组件,状态均为 Running,表明部署成功。 

步骤四:部署示例应用

下文将部署一个示例应用,使用 runtimeClassName: kata-remote 为机密容器运行时。当Pod调度时,Kata Remote将触发CAA动态创建一台TDX机密虚拟机。

重要

后续如需删除集群,删除集群前,请先删除所有使用runtimeClassName: kata-remote的工作负载,以避免CAA创建的机密虚拟机资源残留。

  1. 将以下文件保存为pod-caa-demo.yaml,用于部署一个使用机密容器运行时的Pod。

    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-caa-demo
    spec:
      runtimeClassName: kata-remote
      containers:
        - image: alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest
          name: hello
          command:
          - sh
          - -c
          - 'echo hello && sleep infinity'
  2. 部署pod-caa-demo.yaml。

    kubectl apply -f pod-caa-demo.yaml

    等待大概3分钟,确认应用是否部署成功。

    kubectl get pod pod-caa-demo

    预期输出:

    NAME           READY   STATUS    RESTARTS   AGE
    pod-caa-demo   1/1     Running   0          52s
  3. 访问ECS管理控制台,在左侧导航栏单击实例,查看以podvm-开头的TDX 机密虚拟机,表明CAA已成功创建底层计算资源。

相关链接

联系我们

如有任何产品问题或使用建议,欢迎您加入钉群(钉群号:30521601)联系我们。