本主题介绍如何准备磁盘、生成安全证书以及启用任何必要的操作系统 (OS) 功能,以创建自定义的安全强化型映像。
默认情况下,安全强化型虚拟机支持 Container-Optimized OS、各种发行版的 Linux 以及多个版本的 Windows Server。但是,如果应用需要自定义映像,您仍然可以使用安全强化型虚拟机。
准备磁盘
安全强化型虚拟机依赖于统一可扩展固件接口 (UEFI) 兼容的固件来支持安全启动等功能。安全强化型虚拟机需要 GUID 分区表 (GPT) 方案;不支持主引导记录 (MBR)。
磁盘必须至少有两个分区:
- EFI 系统分区 (ESP):100 兆字节 (MB) 足以满足此分区的需求,仅供参考。您可以根据需要创建更大的分区。对 ESP 的唯一要求是,应使用文件分配表 (FAT) 文件系统对其进行格式化。
- 操作系统分区:磁盘其余部分。此分区包含启动操作系统(Linux 或 Windows)。此分区没有大小限制。
您可根据需要创建更多数据分区。
将操作系统复制到操作系统分区
磁盘格式化并正确分区后,请将操作系统文件复制到操作系统分区。操作系统的引导加载程序必须位于 UEFI 规范中指定的 ESP 上的有效路径中:
\EFI\Boot\bootx64.efi
。请注意,您可能需要将操作系统启动加载程序复制到指定位置。
对于 Windows,除了 Windows 要求的其他操作(例如复制 BCD 存储区)之外,名为 bcdboot
的命令可用于将操作系统启动加载程序复制到适当的位置。如需了解详情,请参阅 Microsoft Hardware Dev Center 的 BCDBoot 命令行选项。
使用安全强化型虚拟机映像时,您还可以利用另外两个安全功能:虚拟可信平台模块 (vTPM) 和完整性监控。以下部分概述了这些功能的优势和操作系统要求。
虚拟可信平台模块 (vTPM)
可信平台模块属于专用设备,用于保护您用于验证系统访问权限的对象(如密钥和证书)。在安全强化型虚拟机映像上,系统会使用虚拟版本的 TPM 设备来启用测量启动。简而言之,测量启动可确保启动和内核驱动程序的关键加载路径的完整性。安全强化型虚拟机文档中更详细地介绍了 vTPM 和测量启动。
要利用 vTPM 和测量启动,则需要安装驱动程序。提供 TPM 2.0 支持的最低操作系统版本为:
- Windows Server 2012
- Linux 版本 3.20
- Red Hat Enterprise Linux 7.3
完整性监控
完整性监控可帮助您了解虚拟机实例的状态并作出决策。Monitoring 使用测量启动生成的数据来报告虚拟机实例。安全强化型虚拟机文档详细介绍了完整性监控和自动响应完整性验证失败。
要支持安全强化型虚拟机完整性监控功能,映像必须生成完整性信号:
- Windows 默认情况下会生成完整性信号。
- Linux 必须安装并启用完整性测量架构 (IMA) 模块。该模块必须将
CONFIG_IMA_MEASURE_PCR_IDX
设置为 10。这是 IMA 模块的默认值。
将磁盘映像导入 Compute Engine
映像准备就绪后,您必须将映像上传到 Compute Engine。如需了解将映像上传到 Google Cloud 的必要步骤,请参阅将启动磁盘映像导入 Compute Engine。
为安全启动设置证书
添加安全强化型虚拟机映像时,系统会将一组安全启动公共证书和数据库传递到 Compute Engine。这些文件存储在相应的 UEFI 变量中,用于在平台、固件和操作系统之间建立信任关系。证书是唯一编码规则 (DER) 编码的 X.509 证书。数据库可以是证书或原始二进制文件。共有四个值:
- 平台密钥 (
pk
):用于在平台所有者和固件之间建立信任关系的密钥。您只能指定一个平台密钥,并且该密钥必须是有效的 X.509 证书。 - 密钥交换密钥 (
kek
):用于在固件和操作系统之间建立信任关系的密钥。您可以为此值指定多个密钥。 - 禁止密钥数据库 (
dbx
):证书的数据库已被撤消,如果使用其中一个证书为启动文件签名,将导致系统停止启动。您可以为此值指定一个或多个值。 - 密钥数据库 (
db
):受信任的证书数据库,可用于为启动文件签名。您可以为此值指定一个或多个值。
UEFI 规范包含有关这些值及其工作原理的更多信息。
在以下示例中,OpenSSL 用于创建安全启动密钥和证书。
生成一个 2048 位 RSA 密钥对
$ openssl genrsa -out secure-boot-key.rsa 2048
通过 DER 格式的密钥生成自签名 X.509 证书
$ openssl req -new -x509 -sha256 -subj '/CN=secure-boot' -key secure-boot-key.rsa -outform DER -out secure-boot-cert.pem
将防护的映像添加到 Google Cloud
现在,您可以使用上传的映像和证书将映像添加到 Compute Engine。您可以使用 Google Cloud CLI 或 Compute Engine API 添加该映像。
gcloud
将自定义映像添加到 Compute Engine:
gcloud compute images create [IMAGE_NAME] \
--source-disk [SOURCE_DISK] \
--source-disk-zone [ZONE] \
--platform-key-file=<file.der> \
--key-exchange-key-file=<file.der> \
--signature-database-file=<file.bin>,<file.der> \
--forbidden-database-file=<file.bin> \
--guest-os-features="UEFI_COMPATIBLE[,WINDOWS]"
其中:
[IMAGE_NAME]
是新映像的名称。[SOURCE_DISK]
是您要从中创建新映像的磁盘。[ZONE]
是磁盘所在的地区。
仅在使用 Windows 映像时才需要 guest-os-features
的 WINDOWS
选项。如需详细了解如何创建映像,请参阅 gcloud create
参考。
API
按照说明从永久性磁盘创建映像,但在请求正文中指定 initial_state_config
。
...
"sourceDisk": "/zones/[ZONE]/disks/[SOURCE_DISK]",
"initial_state_config": {
"pk": {
"content": [KEY],
"fileType": [BIN,X509]
},
"keks": [
{
"content": [KEY],
"fileType": [BIN,X509]
},
...
],
"dbxs": [
{
"content": [KEY],
"fileType": [BIN,X509]
},
...
],
"dbs": [
{
"content": [KEY],
"fileType": [BIN,X509]
},
...
]
}
默认证书
请注意,pk
、keks
、dbxs
和 dbs
是可选字段。如果您提供了初始状态配置,则这些字段中的部分或全部可能未设置。从映像创建新实例时,Google Cloud 会为PK
、KEK
、db
和 dbx
提供默认值,除非在任何未设置的字段上设置了自定义值。如果未提供初始状态配置(即配置缺失,而不仅仅是空),则映像将采用来源映像的初始状态配置。
这些字段的默认值为:
PK
:与 Google 创建的默认私钥关联的证书。KEK
:默认 Microsoft KEK 证书。从 Microsoft 下载:MicCorKEKCA2011_2011-06-24.crt
。dbx
:默认 Microsoft DBX 吊销列表。从统一可扩展固件接口论坛下载:UEFI 吊销列表文件db
:以下两个证书:- 带有
58 0a 6f 4c c4 e4 b6 69 b9 eb dc 1b 2b 3e 08 7b 80 d0 67 8d
的 SHA-1 证书哈希 的 Microsoft Windows 正式版 PCA 2011。从 Microsoft 下载:MicWinProPCA2011_2011-10-19.crt
。 - 拥有
46 de f6 3b 5c e6 1c f8 ba 0d e2 e6 63 9c 10 19 d0 ed 14 f3
的 SHA-1 证书哈希值的 Microsoft 公司(UEFI)CA 2011。从 Microsoft 下载:MicCorUEFCA2011_2011-06-27.crt
。
- 带有
请注意,添加自己的证书会覆盖默认证书,而不是将其与您提供的证书合并。