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

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

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

דרישות לתמיכה בחומרה

הליבה צריכה לתמוך במכשירים הבאים:

  • PCI Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 03)
  • גשר ISA: ‏ Intel 82371AB/EB/MB PIIX4 ISA (rev 03)
  • בקר אתרנט:

    • מתאם אתרנט Virtio-Net.
    • ‫gVNIC נדרש לסדרות מכונות מדור שני שמשתמשות בביצועים ברמת VM Tier_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

    • הפחתת עומס סיכום ביקורת נתמכת

    • יש תמיכה ב-TSO v4

    • יש תמיכה ב-GRO v4

    • אם משתמשים בממשקי רשת דינמיים, צריך לטעון את מודול 802.1Q לתוך הליבה

  • בקר אחסון SCSI:

    • Virtio-SCSI Storage Controller
    • ספק = 0x1AF4 (Qumranet/Red Hat)
    • מזהה המכשיר = 0x1004. מזהה מערכת המשנה 0x8.
    • יש תמיכה בפקודות SCSI Primary Commands 4 ובפקודות SCSI Block Commands 3
    • יש תמיכה רק בתור בקשות אחד
    • בדיסקים לאחסון מתמיד מדווח על 4 KiB של סקטורים פיזיים / 512 בייט של סקטורים לוגיים
    • יש תמיכה רק בחסימת מכשירים (דיסקים)
    • הביט של התכונה Hotplug / Events נתמך
  • יציאות טוריות:
    • ארבע יציאות 16550A
    • ttyS0 on IRQ 4
    • ttyS1 on IRQ 3
    • ttyS2 on IRQ 6
    • ttyS3 on IRQ 7

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

אם אתם מתכננים להשתמש בתמונת מערכת ההפעלה עם מכונות וירטואליות שמשתמשות ב-Cloud RDMA, צריך להתקין את חבילות ה-RPM הנוספות הבאות:

  • infiniband-diags
  • kmod-idpf-irdma (רק ל-Rocky Linux שעברה אופטימיזציה לתמונות של מערכת הפעלה) Google Cloud
  • librdmacm-utils
  • libibverbs-utils
  • perftest
  • rdma-core

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