配置ECS安全启动
操作场景
安全启动用于在设备启动过程中检测各个部件(驱动加载程序、内核、内核驱动程序)的完整性,防止因加载运行未经过认证的部件,产生对系统及用户数据的安全威胁。
安全启动是统一可扩展固件接口(Unified Extensible Firmware Interface,简称UEFI)的一项功能,要求在加载之前验证所有低级别的固件和软件组件。 在启动过程中,UEFI安全启动会检查每个启动软件的签名,包括UEFI固件驱动程序(也称为ROM选项)、可扩展固件接口(EFI)应用程序、操作系统驱动程序和二进制文件。 如果签名有效或被原始设备制造商(OEM)认可,则设备将启动,而固件将控制权交给操作系统。
- 开启安全启动后,系统启动时会校验部件完整性,对业务无影响。
- 关闭安全启动后,系统启动时不再校验部件完整性,对业务无影响。
背景知识
统一可扩展固件接口UEFI是一种详细描述全新类型接口的标准,可用于操作系统自动从预启动的操作环境加载到一种操作系统上。
UEFI启动方式的操作系统支持安全启动,该功能提供了有关启动链状态的验证,旨在确保固件自初始化后只执行经过加密验证的UEFI二进制文件。这些二进制文件包括UEFI驱动程序、主启动加载程序以及链加载组件。
默认情况下,安全启动处于禁用状态,且系统处于SetupMode。当系统处于SetupMode时,所有密钥变量都可以在没有加密签名的情况下进行更新。启用安全启动后,系统退出SetupMode。

启用安全启动后,系统会在任何UEFI二进制文件上强制执行签名验证。
安全启动基于在信任链中使用的密钥数据库如表1所示,这些数据库存储在UEFI变量存储中。
密钥数据库 |
简称 |
是否必选 |
说明 |
格式约束 |
---|---|---|---|---|
平台密钥 |
PK (Platform Key) |
是 |
PK数据库是安全启动实例的信任根。 PK数据库包含一个公有PK密钥,该密钥在信任链中用于更新密钥交换密钥(KEK)数据库。 要更改PK数据库,必须拥有私有PK密钥才能签署更新请求。这包括通过写入空PK密钥来删除PK数据库。 |
|
密钥交换密钥 |
KEK (Key Exchange Key) |
是 |
KEK数据库是信任链中用于更新签名(DB)和拒绝列表(DBX)数据库的公有KEK密钥的列表。 私有KEK用于向DB添加密钥,该数据库是要在系统上启动的授权签名列表。 要更改公有KEK数据库,必须拥有私有PK密钥才能签署更新请求。 |
|
签名数据库 |
DB(Signature Database) |
是 |
DB数据库是信任链中用于验证所有UEFI启动二进制文件的公有密钥和哈希值的列表。 DB列表包含授权在系统上启动的授权密钥。要修改列表,需要私有KEK。 要更改DB数据库,必须拥有私有PK密钥或私有KEK密钥中的任何一个才能签署更新请求。 |
|
禁用签名数据库 |
DBX (Forbidden Signatures Database) |
否 |
DBX数据库是不受信任的公有密钥和二进制哈希的列表,在信任链中用于吊销文件。 DBX数据库始终优先于所有其他密钥数据库。 要更改DBX数据库,必须拥有私有PK密钥或私有KEK密钥中的任何一个才能签署更新请求。 您可以在UEFI论坛获取公开可用的DBX,请参见Unified Extensible Firmware Interface Forum。 |
|
时间戳签名数据库 |
DBT ( Timestamp Signatures Database) |
否 |
DBT数据库是在时间戳签名数据库中保留代码的签名。 |
|
约束与限制
- 实例规格需支持UEFI安全启动,包括:C7t、Kc2、aC8。
- 仅支持在制作私有镜像时导入相关密钥,不支持在ECS的BIOS启动界面导入。
- 不支持在ECS中通过mokutil工具导入密钥或相关配置。
- 裸金属类型的实例不支持UEFI安全启动。
- 支持UEFI启动方式的操作系统请参考支持UEFI启动方式的操作系统版本。
- Windows系统镜像用户需要通过操作系统官网下载对应的证书,请参见Keys Required for Secure Boot on all PCs。
操作流程

创建安全启动密钥(Linux)
您需要以UEFI安全启动的标准创建密钥,并为每个密钥创建一个证书,再将每个证书转换为UEFI签名列表(二进制文件),最后使用相关密钥签署每个证书。
- 创建全局唯一标识符(GUID)
在创建密钥对之前,请先创建用于密钥生成的全局唯一标识符(GUID)。
- 连接到实例。
- 执行以下命令,创建用于密钥生成的全局唯一标识符(GUID)。
- 创建平台密钥(必选)
平台密钥(PK)是UEFI安全启动实例的信任根。
- 执行以下命令创建密钥,并将变量命名为PK。
openssl req -newkey rsa:4096 -nodes -keyout PK.key -new -x509 -sha256 -days 3650 -subj "/CN=Platform key/" -out PK.crt
其中相关参数说明如下:
- keyout PK.key:私有密钥文件。
- days 3650:证书有效天数。
- out PK.crt:创建UEFI变量的证书。
- CN=Platform key:密钥的公用名(CN)。您可以输入您自己企业的名称而不是平台密钥。
- 创建证书。
- 将证书转换为UEFI签名列表。
- 使用私有PK签署UEFI签名列表。
sign-efi-sig-list -g "$(< GUID.txt)" -k PK.key -c PK.crt PK PK.esl PK.auth
- 执行以下命令创建密钥,并将变量命名为PK。
- 创建密钥交换密钥(必选)
私有密钥交换密钥(KEK)用于向签名数据库(DB)添加密钥,该数据库是用于在系统上启动的授权签名列表。
- 创建签名数据库(必选)
签名数据库(DB)列表包含授权在系统上启动的授权密钥。要修改签名数据库列表,需要私有密钥交换密钥(KEK)。
开启镜像安全启动时将使用此步骤中创建的私有密钥签名。
- 创建禁用签名数据库(可选)
禁用签名数据库(DBX)的作用是禁用特定的db证书,可以是证书列表或哈希列表。
- 创建时间戳签名数据库(可选)
时间戳签名数据库(DBT)的作用是对签名时间戳进行签名,当db证书在dbx中,且dbx指定了吊销时间,如果签名时间在吊销时间之前,则db证书可以用于验签,否则不能用于验签。
使用密钥对ECS镜像进行签名
对于HCE系统,需要对如下镜像进行签名:
/boot/efi/EFI/hce/shimx64.efi
/boot/efi/EFI/hce/mmx64.efi
/boot/efi/EFI/hce/grubx64.efi
/boot/vmlinuz-5.10.0-60.18.0.50.r951_39_66.hce2.x86_64

使用uname -a命令可查看镜像内核版本,例如:
linux-iXZPNN:~ # uname -a
Linux linux-iXZPNN 5.10.0-60.18.0.50.r951_39_66.hce2.x86_64 #1 SMP Sun Jul 30 15:05:32 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
To sign an image
Use the following syntax to sign an image.
sbsign --key db.key --cert db.crt --output /boot/vmlinuz-5.10.0-60.18.0.50.r951_39_66.hce2.x86_64 /boot/vmlinuz-5.10.0-60.18.0.50.r951_39_66.hce2.x86_64
Refer to the documentation for your distribution to find out about your boot chain and required images.
¹ Thanks to the ArchWiki community for all of the work they have done. The commands for creating the PK, creating the KEK, creating the DB, and signing the image are from Creating keys, authored by the ArchWiki Maintenance Team and/or the ArchWiki contributors.
获取安全启动证书
请联系镜像提供方获取安全启动证书。
安全启动证书转码
- 禁用签名数据库(Forbidden Signatures Database)转码
__forbidden_signatures_database=$(cat DBX.der | base64 -w 0)
- 时间戳签名数据库(Timestamp Signatures Database)转码
__timestamp_signatures_database=$(cat DBT.der | base64 -w 0)

- PK.der为平台密钥(Platform Key)证书。
- KEK.der为密钥交换密钥(Key Exchange Key)证书。
- DB.der为签名数据库(Signature Database)证书。
- DBX.der为禁用签名数据库(Forbidden Signatures Database)证书。
- DBT.der为时间戳签名数据库(Timestamp Signatures Database)证书。
创建私有镜像
您可以通过镜像服务IMS创建私有镜像,创建私有镜像的方式包括:
- 通过云服务器或备份创建私有镜像:通过云服务器或备份创建私有镜像概述
- 通过镜像文件创建私有镜像:通过镜像文件创建私有镜像概述
更新安全启动镜像元数据
可通过“更新镜像信息”接口,更新以下镜像元数据。
接口获取地址:更新镜像信息
hw_firmware_type=uefi __support_secure_boot=true __platform_key=${__platform_key} __key_exchange_key=${__key_exchange_key} __signature_database=${__signature_database} __forbidden_signatures_database=${__forbidden_signatures_database} __timestamp_signatures_database=${__timestamp_signatures_database}
开启镜像安全启动
- 登录管理控制台。
- 选择“计算 > 镜像服务”,进入镜像服务页面。
- 单击“私有镜像”页签进入对应的镜像列表。
- 在镜像所在行的“操作”列下,单击“修改”。
- 在弹出的“修改镜像”对话框中,启动方式选择“UEFI”。
- 开启安全启动选项后,在选项下方的密钥数据库后面填写对应的输入内容。
- 单击“确定”。
配置ECS安全启动
- 登录管理控制台。
- 单击管理控制台左上角的
,选择区域和项目。
- 单击“
”,选择“计算 > 弹性云服务器”。
- 单击“购买弹性云服务器”,系统进入创建页。
- 根据业务需要,设置“可信系统”。
- 勾选“安全启动”,开启安全启动。
- 去勾选“安全启动”,关闭安全启动。
购买弹性云服务器的基础配置、网络配置以及高级配置,请参见自定义购买弹性云服务器。
- 单击“确认”,完成安全启动配置。