在某些情况下,您的应用可能会要求您自行构建操作系统或编译自定义内核。如果为您的虚拟机编译自定义内核或创建自定义操作系统,请确保其符合本文档中的要求。
如果用户的应用特别需要自定义内核,则他们还需要完成构建自定义操作系统这项高级任务。大多数用户都可以通过一个可用的公共映像创建虚拟机,使用自动化的虚拟磁盘导入工具将磁盘从其他环境导入 Compute Engine,或从搭载某个通用的现有 Linux 发行版的系统手动导入自定义映像。
硬件支持要求
您的内核必须支持以下设备:
- PCI 网桥:Intel Corporation 82371AB/EB/MB PIIX4 ACPI(修订版 03)
- ISA 网桥:Intel 82371AB/EB/MB PIIX4 ISA(版本 03)
- 以太网控制器:
- Virtio-Net 以太网适配器。Tau T2A 虚拟机需要 gVNIC。
- 供应商 = 0x1AF4 (Qumranet/Red Hat)
- 设备 ID = 0x1000。子系统 ID 0x1
- 支持校验和分流
- 支持 TSO v4
- 支持 GRO v4
- SCSI 存储控制器:
- Virtio-SCSI 存储控制器
- 供应商 = 0x1AF4 (Qumranet/Red Hat)
- 设备 ID = 0x1004。子系统 ID 0x8。
- 支持 SCSI Primary Commands 4 和 SCSI Block Commands 3
- 只支持一个请求队列
- 永久性磁盘报告 4 KiB 物理扇区/512 字节逻辑扇区
- 仅支持块设备(磁盘)
- 支持 Hotplug/Events 功能位
- 串行端口:
- 4 个 16550A 端口
- IRQ 4 上的 ttyS0
- IRQ 3 上的 ttyS1
- IRQ 6 上的 ttyS2
- IRQ 7 上的 ttyS3
所需的 Linux 内核构建选项
您必须使用以下选项构建操作系统内核:
CONFIG_KVM_GUEST=y
- 启用半虚拟化功能。
CONFIG_KVM_CLOCK=y
- 启用半虚拟化时钟(如果适用于您的内核版本)。
CONFIG_VIRTIO_PCI=y
- 启用半虚拟化 PCI 设备。
CONFIG_SCSI_VIRTIO=y
- 启用对半虚拟化磁盘的访问。
CONFIG_VIRTIO_NET=y
- 允许访问网络。
CONFIG_PCI_MSI=y
- 启用高性能中断传送(这是本地 SSD 设备所需的功能)。
针对安全性的内核构建选项
在内核构建选项中使用推荐的安全设置:
CONFIG_STRICT_DEVMEM=y
- 对
/dev/mem
进行限制,仅允许访问 PCI 空间、BIOS 代码和数据地区。
- 对
CONFIG_DEVKMEM=n
- 停用对
/dev/kmem
的支持。 - 禁止访问内核内存。
- 停用对
CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
- 设置受保护的低虚拟内存,以防受用户空间分配的影响。
CONFIG_DEBUG_RODATA=y
- 在分页表中将内核只读数据标记为受写保护,以捕获对此类
const
数据的意外(及错误)写入。此选项会对性能产生轻微的影响,因为 2 MB TLB 不会再包含部分内核代码。
- 在分页表中将内核只读数据标记为受写保护,以捕获对此类
CONFIG_DEBUG_SET_MODULE_RONX=y
- 捕获对可加载内核模块文本和只读数据的意外修改。该选项还可以防止执行模块数据。
CONFIG_CC_STACKPROTECTOR=y
- 启用
-fstack-protector
GCC 功能。此功能会在关键函数的开头处置入一个 Canary 值(在堆栈上的返回地址之前),并会在实际返回结果之前验证该值。此举也会导致(需要覆盖此返回地址的)基于堆栈的缓冲区溢出位覆盖该 Canary。系统会检测到这种情况,并通过内核错误消除攻击。
- 启用
CONFIG_COMPAT_VDSO=n
- 确保 VDSO 并非位于可预测的地址,以加强 ASLR。一旦启用后,此功能就会将 VDSO 映射到可预测的旧式地址,同时提供一个可预测的位置,以供漏洞代码跳转至该位置。
如果您运行的
glibc
版本足够新(2.3.3 或更高版本),将此值设置为N
可移除高度映射的 VDSO 映射,并且仅使用随机化的 VDSO。
- 确保 VDSO 并非位于可预测的地址,以加强 ASLR。一旦启用后,此功能就会将 VDSO 映射到可预测的旧式地址,同时提供一个可预测的位置,以供漏洞代码跳转至该位置。
如果您运行的
CONFIG_COMPAT_BRK=n
- 不停用堆随机化。
CONFIG_X86_PAE=y
- 为 32 位内核设置此选项,因为 NX 支持需要 PAE。 这项设置也会启用对更大交换空间的支持功能,避免过度使用。
CONFIG_SYN_COOKIES=y
- 提供一定程度的 SYN 泛洪攻击防护措施。
CONFIG_SECURITY_YAMA=y
- 此选项会选择 Yama。Yama 会利用其他系统范围的安全设置,将 DAC 支持扩展到常规 Linux 自主访问权限控制范围之外。 目前,该设置受限于 ptrace 范围。
CONFIG_SECURITY_YAMA_STACKED=y
- 在 Yama 可用时,该选项会强制 Yama 与选定的主 LSM 堆叠。
内核安全设置
您还可以通过内核设置文件强化内核的安全。请修改 /etc/sysctl.conf
文件以加入以下建议的安全设置:
# Enable syn flood protection
net.ipv4.tcp_syncookies = 1
# Ignore source-routed packets
net.ipv4.conf.all.accept_source_route = 0
# Ignore source-routed packets
net.ipv4.conf.default.accept_source_route = 0
# Ignore ICMP redirects
net.ipv4.conf.all.accept_redirects = 0
# Ignore ICMP redirects
net.ipv4.conf.default.accept_redirects = 0
# Ignore ICMP redirects from non-GW hosts
net.ipv4.conf.all.secure_redirects = 1
# Ignore ICMP redirects from non-GW hosts
net.ipv4.conf.default.secure_redirects = 1
# Don't allow traffic between networks or act as a router
net.ipv4.ip_forward = 0
# Don't allow traffic between networks or act as a router
net.ipv4.conf.all.send_redirects = 0
# Don't allow traffic between networks or act as a router
net.ipv4.conf.default.send_redirects = 0
# Reverse path filtering—IP spoofing protection
net.ipv4.conf.all.rp_filter = 1
# Reverse path filtering—IP spoofing protection
net.ipv4.conf.default.rp_filter = 1
# Ignore ICMP broadcasts to avoid participating in Smurf attacks
net.ipv4.icmp_echo_ignore_broadcasts = 1
# Ignore bad ICMP errors
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Log spoofed, source-routed, and redirect packets
net.ipv4.conf.all.log_martians = 1
# Log spoofed, source-routed, and redirect packets
net.ipv4.conf.default.log_martians = 1
# Randomize addresses of mmap base, heap, stack and VDSO page
kernel.randomize_va_space = 2
# Provide protection from ToCToU races
fs.protected_hardlinks=1
# Provide protection from ToCToU races
fs.protected_symlinks=1
# Make locating kernel addresses more difficult
kernel.kptr_restrict=1
# Set ptrace protections
kernel.yama.ptrace_scope=1
# Set perf only available to root
kernel.perf_event_paranoid=2
后续步骤
- 将操作系统安装到启动磁盘,并将映像作为自定义映像手动导入 Compute Engine。
- 如果您已经将操作系统作为自定义映像导入,请针对该映像配置非内核设置,以使其能在 Compute Engine 环境中以最佳方式运行。