系统盘加密指使用CryptPilot对整个系统盘进行加密,该方案能够通过加密和完整性保护机制有效地对根分区提供保护。此外,CryptPilot还能够实现对根文件系统的度量。
技术原理
机密系统盘通过Linux内核的dm-verity和LUKS2技术实现,能够为机密实例的系统盘提供可度量和数据加密两种能力。
可度量:基于dm-verity机制,系统在启动时将对rootfs卷构建完整的哈希树结构,通过逐层校验确保文件系统的完整性。该机制将与内存加密技术相结合,将根文件系统的根哈希值存储在安全的内存中。在系统启动过程中,内核将验证rootfs卷每个数据块的哈希值是否与预存的根哈希值一致,任何未经授权的修改都会被实时检测并阻止系统启动,从而实现对根文件系统的可信度量及防篡改保障。
数据加密:通过LUKS2标准,采用AES-256算法实现全盘加密。加密过程采用分层密钥体系:用户自主管理的主密钥(Master Key)用于加密数据,而主密钥本身则由另一个密钥加密密钥(KEK)进行保护。KEK通过远程证明机制在对实例进行验证后下发。所有数据在写入磁盘之前会自动进行加密,而在读取时则在机密实例的安全内存中进行解密,从而确保加密数据在云盘存储期间始终处于加密状态,并满足密钥全生命周期的自主可控需求。
机密系统盘细节
使用CryptPilot加密后的系统盘如下所示。
在CryptPilot中,数据是以卷(Volume)为单元进行加密,机密系统盘中包含两个关键卷:
rootfs卷:rootfs卷存放了只读的根文件系统。
度量:在启动时该卷的内容会被度量,并基于内核的
dm-verity机制对rootfs卷建立哈希树。由于度量值被存储在内存中,可以防止数据被修改。为了保持系统中业务程序的兼容性,在启动阶段,一个可写入的覆盖层将被覆盖在只读的根文件系统上,从而允许您在根文件系统上做临时性的写入修改。这些写入修改将不会破坏只读层,也不会影响只读根文件系统的度量。加密:对该卷的加密是一个可选的操作,这取决于您的业务需求。如果您需要加密rootfs卷的数据,可以在创建机密系统盘的过程中配置加密选项。
data卷:data卷是系统盘上剩余可用空间组成的一个加密卷,包含一个可读写的Ext4文件系统。
加密:在系统启动过程中,该卷会被解密,并且在进入系统后,该卷会被挂载到/data位置上。任何data卷上写入的数据,都会被加密后落盘。用户可以将其数据文件写入到此处,在实例重新启动后,数据不会丢失。
使用流程
步骤一:准备受信任环境
受信任环境需满足以下条件:
Alibaba Cloud Linux 3操作系统:制作机密系统盘的Cryptpilot工具依赖于Alibaba Cloud Linux 3。
开通公网IP:机密计算实例启动过程中会访问Trustee服务器以获取解密密钥。
有足够的空间:取决于您要制作的系统盘镜像文件的大小,建议您的环境中有超过40 GiB的空闲空间。
如果您的环境是其他Linux发行版,可以参考以下步骤,准备Alibaba Cloud Linux 3容器镜像环境:
(条件可选)如果您的本地系统为Ubuntu 24.04,请先关闭apparmor。
sudo aa-teardown || true sudo systemctl disable --now apparmor.service加载nbd驱动。
sudo modprobe nbd max_part=8创建并运行一个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服务,并将密钥上传到密钥管理服务中。
安装Trustee。
sudo yum install -y trustee(条件可选)如果您希望增加对Trustee服务的身份进行验证,您可以开启Trustee的HTTPS选项。
在此之前,您需要申请一个SSL证书。在您获得证书后,您可以通过编辑
/etc/trustee/gateway.yml文件,增加如下配置,以使Trustee能够使用该证书:server: insecure_http: false tls: cert_file: "<https证书.pem文件路径>" key_file: "<https证书私钥文件路径>" # 其它配置...启动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端口。
准备并上传加密密钥。
运行以下命令2次,生成2个安全的随机密钥。
一个密钥用户加密rootfs卷,一个密钥用户加密data卷。
openssl rand -base64 40保存生成的随机密钥,该密钥用于后续的卷加密。

创建一个名为
local-resources的子目录来存放密钥。密钥管理服务默认在本地目录
/opt/trustee/kbs/repository/default/中存储密钥资源。因此,需要将密钥内容写入到相应的路径下。sudo mkdir -p /opt/trustee/kbs/repository/default/local-resources/(可选)上传rootfs卷的密钥,对应的KBS URI为
kbs://default/local-resources/rootfs。sudo sh -c 'echo -n "<rootfs卷加密密钥>" > /opt/trustee/kbs/repository/default/local-resources/rootfs'说明对rootfs卷的加密是可选的,您可以根据您的业务来决定。例如,如果您的业务需要允许第三方对rootfs卷的内容进行审查,则可以跳过对rootfs卷的加密,仅保留对其进行度量的能力。
<rootfs卷加密密钥>请替换成步骤5.a生成的随机密钥。
上传data卷的密钥,对应的KBS URI为kbs://default/local-resources/data。
sudo sh -c 'echo -n "<data卷加密密钥>" > /opt/trustee/kbs/repository/default/local-resources/data'说明<data卷加密密钥>请替换成步骤5.a生成的随机密钥。
步骤三:制作机密系统盘镜像
准备待加密磁盘镜像
在制作机密系统盘之前,您需要准备一个待加密的磁盘镜像文件。该镜像可通过以下两种方式获取:
基于已有 ECS 实例导出系统镜像
在已有的阿里云 ECS 实例上部署并配置好您的业务环境,然后通过控制台或 API 导出该实例的系统镜像。使用官方提供的基础镜像进行定制
从阿里云官网下载最新的 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
说明仅支持 Alibaba Cloud Linux 3 操作系统;
仅支持
.qcow2和.vhd格式的磁盘镜像文件;镜像一旦被加密并生成为机密系统盘镜像后,无法再修改其内容,因此请确保在加密前已完成所有必要的配置和定制。
加固镜像
建议您在制作机密系统盘镜像前,对基础镜像进行安全加固。加固可有效减少攻击面,防止不必要的服务或组件引入安全风险。尤其对于运行在机密计算环境中的实例,最小化系统组件、关闭非必要服务、移除远程管理代理等措施,有助于提升整体安全性与可信度量结果的稳定性。
请参考下文的“镜像加固流程”章节,在镜像定制阶段完成相关操作后再执行加密。
安装Cryptpilot并准备配置文件
安装Cryptpilot。
sudo yum install -y cryptpilot查看Cryptpilot版本。
cryptpilot --version
创建一个存放Cryptpilot配置文件的目录。
mkdir -p ./config_dir写入系统盘加密配置。
说明请将下述配置中的
<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
制作机密系统盘镜像文件
制作机密系统盘镜像文件。
不需要加密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包的名称或路径。
检查加密后的镜像。
机密系统盘镜像默认在
./confidential-disk.qcow。file ./confidential-disk.qcow2
在Trustee服务中注册参考值。
在实例的启动过程中,会向Trustee服务发起请求获取磁盘解密密钥,而Trustee服务会通过远程证明机制对实例中的环境进行验证,并基于配置的rego策略验证环境可信程度。因此,需要先在Trustee中配置rego策略,并注册参考值。
修改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
使用Cryptpilot计算加密镜像的参考值。
sudo cryptpilot fde show-reference-value --stage initrd --disk ./confidential-disk.qcow2 > ./reference-value.json导入参考值到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
步骤四:导入自定义镜像并创建机密实例
上传本地镜像文件至OSS,并获取文件URL,详情请参见上传文件。
导入自定义镜像时,启动模式必须为UEFI。

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

步骤五:使用导入的自定义镜像创建机密计算实例
创建实例时,需要注意以下参数:
镜像:选择已导入的自定义镜像,并选中机密虚拟机。

公网IP:选中分配公网IPv4地址,以便您的实例能够访问到Trustee服务以通过远程证明获取密钥。
登录凭证:选择密钥对。
使用Cryptpilot制作的机密系统盘暂不支持使用密码方式登录,如需使用密码登录,请
在部署Trustee服务的实例安全组中,入方向8081端口开放创建机密实例的公网IP。

如果可以正常连接实例,说明实例可以正常访问Trustee服务并通过远程证明获取密钥。
CryptPilot系统盘加密配置说明
系统盘加密配置存放于CryptPilot配置文件目录里的fde.toml文件中,该配置文件包含系统盘加密相关的rootfs卷和data卷相关的配置。
您可以从两个位置获得配置说明:
安装CryptPilot后,
/etc/cryptpilot/fde.toml.template即为配置文件的参考模板。您也可以参考CryptPilot项目的文档,获得详细的配置细节。
以下是几个参考配置示例:
使用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----- """使用外部程序提供密钥。其中:
指定里
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"]
镜像加固流程
镜像加固的目标是:最小化系统组件、关闭非必要服务、防止未授权访问,并确保系统启动时的完整性度量结果稳定可靠。本章节步骤以 Alibaba Cloud Linux 3 为例介绍加固流程,帮助您构建更安全、更可控的机密计算环境。
若您使用 ECS 实例快照导出的镜像,而非从官方源获取的Alibaba Cloud Linux 3 基础镜像文件,则可能已预装云助手(Cloud Assistant)或云安全中心(安骑士 Aegis),建议您按照下面步骤卸载。
所有加固操作建议在镜像制作阶段通过 virt-customize 工具执行,确保在加密前完成配置。以下为推荐的安全加固项:
卸载云助手Agent
# 停止云助手守护进程 /usr/local/share/assist-daemon/assist_daemon --stop # 停止云助手Agent systemctl stop aliyun.service # 删除云助手守护进程 /usr/local/share/assist-daemon/assist_daemon --delete # 卸载软件包 rpm -qa | grep aliyun_assist | xargs rpm -e # 清理残留文件与服务配置 rm -rf /usr/local/share/aliyun-assist rm -rf /usr/local/share/assist-daemon rm -f /etc/systemd/system/aliyun.service rm -f /etc/init.d/aliyun-service卸载云安全中心(安骑士 Aegis)
wget "http://update.aegis.aliyun.com/download/uninstall.sh" && chmod +x uninstall.sh && ./uninstall.sh关闭并禁用 rpcbind 服务
rpcbind是一个现代 Linux 系统中的服务, 默认监听 111 端口,用于支持 NFS、NIS、Automounter 等服务。如业务无需以下功能,建议彻底禁用:
NFS(网络文件系统)
NIS(网络信息服务)
Automounter(自动挂载)
分布式文件锁(如 nfslock)
systemctl stop rpcbind.service systemctl disable rpcbind.service systemctl mask rpcbind.service systemctl stop rpcbind.socket systemctl disable rpcbind.socket systemctl mask rpcbind.socket删除cloud-init
cloud-init用于处理云环境中的首次启动初始化配置。在机密系统盘中,若无需动态配置,建议移除:yum remove -y cloud-init可选:限制或移除 SSH 服务(防止未授权访问)
默认情况下,OpenSSH 服务可能允许通过密码或密钥方式进行远程登录。为降低攻击面,可根据实际运维需求选择以下任一策略:
彻底移除 SSH 服务(最高安全级别)
适用于无需远程登录、或通过其他可信通道(如串口日志、审计网关)进行调试的场景。
yum remove -y openssh-server保留 SSH 但实施严格安全加固(推荐用于企业敏感数据场景)
禁用密码登录,仅允许密钥认证,同时关闭不必要的 SSH 功能
sed -i 's/^#*PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config sed -i 's/^#*PubkeyAuthentication.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config sed -i 's/^#*X11Forwarding.*/X11Forwarding no/' /etc/ssh/sshd_config sed -i 's/^#*AllowTcpForwarding.*/AllowTcpForwarding no/' /etc/ssh/sshd_config
禁用 Linux 用户密码登录(防止控制台登录)
请运行此处的示例修复脚本代码
清除 Bash 历史记录
此命令将清空当前会话的历史缓冲区并同步到磁盘(即 ~/.bash_history),避免敏感命令历史被持久化到镜像中:
history -c && history -w