במצבים מסוימים, יכול להיות שתצטרכו לבנות מערכת הפעלה משלכם או לקמפל ליבת מערכת מותאמת אישית. אם אתם קומפלוים ליבות בהתאמה אישית או יוצרים מערכות הפעלה בהתאמה אישית למכונות הווירטואליות, אתם צריכים לוודא שהן עומדות בדרישות שמפורטות במסמך הזה.
יצירת מערכת הפעלה בהתאמה אישית היא משימה מתקדמת למשתמשים עם אפליקציות שדורשות ליבת מערכת הפעלה בהתאמה אישית. רוב המשתמשים יכולים ליצור מכונות וירטואליות מאחד קובצי האימג' הציבוריים שזמינים, להשתמש בכלי האוטומטי לייבוא דיסקים וירטואליים כדי לייבא דיסקים ל-Compute Engine מסביבות אחרות, או לייבא באופן ידני קובץ אימג' בהתאמה אישית ממערכת עם הפצת Linux נפוצה.
דרישות לתמיכה בחומרה
הליבה צריכה לתמוך במכשירים הבאים:
- PCI Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
- גשר ISA: Intel 82371AB/EB/MB PIIX4 ISA (גרסה 03)
בקר אתרנט:
- מתאם אתרנט Virtio-Net.
gVNIC נדרש לסדרות מכונות מדור שני שמשתמשות בביצועים ברמה 1 של רשתות לכל מכונה וירטואלית, Tau T2A, וכל סדרות המכונות מדוד שלישי ומעלה, לא כולל מכונות Bare Metal.
בנוסף, נדרש או מומלץ להשתמש ב-gVNIC אם אתם משתמשים ביחידות GPU באחד מהמקרים הבאים:
ממשק LAN של IDPF (פונקציית מישור נתונים של Intel) נדרש למופעים של Bare Metal ולמופעים שמשתמשים ב-Cloud RDMA.
מתאם ה-Ethernet של Virtio-Net נתמך רק בסדרות מכונות מהדור הראשון והשני.
ספק = 0x1AF4 (Qumranet/Red Hat)
מזהה המכשיר = 0x1000. מזהה מערכת משנה 0x1
יש תמיכה ב-Checksum offload
יש תמיכה ב-TSO מגרסה 4
יש תמיכה ב-GRO v4
אם משתמשים בממשקי רשת דינמיים, צריך לטעון את מודול 802.1Q לליבת המערכת
בקר אחסון SCSI:
- בקר אחסון Virtio-SCSI
- ספק = 0x1AF4 (Qumranet/Red Hat)
- מזהה המכשיר = 0x1004. מזהה מערכת המשנה 0x8.
- יש תמיכה בפקודות SCSI Primary Commands 4 ובפקודות SCSI Block Commands 3
- יש תמיכה רק בתור בקשות אחד
- בדיסקים לאחסון מתמיד מדווח על 4 KiB של סקטורים פיזיים / 512 בייט של סקטורים לוגיים
- יש תמיכה רק במכשירים (דיסקים) לחסימה
- הביט של התכונה Hotplug / Events נתמך
- Serial Ports:
- ארבע יציאות 16550A
- ttyS0 on IRQ 4
- ttyS1 on IRQ 3
- ttyS2 on IRQ 6
- ttyS3 on IRQ 7
אפשרויות חובה לבניית ליבת Linux
צריך לבנות את ליבת מערכת ההפעלה עם האפשרויות הבאות:
CONFIG_KVM_GUEST=y- הפעלת הפונקציונליות של paravirtualization.
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כאלה. לאפשרות הזו יכולה להיות השפעה קלה על הביצועים, כי חלק מקוד הליבה לא יכוסה יותר על ידי TLB של 2 MB.
- מסמנים את נתוני הליבה לקריאה בלבד כנתונים שמוגנים מפני כתיבה בטבלאות הדפים,
כדי לזהות כתיבה מקרית (ושגויה) של נתוני
CONFIG_DEBUG_SET_MODULE_RONX=y- מזהה שינויים לא מכוונים בטקסט של מודול ליבה שאפשר לטעון ובנתונים לקריאה בלבד. האפשרות הזו גם מונעת את ההפעלה של נתוני המודול.
CONFIG_CC_STACKPROTECTOR=y- הפעלת התכונה
-fstack-protectorGCC. התכונה הזו מוסיפה ערך קנרי לתחילת פונקציות קריטיות, במחסנית לפני כתובת ההחזרה, ומאמתת את הערך לפני ההחזרה בפועל. בנוסף, זה גורם להצפת חוצץ מבוססת-מחסנית (שצריך להחליף את כתובת החזרה הזו) להחליף את הקנרית, מה שגורם לגילוי שלה ולנטרול המתקפה באמצעות פאניקה בקרנל.
- הפעלת התכונה
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 ביט כי נדרש PAE לתמיכה ב-NX. האפשרות הזו מאפשרת גם תמיכה במרחב החלפה גדול יותר למטרות שאינן הקצאת יתר.
CONFIG_SYN_COOKIES=y- מספקת הגנה מסוימת מפני הצפת SYN.
CONFIG_SECURITY_YAMA=y- האפשרות הזו בוחרת ב-Yama, שמרחיב את התמיכה ב-DAC עם הגדרות אבטחה נוספות ברמת המערכת, מעבר לאמצעי הבקרה הרגילים של Linux לגישה לפי שיקול דעת. ההגדרה שמוגדרת כברירת מחדל היא הגבלת היקף ה-ptrace.
CONFIG_SECURITY_YAMA_STACKED=y- האפשרות הזו מכריחה את Yama להיערם עם ה-LSM הראשי שנבחר, אם Yama זמין.
הגדרות אבטחה של ליבת המערכת
אפשר גם להגביר את האבטחה של ליבת מערכת ההפעלה באמצעות קובץ ההגדרות של ליבת מערכת ההפעלה. עורכים את קובץ /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
Cloud RDMA RPMs
אם אתם מתכננים להשתמש בתמונת מערכת ההפעלה עם מכונות וירטואליות שמשתמשות ב-Cloud RDMA, אתם צריכים להתקין את חבילות ה-RPM הנוספות הבאות:
infiniband-diags-
kmod-idpf-irdma(רק ל-Rocky Linux שעבר אופטימיזציה לתמונות של מערכת הפעלה) Google Cloud librdmacm-utilslibibverbs-utilsperftestrdma-core
המאמרים הבאים
- מתקינים את מערכת ההפעלה בדיסק אתחול ומייבאים את האימג' באופן ידני ל-Compute Engine כאימג' מותאם אישית.
- אם כבר ייבאתם את מערכת ההפעלה כאימג' בהתאמה אישית, אתם צריכים להגדיר את ההגדרות שאינן קשורות לליבת מערכת ההפעלה באימג' כדי שהוא יוכל לפעול בצורה אופטימלית בסביבת Compute Engine.