配置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
使用以下语法对镜像进行签名:
sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/shimx64.efi /boot/efi/EFI/hce/shimx64.efi
sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/mmx64.efi /boot/efi/EFI/hce/mmx64.efi
sbsign --key db.key --cert db.crt --output /boot/efi/EFI/hce/grubx64.efi /boot/efi/EFI/hce/grubx64.efi
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
获取安全启动证书
请联系镜像提供方获取安全启动证书。
安全启动证书转码
- 禁用签名数据库(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安全启动
- 登录管理控制台。
- 单击管理控制台左上角的
,选择区域和项目。 - 单击“
”,选择“计算 > 弹性云服务器”。 - 单击“购买弹性云服务器”,系统进入创建页。
- 根据业务需要,设置“可信系统”。
- 勾选“安全启动”,开启安全启动。
- 去勾选“安全启动”,关闭安全启动。
购买弹性云服务器的基础配置、网络配置以及高级配置,请参见自定义购买弹性云服务器。
- 单击“确认”,完成安全启动配置。
