הדרישות ליצירת תמונות בהתאמה אישית

במצבים מסוימים, יכול להיות שתצטרכו לבנות מערכת הפעלה משלכם או לקמפל ליבת מערכת מותאמת אישית. אם אתם קומפלוים ליבות בהתאמה אישית או יוצרים מערכות הפעלה בהתאמה אישית למכונות הווירטואליות, אתם צריכים לוודא שהן עומדות בדרישות שמפורטות במסמך הזה.

יצירת מערכת הפעלה בהתאמה אישית היא משימה מתקדמת למשתמשים עם אפליקציות שדורשות ליבת מערכת הפעלה בהתאמה אישית. רוב המשתמשים יכולים ליצור מכונות וירטואליות מאחד קובצי האימג' הציבוריים שזמינים, להשתמש בכלי האוטומטי לייבוא דיסקים וירטואליים כדי לייבא דיסקים ל-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 באחד מהמקרים הבאים:

      • סוגי מכונות N1 לשימוש כללי
      • סוגי מכונות שעברו אופטימיזציה לשימוש במאיצים ‫A4,‏ ‫A3,‏ ‫A2 או ‫G2
    • ממשק 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-protector GCC. התכונה הזו מוסיפה ערך קנרי לתחילת פונקציות קריטיות, במחסנית לפני כתובת ההחזרה, ומאמתת את הערך לפני ההחזרה בפועל. בנוסף, זה גורם להצפת חוצץ מבוססת-מחסנית (שצריך להחליף את כתובת החזרה הזו) להחליף את הקנרית, מה שגורם לגילוי שלה ולנטרול המתקפה באמצעות פאניקה בקרנל.
  • CONFIG_COMPAT_VDSO=n
    • האפשרות הזו מוודאת ש-VDSO לא נמצא בכתובת צפויה, כדי לחזק את ASLR. אם התכונה הזו מופעלת, היא ממפה את ה-VDSO לכתובת צפויה בסגנון הישן, ומספקת מיקום צפוי לקוד ניצול כדי לקפוץ אליו. אם אתם מריצים גרסה עדכנית מספיק של glibc (גרסה 2.3.3 ואילך), אתם יכולים להזין כאן N כדי להסיר את המיפוי של VDSO בכתובת גבוהה ולהשתמש רק ב-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-utils
  • libibverbs-utils
  • perftest
  • rdma-core

המאמרים הבאים