建立自訂映像檔的條件


在某些情況下,您的應用程式可能需要您建立自己的作業系統或編譯自訂核心。針對 VM 編譯自訂核心或建立自訂作業系統時,請確保二者皆符合本文件所列的條件。

對於所用應用程式明確需要自訂核心的使用者而言,建構自訂作業系統是一項進階工作。大多數使用者可透過其中一個可用公開映像檔建立 VM,使用自動化虛擬磁碟匯入工具將磁碟從其他環境匯入 Compute Engine,或從搭載常見一般 Linux 發行版的系統手動匯入自訂映像檔

硬體支援需求

您的核心必須支援下列裝置:

  • PCI Bridge:Intel Corporation 82371AB/EB/MB PIIX4 ACPI (修訂版 03)
  • ISA bridge:Intel 82371AB/EB/MB PIIX4 ISA (修訂版 03)
  • 乙太網路控制器:

    • Virtio-Net 乙太網路卡。
    • 對於第二代 Tau T2A 和所有第三代及後續機器系列,都需要 gVNIC。

      此外,如果您在下列任何情況下使用 GPU,則必須或建議使用 gVNIC:

      • 一般用途 N1 機器類型
      • 加速器最佳化 A4A3A2G2 機型
    • 供應商 = 0x1AF4 (Qumranet/Red Hat)

    • 裝置 ID = 0x1000。子系統 ID 0x1

    • 支援總和檢查碼卸載

    • 支援 TSO v4

    • 支援 GRO v4

  • SCSI 儲存控制器:

    • Virtio-SCSI 儲存控制器
    • 供應商 = 0x1AF4 (Qumranet/Red Hat)
    • 裝置 id = 0x1004。子系統 ID 0x8。
    • 支援 SCSI 主要指令 4 和 SCSI 區塊指令 3
    • 只支援一個要求佇列
    • 永久磁碟會回報 4 KiB 實體磁區 / 512 位元組邏輯磁區
    • 只支援區塊裝置 (磁碟)
    • 支援熱插拔/事件功能位元
  • 序列埠:
    • 四個 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,讓此項目運用其他全系統通用的安全設定,將 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

後續步驟