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

系统盘加密指使用CryptPilot对整个系统盘进行加密,该方案能够通过加密和完整性保护机制有效地对根分区提供保护。此外,CryptPilot还能够实现对根文件系统的度量。

技术原理

机密系统盘通过Linux内核的dm-verityLUKS2技术实现,能够为机密实例的系统盘提供可度量和数据加密两种能力。

  • 可度量:基于dm-verity机制,系统在启动时将对rootfs卷构建完整的哈希树结构,通过逐层校验确保文件系统的完整性。该机制将与内存加密技术相结合,将根文件系统的根哈希值存储在安全的内存中。在系统启动过程中,内核将验证rootfs卷每个数据块的哈希值是否与预存的根哈希值一致,任何未经授权的修改都会被实时检测并阻止系统启动,从而实现对根文件系统的可信度量及防篡改保障。

  • 数据加密:通过LUKS2标准,采用AES-256算法实现全盘加密。加密过程采用分层密钥体系:用户自主管理的主密钥(Master Key)用于加密数据,而主密钥本身则由另一个密钥加密密钥(KEK)进行保护。KEK通过远程证明机制在对实例进行验证后下发。所有数据在写入磁盘之前会自动进行加密,而在读取时则在机密实例的安全内存中进行解密,从而确保加密数据在云盘存储期间始终处于加密状态,并满足密钥全生命周期的自主可控需求。

机密系统盘细节

使用CryptPilot加密后的系统盘如下所示。

image

CryptPilot中,数据是以卷(Volume)为单元进行加密,机密系统盘中包含两个关键卷:

  • rootfs:rootfs卷存放了只读的根文件系统。

    • 度量:在启动时该卷的内容会被度量,并基于内核的dm-verity机制对rootfs卷建立哈希树。由于度量值被存储在内存中,可以防止数据被修改。为了保持系统中业务程序的兼容性,在启动阶段,一个可写入的覆盖层将被覆盖在只读的根文件系统上,从而允许您在根文件系统上做临时性的写入修改。这些写入修改将不会破坏只读层,也不会影响只读根文件系统的度量。

    • 加密:对该卷的加密是一个可选的操作,这取决于您的业务需求。如果您需要加密rootfs卷的数据,可以在创建机密系统盘的过程中配置加密选项。

  • data:data卷是系统盘上剩余可用空间组成的一个加密卷,包含一个可读写的Ext4文件系统。

    • 加密:在系统启动过程中,该卷会被解密,并且在进入系统后,该卷会被挂载到/data位置上。任何data卷上写入的数据,都会被加密后落盘。用户可以将其数据文件写入到此处,在实例重新启动后,数据不会丢失。

使用流程

image

步骤一:准备受信任环境

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

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

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

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

如果您的环境是其他Linux发行版,可以参考以下步骤,准备Alibaba Cloud Linux 3容器镜像环境:

  1. 安装Docker

  2. (条件可选)如果您的本地系统为Ubuntu 24.04,请先关闭apparmor。

    sudo aa-teardown || true
    sudo systemctl disable --now apparmor.service
  3. 加载nbd驱动。

    sudo modprobe nbd max_part=8
  4. 创建并运行一个Alibaba Cloud Linux 3容器。

    sudo docker run -it --privileged --net=host --ipc=host -v /run/udev/control:/run/udev/control -v /dev:/dev alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:latest bash

步骤二:部署Trustee服务

Trustee是信任管理服务,它是一系列组件的组合,包含远程证明服务(Attestation Service,AS)、参考值服务(Reference Value Provider Service,RVPS)、密钥管理服务(Key Broker Service,KBS)。为了实现对系统的度量,您需要在受您信任的环境中部署一个Trustee服务,并将密钥上传到密钥管理服务中。

  1. 使用Workbench登录Linux实例

  2. 安装Trustee。

    sudo yum install -y trustee
  3. (条件可选)如果您希望增加对Trustee服务的身份进行验证,您可以开启TrusteeHTTPS选项。

    在此之前,您需要申请一个SSL证书。在您获得证书后,您可以通过编辑/etc/trustee/gateway.yml文件,增加如下配置,以使Trustee能够使用该证书:

    server:
      insecure_http: false
      tls:
        cert_file: "<https证书.pem文件路径>"
        key_file: "<https证书私钥文件路径>"
      # 其它配置...
  4. 启动Trustee服务。

    • Alibaba Cloud Linux 3实例:

      sudo systemctl restart trustee
    • 容器环境:

      (/usr/bin/rvps --config /etc/trustee/rvps.json --address 127.0.0.1:50003 &) && sleep 1
      (/usr/bin/grpc-as --socket 0.0.0.0:50004 --config-file /etc/trustee/as-config.json &) && sleep 1
      (/usr/bin/kbs --config-file /etc/trustee/kbs-config.toml &) && sleep 1
      (/usr/bin/trustee-gateway --config /etc/trustee/gateway.yml &) && sleep 1

    Trustee服务运行后,会监听本机的8081端口。

  5. 准备并上传加密密钥。

    1. 运行以下命令2次,生成2个安全的随机密钥。

      一个密钥用户加密rootfs卷,一个密钥用户加密data卷。

      openssl rand -base64 40

      保存生成的随机密钥,该密钥用于后续的卷加密。

      image

    2. 创建一个名为local-resources的子目录来存放密钥。

      密钥管理服务默认在本地目录/opt/trustee/kbs/repository/default/中存储密钥资源。因此,需要将密钥内容写入到相应的路径下。

      sudo mkdir -p /opt/trustee/kbs/repository/default/local-resources/
    3. (可选)上传rootfs卷的密钥,对应的KBS URIkbs://default/local-resources/rootfs

      sudo sh -c 'echo -n "<rootfs卷加密密钥>" > /opt/trustee/kbs/repository/default/local-resources/rootfs'
      说明
      • rootfs卷的加密是可选的,您可以根据您的业务来决定。例如,如果您的业务需要允许第三方对rootfs卷的内容进行审查,则可以跳过对rootfs卷的加密,仅保留对其进行度量的能力。

      • <rootfs卷加密密钥>请替换成步骤5.a生成的随机密钥。

    4. 上传data卷的密钥,对应的KBS URIkbs://default/local-resources/data。

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

      <data卷加密密钥>请替换成步骤5.a生成的随机密钥。

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

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

    1. 安装Cryptpilot。

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

      cryptpilot --version

      image

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

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

    说明
    • 请将下述配置中的<trustee-ip>替换成您部署Trustee服务的实例的公网IP地址。

    • 如果您在步骤三中为Trustee服务配置了HTTPS访问,则需要将下述配置的kbs_url中的http://替换成https://

    • 更多配置项说明,请参见CryptPilot系统盘加密配置说明

    • 不需要加密rootfs卷:仅需配置data卷的密钥获取方式。

      cat <<EOF > ./config_dir/fde.toml
      [rootfs]
      rw_overlay = "ram"
      
      [data]
      integrity = true
      
      [data.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/data"
      EOF
    • 需要加密rootfs卷:需配置rootfs卷和data卷的密钥获取方式。

      cat <<EOF > ./config_dir/fde.toml
      [rootfs]
      rw_overlay = "ram"
      
      [rootfs.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/rootfs"
      
      [data]
      integrity = true
      
      [data.encrypt.kbs]
      kbs_url = "http://<trustee-ip>:8081/api"
      key_uri = "kbs:///default/local-resources/data"
      EOF
  2. 制作机密系统盘镜像文件

    1. 下载镜像文件。

      说明
      • 待加密的系统盘镜像仅支持Alibaba Cloud Linux 3系统,并且仅支持.qcow2文件和.vhd文件。

      • 您可以访问Alibaba Cloud Linux 3 On-premise Image获取最新的Alibaba Cloud Linux 3发行版下载链接。

      curl -O -L -C - https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2
    2. 制作机密系统盘镜像文件。

      • 不需要加密rootfs卷:

        sudo cryptpilot-convert --in ./aliyun_3_x64_20G_nocloud_alibase_20250117.qcow2 --out ./confidential-disk.qcow2 --config-dir ./config_dir/ --rootfs-no-encryption
      • 需要加密rootfs卷:

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

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

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

    3. 检查加密后的镜像。

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

      file ./confidential-disk.qcow2

      image

    4. Trustee服务中注册参考值。

      在实例的启动过程中,会向Trustee服务发起请求获取磁盘解密密钥,而Trustee服务会通过远程证明机制对实例中的环境进行验证,并基于配置的rego策略验证环境可信程度。因此,需要先在Trustee中配置rego策略,并注册参考值。

      1. 修改Trustee服务中的rego策略。

        Trsutee 的 Rego 策略分为“严格”和“宽松”两种模式。

        • 宽松模式:仅验证系统是否运行在可信执行环境(TEE)中。

        • 严格模式:在确认 TEE 环境的基础上,进一步校验bootloader、kernel、cmdline、initrd以及根文件系统等关键组件是否与预期配置一致。

        说明

        建议仅在测试阶段使用“宽松”策略,以提升调试灵活性;在生产环境中应始终采用“严格”策略,以确保系统完整性和安全性。

        策略配置文件位于 /opt/trustee/attestation-service/policies/opa/default.rego,可通过编辑该文件进行策略调整。

        • “严格”的策略:

          package policy
          
          import future.keywords.every
          import future.keywords.if
          
          default allow := false
          
          allow if {
          	every k0, v0 in data.reference {
          		some k1
          		endswith(k1, k0)
          		match_value(v0, input[k1])
          	}
          }
          
          match_value(reference_value, input_value) if {
          	not is_array(reference_value)
          	input_value == reference_value
          }
          
          match_value(reference_value, input_value) if {
          	is_array(reference_value)
          	array_include(reference_value, input_value)
          }
          
          array_include(reference_value_array, _) if {
          	reference_value_array == []
          }
          
          array_include(reference_value_array, input_value) if {
          	reference_value_array != []
          	some i
          	reference_value_array[i] == input_value
          }
        • “宽松”的策略:

          package policy
          
          default allow := true
      2. 使用Cryptpilot计算加密镜像的参考值。

        sudo cryptpilot fde show-reference-value --stage initrd --disk ./confidential-disk.qcow2 > ./reference-value.json
      3. 导入参考值到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. 上传自定义镜像到OSS

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

  2. 导入自定义镜像

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

    image

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

    image

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

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

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

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

      image

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

    • 登录凭证:选择密钥对

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

  2. 在部署Trustee服务的实例安全组中,入方向8081端口开放创建机密实例的公网IP。

    image

  3. 重启机密计算实例

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

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

CryptPilot系统盘加密配置说明

系统盘加密配置存放于CryptPilot配置文件目录里的fde.toml文件中,该配置文件包含系统盘加密相关的rootfs卷和data卷相关的配置。

您可以从两个位置获得配置说明:

  1. 安装CryptPilot后,/etc/cryptpilot/fde.toml.template即为配置文件的参考模板。

  2. 您也可以参考CryptPilot项目的文档,获得详细的配置细节。

以下是几个参考配置示例:

  1. 使用Key Broker Service(KBS)作为凭据托管类型。其中:

    • 指定里rw_overlay = "disk",表示只读rootfs卷上的覆盖层存储在data卷中。

    • 指定[rootfs.encrypt.kbs][data.encrypt.kbs],表示从KBS上获取rootfs卷和data卷的解密密钥。

      • rootfs卷:使用KBS上托管的kbs:///default/mykey/rootfs_partition密钥。

      • data卷:使用KBS上托管的kbs:///default/mykey/data_partition的密钥。

    # Configuration related to the read-only root filesystem.
    [rootfs]
    # The type of read-write overlay layer over the underhood read-only rootfs. Can be "disk" or "ram". Default value is "disk".
    rw_overlay = "disk"
    
    [rootfs.encrypt.kbs]
    # <trustee-ip>替换成您部署Trustee服务的实例的公网IP地址。
    kbs_url = "http://<trustee-ip>:8081/api"
    key_uri = "kbs:///default/test/rootfs_partition"
    # The X.509 Root Cert used for HTTPS connection to the KBS instance, in PEM format. If not specified, the native Root CA certificate store in the system will be used.
    kbs_root_cert = """
    -----BEGIN CERTIFICATE-----
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    -----END CERTIFICATE-----
    """
    
    
    # Configuration related to the data partition.
    [data]
    # Whether or not to enable integrity check.
    integrity = true
    
    [data.encrypt.kbs]
    # <trustee-ip>替换成您部署Trustee服务的实例的公网IP地址。
    kbs_url = "http://<trustee-ip>:8081/api"
    key_uri = "kbs:///default/test/data_partition"
    # The X.509 Root Cert used for HTTPS connection to the KBS instance, in PEM format. If not specified, the native Root CA certificate store in the system will be used.
    kbs_root_cert = """
    -----BEGIN CERTIFICATE-----
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
    -----END CERTIFICATE-----
    """
    
  2. 使用外部程序提供密钥。其中:

    • 指定里rw_overlay = "ram",表示只读rootfs卷上的覆盖层存储在内存中,每次重启后实例都将是新的。

    • 指定[rootfs.encrypt.exec][data.encrypt.exec],表示通过运行外部程序(示例表示通过echo程序产生了固定的密码)获取rootfs卷和data卷的解密密钥。

    [rootfs]
    rw_overlay = "ram"
    
    [rootfs.encrypt.exec]
    command = "echo"
    args = ["-n", "AAAaaawewe222"]
    
    [data]
    integrity = true
    
    [data.encrypt.exec]
    command = "echo"
    args = ["-n", "AAAaaawewe222"]