构建自定义操作系统

在某些情况下,您可能需要为应用构建自己的操作系统或编译自定义内核。为您的实例编译自定义内核或创建自定义操作系统时,请务必遵循本文档中的要求。

如果用户的应用特别需要自定义内核,就需要完成构建自定义操作系统这项高级任务。大多数用户都可以通过以下途径之一创建实例:使用可用的公共映像,使用自动化的虚拟磁盘导入工具将磁盘从其他环境导入 Compute Engine,或从搭载某个通用库存 Linux 发行版的系统手动导入自定义映像

硬件支持要求

您的内核必须支持以下设备:

  • PCI 网桥:Intel Corporation 82371AB/EB/MB PIIX4 ACPI(修订版 03)
  • ISA 网桥:Intel 82371AB/EB/MB PIIX4 ISA(修订版 03)
  • 以太网控制器:
    • Virtio-Net 以太网适配器
    • 供应商 = 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,它在常规 Linux 随机访问控制的基础上额外添加了系统级的安全设置,从而扩展了 DAC 支持。目前,该设置受限于 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

    # Implement RFC 1337 fix
    net.ipv4.tcp_rfc1337 = 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 环境中以最佳方式运行。