机密计算实例的磁盘度量与加密保护

更新时间:
复制为 MD 格式

本文介绍如何使用 CryptPilot 解决机密计算实例的数据落盘保护问题,通过对实例的根文件系统进行可信度量以防止软件篡改,并对云盘数据实施加密以实现落盘机密性。

机密计算实例(如TDX实例、异构机密实例)通过寄存器加密、内存加密等硬件能力保护运行时数据,但程序代码及其处理的数据通常仍存储在云盘上,需要额外机制对落盘数据进行保护。本文介绍如何使用CryptPilot在机密计算实例中实现磁盘的度量与加密保护,并自主管理云盘的加密密钥。

机密计算实例的磁盘保护有两种方案,可独立使用,也可组合使用:

  • 机密系统盘的度量与加密:在制作系统盘镜像阶段引入 dm-verity 度量,并可选叠加 LUKS2 加密。系统启动时对 rootfs 进行完整性校验,并通过远程证明从信任管理服务获取解密密钥。适用于需要对整机环境进行可信度量的场景,也可在此基础上加密系统盘。

  • 机密数据盘的加密:在已运行的机密计算实例上,对单独的数据盘分区进行 LUKS2 加密。适用于已有业务实例、希望在不重做镜像的前提下仅对部分数据盘进行加密保护的场景。

你可以根据自身场景选择阅读:若需要为机密实例制作可度量、可信启动的系统镜像请参阅机密系统盘的度量与加密;若仅需在已运行的实例上加密部分数据盘,请参阅机密数据盘的加密

机密系统盘的度量与加密

机密系统盘组成与保护

使用CryptPilot处理后的机密系统盘如下所示,数据以卷(Volume)为单元组织,包含两个关键卷:

image
  • rootfs:只读的根文件系统。启动时基于 Linux 内核 dm-verity对 rootfs 卷构建完整的哈希树,根哈希值存入安全内存并记入机密实例的CC Eventlog,供远程证明校验启动链完整性。内核逐层校验每个数据块的哈希值与预存根哈希值的一致性,任何未经授权的篡改都会被实时检测并阻止启动。为保持业务兼容性,系统在只读的 rootfs 之上叠加一个可写覆盖层,覆盖层的后端存储由 delta 卷承载,临时写入不影响度量结果。

    对该卷的加密是可选的。若启用,则基于 LUKS2(AES-256),由设备随机生成 Master Key 用于数据加解密;用户提供的 Passphrase 经密钥派生算法生成 KEK,对 Master Key 加密后存于卷头。启动时通过远程证明获取 KEK 解密 Master Key,加解密均在机密实例的安全内存中完成。

  • delta:系统盘剩余空间组成的加密卷,始终以 LUKS2 加密,承载 rootfs 可写覆盖层的后端数据。用户在 rootfs 上的所有写入操作最终都会加密落入 delta 卷。

使用流程

image

步骤一:准备受信任环境

受信任环境需满足以下条件:

  • Alibaba Cloud Linux 3操作系统:制作机密系统盘的Cryptpilot工具依赖于Alibaba Cloud Linux 3。

  • 开通公网IP:机密计算实例启动过程中会访问Trustee服务器以获取解密密钥。

  • 有足够的空间:取决于您要制作的系统盘镜像文件的大小,建议您的环境中有超过40 GiB的空闲空间。

步骤二:制作机密系统盘镜像

  1. 准备源磁盘镜像

    在制作机密系统盘之前,您需要准备一个已完成业务部署的磁盘镜像文件。该镜像可通过以下两种方式获取:

    从已有 ECS 实例导出系统镜像

    在已有的阿里云 ECS 实例上部署并配置好您的业务环境,然后通过控制台或 API 将该实例的系统镜像导出为qcow2文件。

    使用官方提供的基础镜像进行定制

    从阿里云官网下载最新的 Alibaba Cloud Linux 3 基础镜像,并使用virt-customize工具对镜像内容进行个性化定制(如安装软件包、配置服务、添加您的业务程序等),以满足业务需求。

    您可以访问 Alibaba Cloud Linux 3 On-premise Image页面,获取最新的发行版下载链接。例如,使用以下命令下载指定版本的 QCOW2 镜像文件:

    curl -O -L -C - https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2
    说明
    • 仅支持 .qcow2.vhd 格式的 Alibaba Cloud Linux 3 操作系统磁盘镜像文件;

    • 镜像一旦通过 cryptpilot-convert 处理后,将无法再修改其内容,因此请确保在处理前已完成所有必要的配置和定制。

  2. (可选)加固镜像

    对于运行在机密计算环境中的实例,加固可有效减少攻击面,防止不必要的服务或组件引入安全风险,提升整体安全性。

    您可以参考下文的镜像加固章节,在镜像定制阶段完成相关操作后再执行加密。

  3. 安装Cryptpilot并准备配置文件

    1. 安装Cryptpilot。

      在受信任的构建环境中安装 host 包(提供 cryptpilot-convert、cryptpilot-enhance、cryptpilot-fde-host 等制作机密系统盘镜像的工具):

      sudo yum install -y cryptpilot-fde-host
    2. 查看Cryptpilot版本。

      cryptpilot-fde-host --version

      image

    3. 创建一个存放Cryptpilot配置文件的目录。

      mkdir -p ./config_dir
    4. 写入系统盘配置。

      CryptPilot支持单独设置机密系统盘的rootfs卷与delta卷的加密配置,应根据业务场景 是否需要加密rootfs以及差异数据(在delta卷上)是否需要持久化保存数据 两个维度来选择。下面列出了四种组合对应的 fde.toml 内容,请将所选单元格的内容写入 ./config_dir/fde.toml

      rootfs卷不加密 + delta卷不持久化

      [rootfs]
      delta_location = "disk"
      
      [delta]
      integrity = true
      [delta.encrypt.otp]

      rootfs卷不加密 + delta卷需要持久化

      [rootfs]
      delta_location = "disk-persist"
      
      [delta]
      integrity = true
      [delta.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/delta"

      rootfs卷加密 + delta卷不持久化

      [rootfs]
      delta_location = "disk-persist"
      [rootfs.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/rootfs"
      
      [delta]
      integrity = true
      [delta.encrypt.otp]

      rootfs卷加密 + delta卷需要持久化

      [rootfs]
      delta_location = "disk-persist"
      [rootfs.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/rootfs"
      
      [delta]
      integrity = true
      [delta.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/delta"
      说明
      • 使用OTP时,delta卷每次启动自动生成新的随机密钥,数据在关机后即丢失,无需部署任何密钥后端。OTP的概念详见一次性密钥(OTP)

      • 使用Trustee等持久化密钥后端时,请将配置中的<trustee-ip>替换为您部署Trustee服务的实例公网IP地址(若已为Trustee配置HTTPS访问,请将kbs_url中的http://替换为https://)。各密钥获取方式的详细配置说明,请参见信任管理服务(Trustee)

  4. 制作机密系统盘镜像文件

    1. 制作机密系统盘镜像文件。

      • 如果您的配置是 不需要加密rootfs卷:

        sudo cryptpilot-convert --uki --in ./aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2 --out ./confidential-disk.qcow2 --config-dir ./config_dir/ --rootfs-no-encryption
      • 如果您的配置是 需要加密rootfs卷:

        sudo cryptpilot-convert --uki --in ./aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2 --out ./confidential-disk.qcow2 --config-dir ./config_dir/ --rootfs-passphrase "<rootfs卷加密密钥>"
        说明
        • <rootfs卷加密密钥>请与为rootfs卷上传到密钥后端的加密密钥保持一致。

        • 由于delta卷的加密发生在实例启动过程中,因此在创建机密系统盘镜像文件时,您不需要指定delta卷的密码。

        • 如果您需要在系统盘中安装额外的rpm包,可以使用--package选项指定rpm包的名称或路径。

    2. 检查生成的镜像。

      机密系统盘镜像默认在./confidential-disk.qcow

      file ./confidential-disk.qcow2

      image

步骤三:导入自定义镜像并创建机密实例

  1. 上传自定义镜像到OSS

    上传本地镜像文件至OSS,并获取文件URL,详情请参见上传文件

  2. 导入自定义镜像

    导入自定义镜像时,启动模式必须为UEFI

    image

  3. 导入成功后,在镜像详情页,修改NVMe驱动为支持

    image

步骤四:使用导入的自定义镜像创建机密计算实例

  1. 使用导入的自定义创建TDX机密计算实例异构机密计算实例

    创建实例时,需要注意以下参数:

    • 镜像:选择已导入的自定义镜像,并选中机密虚拟机

      image

    • 公网IP:选中分配公网IPv4地址,以便您的实例能够访问到Trustee服务以通过远程证明获取密钥。

    • 登录凭证:选择密钥对

      使用Cryptpilot制作的机密系统盘暂不支持使用密码方式登录。

  2. (可选)如果您部署了Trustee服务,请在其对应实例的安全组开放机密实例的公网IP访问入方向8081端口的权限。

    image

  3. 重启机密计算实例

  4. 使用Workbench终端连接机密计算实例

    如果可以正常连接实例,说明实例可以正常访问Trustee服务并通过远程证明获取密钥。

步骤五:(可选)在Trustee服务中注册参考值

如果您配置了Trustee作为密钥的存储后端,在实例的启动过程中,会向Trustee服务发起请求获取磁盘解密密钥。而Trustee服务会通过远程证明机制对实例中的环境进行验证,检查其是否运行在TEE实例中。在此之上,如果您还想要对所运行的镜像做验证,则需要先将镜像的参考值注册到Trustee中。

  1. 使用Cryptpilot计算机密系统盘镜像的参考值,并保存在reference-value.json中。

    sudo cryptpilot-fde-host show-reference-value --disk ./confidential-disk.qcow2 | tee ./reference-value.json

    示例输出如下,其中466713bf9b2dacca6cd15ff4acd050712e29b4164628e01bd2495411766f36d7ba4560f62537926cf16e08480f1c1804便是该镜像的参考值:image

  2. 导入参考值到Trustee服务中。

    provenance=$(cat ./reference-value.json | base64 --wrap=0)
    cat << EOF > ./register-request.json
    {
        "version" : "0.1.0",
        "type": "sample",
        "payload": "$provenance"
    }
    EOF
    
    rvps-tool register --path ./register-request.json

镜像加固

机密计算环境中,镜像自身的安全配置直接影响整体可信性,建议在加密前对镜像进行安全加固:

  1. 攻击面最小化:预装的云服务组件(如云助手、监控代理)在机密计算场景下会扩大攻击面,移除可降低被利用的风险。

  2. 数据隔离保障:未关闭的管理服务可能成为数据泄露的通道,加固可确保只有必要的服务运行。

  3. 访问入口管控:禁用 SSH 等远程访问以阻断未授权登录,确保计算环境的封闭性。

加固工具说明

为简化加固流程,我们提供了cryptpilot-enhance工具,该工具集成了镜像安全加固的最佳实践。

说明

若您使用 ECS 实例快照导出的镜像,而非从官方源获取的 Alibaba Cloud Linux 3 基础镜像从头定制您的镜像,则可能已预装云助手(Cloud Assistant)或云安全中心(安骑士 Aegis),cryptpilot-enhance 工具会自动识别并卸载这些组件。

重要

经过cryptpilot-convert生成的镜像已经固化内容,无法进行修改,因此需要在其之前运行cryptpilot-enhance。

cryptpilot-enhance支持两种加固模式:

  • full:完全加固。移除 SSH 服务,实施最严格访问控制。

  • partial:部分加固。保留 SSH 服务但强制密钥认证,适用于需远程维护的生产环境。

包含如下加固内容:

加固模式

内容

通用加固项(两种模式均执行)

  • 卸载阿里云助手

  • 卸载安骑士

  • 禁用 rpcbind 服务

  • 移除 cloud-init

  • 用户账户清理

  • 清除 Bash 历史记录

full 模式

  • 彻底卸载 SSH 服务

partial 模式

  • SSH 安全配置强化:

    • 禁用密码登录:PasswordAuthentication no

    • 启用密钥认证:PubkeyAuthentication yes

    • 限制 root 登录方式:PermitRootLogin prohibit-password

    • 禁用高风险功能:X11Forwarding noAllowTcpForwarding no

  • 若提供公钥,则注入至 root 用户的 ~/.ssh/authorized_keys

加固工具示例

  • 对镜像执行完全加固:

    cryptpilot-enhance \
      --mode full \
      --image ./os-disk.qcow2
  • 对镜像执行部分加固并注入 SSH 公钥:

    cryptpilot-enhance \
      --mode partial \
      --image ./os-disk.qcow2 \
      --ssh-key ~/.ssh/id_rsa.pub

机密数据盘的加密

在机密计算场景中,除了保护整个系统盘,也可以仅在已运行的机密实例上对部分数据盘分区进行加密。本章节介绍如何在机密计算实例内对数据盘实施 LUKS2 加密,同时实现密钥自主管理。

加密原理

机密云盘基于Linux平台的LUKS2技术实现,提供块存储级别的数据加密保护能力。包含初始化与打开两个流程:

  • 初始化:选定一个块设备(如 /dev/nvme1n1p1),由安全随机数算法生成一个设备唯一的 Master Key,用于 AES-256 加密。Master Key 本身由用户提供的 Passphrase 经密钥派生算法生成 KEK 加密后存储在卷头中。

    重要

    初始化流程会抹去块设备上的原有数据,请谨慎处理,以免操作失误。

  • 打开:基于用户提供的 Passphrase 重新派生 KEK,解密得到 Master Key,从而解锁卷。系统将在 /dev/mapper/<卷名> 路径建立一个虚拟块设备,所有写入该设备的数据自动加密后落盘、读取时自动解密,加解密过程在 Linux 内核中完成,可以有效防止明文泄露到实例外部。

image

加密实例通过 CPU 内置的 AES 硬件加速能力降低加解密开销。机密数据盘支持通过 AEAD 加密模式提供完整性保护,可防止攻击者篡改密文数据,适用于大语言模型权重存储、训练数据集存储等场景。加密使用的Passphrase托管在实例外,支持多种密钥获取方式,详见附录:密钥获取方式

说明
  • 仅支持加密TDX实例异构机密实例的数据盘。

  • 当云盘发生回滚时,由于数据的完整性和机密性并未受到破坏,因此机密云盘方案无法帮助您识别此类潜在攻击。建议您根据安全需求,在应用层面进行相应的数据版本检查,以应对此类问题。

使用流程

步骤一:准备环境

  1. 创建机密计算实例。

    仅支持加密TDX机密实例异构机密实例

  2. 远程连接机密计算实例。

    具体操作,请参见使用Workbench登录Linux实例

  3. 安装Cryptpilot。

    sudo yum install -y cryptpilot-crypt

步骤二:创建并挂载云盘

重要

加密云盘是会抹去块设备上的原有数据,建议您创建新的数据盘进行操作。

  1. 创建待加密的空数据盘

  2. 将创建的数据盘挂载到ECS实例上

  3. 初始化数据盘

    初始化数据盘时,请仅创建分区及文件系统,不挂载文件系统,文件系统需要加密后再挂载。

  4. 查看挂载的云盘及分区信息。

  5. lsblk

    显示结果如下,表示当前ECS实例挂载了两块云盘:

    • /dev/nvme0n1:原有的系统盘。

    • /dev/nvme1n1:新增的数据盘,其中有2个新的空白分区(/dev/nvme1n1p1/dev/nvme1n1p2)。

    image

步骤三:创建带有ext4文件系统的卷

  1. 首先我们需要编写一个配置文件/etc/cryptpilot/volumes/data0.toml文件,该文件定义了一个名为data0的数据卷。

    说明

    配置文件采用TOML配置语言格式,文件名可以是任意以.toml结尾的文本文件,不强制与卷名称相同。

    下面提供一些典型场景下的配置,请根据实际情况修改其中的配置字段。

    临时卷

    # 卷配置
    dev = "/dev/nvme1n1p1"    # 指定要使用的块设备,即云盘的空白分区,本示例中/dev/nvme1n1p1使用了数据盘的第一个分区。
    volume = "data0"          # 指定卷的名称,本示例命名为data0。
    auto_open = false         # true表示系统启动时会自动打开该卷;false表示需要手动打开卷。
    makefs = "ext4"           # 指定要创建的文件系统类型,本示例为ext4。
    integrity = true          # true表示启用数据完整性支持;false表示关闭数据完整性支持。
    
    # 密钥配置
    [encrypt.otp]             # 指定密钥存储类型,这里选择一次性密钥(OTP)类型。

    持久化卷(使用 Trustee)

    # 卷配置
    dev = "/dev/nvme1n1p2"        # 指定要使用的块设备,即云盘的空白分区,本示例中 /dev/nvme1n1p2 使用了数据盘的第2个分区。
    volume = "data0"              # 指定卷的名称,本示例命名为 data0。
    auto_open = false             # true 表示系统启动时会自动打开该卷;false 表示需要手动打开卷。
    makefs = "ext4"               # 指定要创建的文件系统类型,本示例为 ext4。
    integrity = true              # true 表示启用数据完整性支持;false 表示关闭数据完整性支持。
    
    # 密钥配置(通过 Trustee KBS 获取)
    [encrypt.kbs]
    kbs_url = "http://<trustee-ip>:8081/api"               # 将<trustee-ip>替换为Trustee 实例的公网 IP 地址
    key_uri = "kbs:///default/local-resources/data0"       # KBS 中存储 data0 卷密钥的资源 URI

    持久化卷(使用阿里云 KMS)

    # 卷配置
    dev = "/dev/nvme1n1p2"        # 指定要使用的块设备,即云盘的空白分区,本示例中/dev/nvme1n1p2使用了数据盘的第一个分区。
    volume = "data0"              # 指定卷的名称,本示例命名为data0。
    auto_open = false             # true表示系统启动时会自动打开该卷;false表示需要手动打开卷。
    makefs = "ext4"               # 指定要创建的文件系统类型,本示例为ext4。
    integrity = true              # true表示启用数据完整性支持;false表示关闭数据完整性支持。
    
    # 密钥配置
    [encrypt.kms]                 # 指定密钥存储类型,这里选择密钥管理服务(KMS)类型。
    secret_name = "confidential_cloud_disk_passphrase"   # KMS实例中存储的凭据的名称,即之前示例中的confidential_cloud_disk_passphrase。
    # 应用身份凭证内容文件(clientKey_****.json文件)中的内容
    client_key = '''
    {
      "KeyId": "KAAP.b183152a-c3bf-43ae-9399-a101607b****",
      "PrivateKeyData": "MIIJ0wIBAzCCCZ8GCSqGSIb3DQE****"
    }
    '''
    client_key_password = "258372e962f5204ce648bc66243f****"    # 凭证口令文件(clientKey_****_Password.txt文件)中的内容
    kms_instance_id = "kst-bjj67d004a85ykq80****"               # KMS实例ID
    # KMS实例CA证书文件(PrivateKmsCA_kst-******.pem文件)中的内容
    kms_cert_pem = """
    -----BEGIN CERTIFICATE-----
    MIIDuzCCAqOgAwIBAgIJALTKwWAjvbMiMA0GCSqGSIb3DQEBCwUAMH****
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    MIID3zCCAsegAwIBAgIJAO8qnQyTy8/kMA0GCSqGSIb3DQEBCwUAMH****
    -----END CERTIFICATE-----
    """
  2. 查看卷状态。

    sudo cryptpilot-crypt show data0

    可以看到data0卷的配置信息:

    • Initialized 列:显示该卷是否需要初始化,如果是临时卷则不需要初始化,如果是持久化卷则需要初始化。

    • Opened 显示该卷并未打开。

      image

  3. 初始化卷

    sudo cryptpilot-crypt init data0
  4. 打开卷

    sudo cryptpilot-crypt open data0
  5. 检查卷对应的虚拟设备。

    sudo file -Ls /dev/mapper/data0

    卷在被打开后,将建立一个虚拟块设备,其路径为:/dev/mapper/<卷的名称>

    image

  1. 挂载文件系统并查看挂载结果。

    1. data0卷挂载到/mnt/data0路径上。

      sudo mkdir -p /mnt/data0
      sudo mount -t ext4 /dev/mapper/data0 /mnt/data0
    2. 查看挂载结果。

      mount | grep data0
      ls -la /mnt/data0/

      回显结果如下所示,表示卷被成功挂载,且里面是一个空的ext4文件系统。

      image

  2. 关闭卷。

    重要
    • 本示例中使用的是一次性密钥(OTP)模型,卷被关闭后,其中存储的机密数据将完全丢失。

    • 关闭卷之前请停止读写该卷的业务进程,并取消卷上的文件系统挂载,确保该卷没有被占用。

    1. 取消挂载。

      sudo umount /mnt/data0
    2. 关闭卷。

      sudo cryptpilot-crypt close data0

      image

步骤四:配置实例启动时自动打开卷

  1. 修改配置文件。

    对于需要自动打开的卷,修改其配置文件中的auto_open字段的值为trueimage

  2. (条件可选)对于持久化的卷,需要先手动运行sudo cryptpilot-crypt init <卷名称>初始化后,才能在实例启动时自动打开卷。

  3. 启动并设置开机自启动cryptpilot服务。

    重要

    每次修改cryptpilot配置后,都需要启动并设置开机自启动cryptpilot服务,才能确保自动打开卷功能生效。

    sudo systemctl enable --now cryptpilot.service
  4. 重启实例

  5. 查看卷状态。

    sudo cryptpilot-crypt show

    回显如下所示,表示卷被自动打开。image

附录:密钥获取方式

CryptPilot 通过 Provider 机制对接不同的密钥来源,将"如何加解密磁盘"和"密钥从哪儿取"解耦。本节集中介绍 OTP、Trustee(KBS)、阿里云 KMS 和外部程序(exec)四种方式,供前面机密系统盘与机密数据盘章节引用。

密钥获取方式

provider类型

持久化能力

是否需要远程证明

典型场景

OTP(一次性密钥)

otp

否(关机即丢失)

临时数据盘、swap 分区

Trustee

kbs

是(基于 TEE 远程证明放行密钥)

自建密钥后端 + 强可信计算需求

阿里云 KMS

kms

希望采用云上托管的密钥管理能力

exec(外部程序)

exec

取决于外部程序

取决于外部程序

高级用户自定义密钥获取流程

在前文的卷配置示例中,您可以根据实际选型,将 [encrypt.xxx] 段替换为本节介绍的某一种 Provider 配置。

一次性密钥(OTP)

适用范围

  • 机密数据盘——临时卷:每次重新打开卷时都将生成不同的随机密钥,关机后卷中数据完全丢失。适用于临时数据盘或交换分区(swap)。

  • 不适用于机密系统盘以及任何需要在关机后保留数据的持久化卷。

配置示例

在卷的 toml 配置中加入:

[encrypt.otp]

无需任何额外参数,CryptPilot 在打开卷时会自动生成一个安全的临时密钥对卷进行初始化与解密。

信任管理服务(Trustee)

Trustee是一个开源的信任管理服务,由远程证明服务(AS)、参考值服务(RVPS)和密钥管理服务(KBS)组成。在该方案中,加密密钥存放在 KBS 中,CryptPilot 打开卷时通过 KBS 拉取密钥;KBS 会根据预设策略对实例发起远程证明,证明通过后才放行密钥。

Trustee 既适用于机密系统盘(强可信计算场景下作为推荐密钥后端),也适用于机密数据盘的持久化卷。

步骤一:部署 Trustee 服务

  1. 在受信任的环境中(例如一台单独的 ECS 实例),安装 Trustee 软件包:

    sudo yum install -y trustee
  2. (可选)配置 HTTPS 访问。如需通过 HTTPS 访问,编辑 /etc/trustee/gateway.yml,填入您的 TLS 证书配置:

    server:
      insecure_http: false
      tls:
        cert_file: "<https证书.pem文件路径>"
        key_file: "<https证书私钥文件路径>"
      # 其它配置...
  3. 在 Alibaba Cloud Linux 3 实例上,可以通过 systemd 启动 Trustee 服务:

    sudo systemctl restart trustee

    Trustee 正常运行后,会在本机监听 8081 端口

步骤二:配置远程证明验证策略

Trustee 会对机密实例中的 TEE 硬件环境、文件系统、程序、配置等进行检查并给出检查结果。您需要根据安全等级要求配置 /opt/trustee/kbs/policy.rego 中的放行策略。

  • 机密系统盘场景(推荐:严格策略):要求远程证明四个维度(硬件、配置、可执行文件、文件系统)的可信值均 <= 32。具体策略与参考值的生成方式参见前文机密系统盘使用流程中的「步骤三:制作机密系统盘镜像」(在Trustee服务中注册参考值)。

  • 机密数据盘场景(最简策略:仅校验硬件):为简化使用,可仅检查四个维度中的硬件维度,即检测是否为合法的 TEE 硬件环境。将 /opt/trustee/kbs/policy.rego 修改为如下默认配置:

    默认远程证明策略配置

    package policy
    
    import rego.v1
    
    default allow = false
    
    # ---------------------------
    # Resource path helpers
    # ---------------------------
    resource_path := data["resource-path"]
    path_parts := split(resource_path, "/")
    
    is_repo(name) if { count(path_parts) == 3; path_parts[0] == name }
    is_type(t)    if { count(path_parts) == 3; path_parts[1] == t }
    is_tag(tag)   if { count(path_parts) == 3; path_parts[2] == tag }
    
    # ---------------------------
    # Default decision
    # ---------------------------
    
    allow if {
            # cpu0 must exist
            s := input.submods["cpu0"]
            # cpu0 must carry a trustworthiness vector
            tv := s["ear.trustworthiness-vector"]
            # and it must pass the hardware check
            tv["hardware"] <= 32
    }
说明

如需更严格的多维度验证,请查阅 /opt/trustee/attestation-service/policies/opa/default.rego,并参考 参考值配置文档远程证明配置文档完成参考值设置。

步骤三:上传卷加密密钥到 KBS

  1. 创建密钥存储目录(KBS 默认使用 /opt/trustee/kbs/repository/default/):

    sudo mkdir -p /opt/trustee/kbs/repository/default/local-resources/
  2. 生成加密密钥

    sudo yum install -y openssl
    openssl rand -base64 40

    image

  3. 将之前生成的随机密钥写入本地资源文件,例如对名为 data0 的卷:

    sudo sh -c 'echo -n "<data0卷加密密钥>" > /opt/trustee/kbs/repository/default/local-resources/data0'

    其中 <data0卷加密密钥> 请替换为前面生成的随机密钥。对应的 KBS 资源标识为 kbs:///default/local-resources/data0,后续在 CryptPilot 卷配置中通过该 URI 引用。

步骤四:在卷配置中引用 KBS

[encrypt.kbs]
# Trustee 实例的 HTTP(S) URL
kbs_url = "http://<trustee-ip>:8081/api"
# 在 KBS 中的资源 URI,格式 `kbs:///<repo>/<type>/<tag>`
key_uri = "kbs:///default/local-resources/data0"
# (可选)KBS HTTPS 访问的根证书,PEM 格式;不指定则使用系统根 CA
kbs_root_cert = """
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
"""

步骤五:在机密实例中安装远程证明依赖

为了使能机密实例中的远程证明能力并访问 Trustee 获取密钥,需要确保在机密实例中安装了对应硬件的 attestation-agent组件:

yum install -y attestation-agent

systemctl enable attestation-agent
systemctl start attestation-agent

阿里云 KMS

阿里云 KMS 是云上的密钥管理服务,适合希望将密钥托管在阿里云、无需自建密钥后端的场景。在该方案中,加密密钥以"通用凭据"的形式存放在 KMS 中,CryptPilot 在打开卷时通过 KMS 实例获取该密钥。

步骤一:创建阿里云KMS实例,并创建一个通用凭据

  1. 购买和启用KMS实例

  2. 说明
    • 机密云盘对所创建KMS实例的密钥管理类型没有限制,您可以按照安全需求按需选择。本文示例选择软件密钥管理类型的KMS实例。

    • KMS实例须与ECS实例在同一专有网络(VPC)中。

  3. 创建一个软件密钥

  4. 创建一个通用凭据

    • 凭据名称:根据实例填写,本示例为confidential_cloud_disk_passphrase

    • 设置凭据值:选择纯文本,输入上一步生成的随机密钥。

    • 加密主密钥:选择上一步创建的软件密钥。

    image

  5. 创建应用接入点,并获取KMS实例CA证书

    请确保已经获得以下内容:

    • 应用身份凭证内容(ClientKeyContent):文件名默认为clientKey_****.json。

    • 凭证口令(ClientKeyPassword):文件名默认为clientKey_****_Password.txt。

    • KMS实例CA证书:文件名默认为PrivateKmsCA_kst-******.pem。

步骤二:在卷配置中引用 KMS

以下配置文件中的配置信息,请根据实际情况修改。

[encrypt.kms]
# KMS 实例 ID
kms_instance_id = "kst-bjj67d004a85ykq80****"
# KMS 实例中通用凭据的名称
secret_name = "confidential_cloud_disk_passphrase"
# 应用身份凭证文件 clientKey_****.json 的内容
client_key = '''
{
  "KeyId": "KAAP.XXXXXXXXX",
  "PrivateKeyData": "XXXXXXXXX"
}'''
# 凭证口令文件 clientKey_****_Password.txt 的内容
client_key_password = "258372e962f5204ce648bc66243f****"
# KMS 实例 CA 证书 PrivateKmsCA_kst-******.pem 的内容
kms_cert_pem = """
-----BEGIN CERTIFICATE-----
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-----END CERTIFICATE-----
"""

外部程序(exec)

exec Provider 允许 CryptPilot 在打开卷时调用任意外部程序,并将该程序的标准输出作为卷的解密密钥。该方式 面向高级用户,可用于自定义密钥获取流程,例如对接企业内部的 HSM、Vault、自研 KMS、远程下发服务等。

说明

由于密钥获取的安全性完全取决于外部程序及其运行环境,请确保该程序自身具备充分的访问控制与可信来源。

配置示例

下面的示例使用 echo 程序产生一个固定密码,仅作配置形式演示——生产环境中请勿使用固定密码

[rootfs]
delta_location = "disk"

[rootfs.encrypt.exec]
command = "echo"
args = ["-n", "AAAaaawewe222"]

[delta]
integrity = true

[delta.encrypt.exec]
command = "echo"
args = ["-n", "AAAaaawewe222"]

CryptPilot 在打开卷时会执行 command 指定的程序(带 args 参数),并将其 标准输出 作为卷的解密密钥使用。