构建自定义映像的要求


在某些情况下,您的应用可能会要求您自行构建操作系统或编译自定义内核。如果为您的虚拟机编译自定义内核或创建自定义操作系统,请确保其符合本文档中的要求。

如果用户的应用特别需要自定义内核,则他们还需要完成构建自定义操作系统这项高级任务。大多数用户都可以通过一个可用的公共映像创建虚拟机,使用自动化的虚拟磁盘导入工具将磁盘从其他环境导入 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。

      此外,如果您在以下任一环境中使用 GPU,则必须或建议使用 gVNIC:

      • N1 通用机器类型
      • 加速器优化的 A3A2G2 机器类型
    • 供应商 = 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。
  • 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 环境中以最佳方式运行。