构建自定义操作系统

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

如果用户的某些应用特别需要自定义内核,那么他们还需要处理构建自定义操作系统这项高级任务。大多数用户都需要通过一个可用的公共映像创建实例,使用自动虚拟磁盘导入工具将磁盘从其他环境导入 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
    • 在分页表中将内核只读数据标记为写保护,以便捕获对此类常量数据的意外(及错误的)写入。此选项可能对性能有略微影响,因为内核代码的一部分内容不再被 2MB 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 可利用超出常规 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 文档