kata这样的所谓的安全容器,密码也一览无余

# pid=$(ps -ef | grep qemu | grep -v grep | sort -k4,4r | head -n 1 | awk '{print $2}') 
# ./peekPID.sh $pid
[New LWP 1361141]
[New LWP 1361145]
[New LWP 1361146]
[New LWP 1361148]
[New LWP 1361153]
warning: td_ta_new failed: generic error
0x00007f063f35ea8e in __ppoll ()
warning: target file /proc/1361138/cmdline contained unexpected null characters
warning: Memory read failed for corefile section, 4096 bytes at 0xffffffffff600000.
Saved corefile memdump.1361138
[Inferior 1 (process 1361138) detached]
 SUPER_SECRET_PASSWORD="NewPassword-"`date +"%Y-%m-%d-%H:%M"`
A�N�A����8��1�GO��*��H�sX�C��j	Z�(��H�C8H�D$�{H�T$H�s4�k4D�{8�&���R�@t>�s4�CU�K8�ST;S

在基于k8s平台的云原生应用中,存在以下的一些典型安全问题,比如:

- 宿主机被攻击,造成运行在宿主机上的容器内存数据,磁盘数据泄漏

- k8s管理平面被攻击,造成k8s的密钥泄漏

- k8s数据平面被攻击,造成容器内的数据泄漏

- 授权用户非法进入容器获取数据

- 授权用户非法获取k8s密钥资源

- 篡改镜像文件

机密计算几种技术路线对比

       
  机密容器(CoCo) 飞地(Enclave) 密码学(Cryptography)
原理 通过创建基于Confidential VM的Pod保护内存数据 通过在进程中创建Enclave内存区域保护内存中的代码和数据 使用数学算法对数据进行加密和解密
保护层次 硬件和软件结合 硬件保护 软件保护
保护的数据 使用,传输,存储 使用 传输,存储
证明方式 远程证明 远程证明 公开的算法
性能 取决于具体算法
跨平台 是 (主流厂商都支持,AMD SNP,Intel TDX,Hygon CSV, ARM CCA/virtCCA) 否 (Intel SGX)
计算通用性 是 (支持通用计算和云原生,已有应用无需改造) 否 (依赖专有的libc库,很多依赖IO/OS调用的程序不能运行) 否 (依赖具体算法,很多算法为特定场景设计)

机密容器

机密容器CoCo是CNCF的沙箱项目。基于Kata Containers,利用硬件的TEE(Trusted Execution Environment)和 CoCo使能的远程证明,镜像加密等能力,实现容器运行环境的度量和远征证明,内存数据的保护,磁盘数据的加密等。

机密容器的远程证明

可信计算与隐私计算

隐私计算(Privacy Computing)是一种在保护数据隐私的前提下,通过技术手段实现数据价值挖掘的方法。其核心目标是在数据分析、模型训练等过程中,避免泄露原始数据或敏感信息,同时仍能完成计算任务,即数据的可用而不可见。其实现方式可以有多种,不一定依赖可信计算。

可信计算(Trusted Computing)是一种通过硬件+软件技术确保计算环境安全性与可信度的方法,其核心目标是防止未经授权的访问、篡改或攻击,保障数据隐私和系统完整性。核心概念包括:

    - 可信平台模块(TPM, Trusted Platform Module)  
    一种专用硬件芯片,用于存储敏感数据(如加密密钥)并执行安全操作(如加密、解密、数字签名)。  
    提供硬件级安全根(Root of Trust),确保系统启动过程(如BIOS、操作系统)的可信性。

    - 链式信任(Chain of Trust)  
    从硬件(如TPM)开始,逐层验证软件组件(如引导加载程序、操作系统、应用程序)的完整性,确保每一层都是可信的。

    - 硬件安全模块(HSM, Hardware Security Module)  
    高安全性的硬件设备,用于管理加密密钥和执行加密操作,常用于企业级安全场景(如证书颁发、数字签名)。

    - 可信执行环境(Trusted Execution Environment),保护内存数据安全。

    - 远程认证(Remote Attestation)  
    允许第三方验证设备的可信状态,确保远程设备未被篡改。

    在可信计算中最关键的两点是:1. 可信执行环境(Trusted Execution Environment),可以保证数据在内存中的安全。2. 远程证明,可以证明应用的确是运行在想要的可信执行环境中。

远程证明

远程证明,就是要证明应用的确是运行在想要的可信执行环境中,目前通用的做法是RATS

RATS(Remote Attestation Procedures Architecture)

RATS

如图,RATS定义了做远程证明的实现方式,在这个架构中,有两个角色:

- Attester:应用所运行的环境,根据运行环境的硬件信息,固件信息,Bootloader信息,操作系统,操作系统的启动参数,关键的应用等来产生远程证明的度量文件。

- Verifier: 收到Attester产生的度量文件,根据厂商或者TPM的证书验证这个度量文件的签名,来确认Attester坐在的运行环境是可信的。

机密容器的全密态KBS

架构图

高可用

KBS本身也是一个k8s服务,并有多个实例运行在多个TEE机密容器节点上,因为KBS是一个标准的k8s service, 其数据存储可以选择MySQL/TiDB等,所以天然是高可用的。

全密态

1. 所有存储在数据库中的KBS数据都是通过用户的EncryptKey加过密的,加过密之后存储在数据库中。

2. EncryptKey用TEE的Sealing Key加过密之后以k8s secret的方式存储在api-server上。

3. Sealing Key是TEE本身提供的功能,只在TEE CPU中可用,只关联唯一的k8s service.   以上几点保证了TEE之外所有的数据都是加密的,而加密密钥只在TEE中可见。 ## 磁盘的透明加密 因为机密容器本身是一个TEE环境内的虚机,所以它的内存即使在机密容器的外面(比如host和其他机密容器上)都是看不到的,另外我们通过rego policy禁止了k8s一些危险的操作,比如 kubectl exec, kubectl debug, 这样运行中的机密容器实现了真正意义上的内存安全。意味着通过前面说的远程证明获取的密钥在机密容器内部是绝对安全的。

有了绝对安全的密钥后典型的应用场景是对磁盘数据加密。今天的KVM也是支持对磁盘加密的,然而加密的密钥其实是在Guest VM的外面,也就是host上,这意味着加了密的KVM磁盘实际上可以被host或者其他的KVM打开,机密容器可以实现安全的磁盘透明加密。

架构图

流程

1. 用户通过容器合约(这个是我们的专利吆)来定义加密磁盘所使用的密钥(一个KBS中的地址)、磁盘(LVM)、磁盘的挂载点(mount point)

2. 把容器合约以注解(Annotation)的方式传给k8s

3. k8s在启动容器的时候把容器合约传递到机密容器内部

4. 机密容器的组件开始远程证明并从KBS获取密钥

5. 获取密钥后,机密容器组件在GuestVM层使用这个密钥对容器合约定义的LVM做LUKS加密

6. 机密容器组件把加过密的LVM挂载到容器内部

通过这个流程,机密容器实现了对磁盘的透明加解密:

- 在机密容器外,数据是加密的

- 在机密容器内,数据是透明的

这样,机密容器内部的应用可以无感的使用加密的磁盘数据。而在机密容器外,任何人和程序都打不开这个加密的磁盘。

远程证明的度量

度量的流程:

用工具在TEE节点上预先计算机密容器可以产生的远程证明文档,把这些文档的值写入Trustee的RVPS(Reference Value Provider Service)中。

从TEE厂商获取验签远程证明文档的证书,预置在Attestation Service中。

机密容器在启动的时候会产生真正的远程证明文件,并使用TEE中的私钥进行签名。

机密容器把签过名的远程证明文档发送给KBS(Trustee)。

KBS使用Attestation Service来验证这个远程证明文件。

Attestation Service首先使用预置的厂商的TEE的证书验证远程证明的签名。

Attestation Service还会使用预置在RVPS的值来验证远程证明文档是否是允许的值。这是一个关键步骤。因为远程证明文档依赖以下的信息:

    Hardware

    Firmware

    Bootloader

    Guest OS Image

    Qemu Parameters

    Kernel Parameters

    Initdata

如果管理员篡改了Guest OS Image,Bootloader, Qemu 的参数,Guest VM内核参数, Initdata等等,远程证明就会失败, 这样我们就能保证,机密容器的内存一定是在受保护的内存中,还可以保证在生产环境中机密容器的调试模式不能通过篡改机密容器的配置和参数被打开。使机密容器始终运行在安全沙箱之中。

对应用程序的可信证明并不是通过远程证明来做的,而是通过对镜像文件的签名和加密。