Linux
在某些情況下,您的應用程式可能需要您建立自己的作業系統或編譯自訂核心。針對 VM 編譯自訂核心或建立自訂作業系統時,請確保二者皆符合本文件所列的條件。
對於所用應用程式明確需要自訂核心的使用者而言,建構自訂作業系統是一項進階工作。大多數使用者可透過其中一個可用公開映像檔建立 VM,使用自動化虛擬磁碟匯入工具將磁碟從其他環境匯入 Compute Engine,或從搭載常見一般 Linux 發行版的系統手動匯入自訂映像檔。
硬體支援需求
您的核心必須支援下列裝置:
- PCI Bridge:Intel Corporation 82371AB/EB/MB PIIX4 ACPI (修訂版 03)
- ISA bridge:Intel 82371AB/EB/MB PIIX4 ISA (修訂版 03)
乙太網路控制器:
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。
- 確認 VDSO 不在可預測的位址,以利強化 ASLR。一旦啟用後,這個功能會將 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
後續步驟
- 在開機磁碟中安裝作業系統,並在 Compute Engine 中手動匯入映像檔,做為自訂映像檔。
- 如果您已經匯入作業系統 (自訂映像檔),請針對映像檔設定非核心設定,讓映像檔能夠在 Compute Engine 環境中以最佳狀態運作。