בלוג

הקשחת מכולות Docker לאירוח מרובה דיירים: מדריך בידוד שלב-אחר-שלב

למד כיצד לאבטח מכולות Docker בסביבות מרובות דיירים באמצעות אמצעי אבטחה מעשיים כמו משתמשים שאינם root, יכולות שהוסרו, מערכות קבצים לקריאה בלבד ובידוד רשת.

סיכום

הפעלת פלטפורמת אירוח Docker מרובת דיירים דורשת בידוד הרמטי של מכולות כדי למנוע מדיירים להפריע זה לזה או לברוח למארח. מדריך זה מספק תהליך הקשחה קונקרטי, שלב אחר שלב, שתוכל ליישם כבר היום. תלמד כיצד להגדיר משתמשים שאינם root, להסיר יכולות לינוקס מיותרות, לטעון מערכות קבצים במצב קריאה בלבד, לאכוף מגבלות משאבים באמצעות cgroups, לבדל רשתות, וליישם פרופילי seccomp או AppArmor. נסקור גם מתי להוסיף מכולות למכונות וירטואליות לאבטחה מרבית. בסיום, יהיה לך רשימת בדיקה לחיסול שיטתי של וקטורי בריחה נפוצים ממכולות ולשמירה על תשתית מרובת דיירים מבודדת באמת.

הבעיה האמיתית בעולם עם מכולות מרובות דיירים

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

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

שלב 1: הרץ מכולות כמשתמש שאינו root

כברירת מחדל, מכולות Docker רצות כ-root. אם מכולה נפרצת, התוקף מקבל הרשאות root בתוך המכולה ויכול לנסות בריחה. ראשית, צור משתמש ייעודי ב-Dockerfile ועבור אליו:

FROM ubuntu:22.04
RUN useradd -m appuser
USER appuser

הסתייגות: תהליכים מסוימים (למשל, קשירה לפורטים מתחת ל-1024) דורשים root. במקרים אלה, השתמש בדגל --cap-add כדי להעניק רק את היכולת הדרושה, כמו --cap-add=NET_BIND_SERVICE, ועדיין הרץ את התהליך תחת משתמש שאינו root.

למידע נוסף על בידוד בסיסי, ראה המדריך שלנו בנושא השגת בידוד אמיתי מרובה דיירים ב-Docker.

שלב 2: הסר את כל יכולות לינוקס והוסף חזרה רק מה שאתה צריך

יכולות לינוקס מפרקות הרשאות root ליחידות קטנות. מכולות Docker מגיעות עם סט ברירת מחדל של יכולות שהן מתירניות מדי לאירוח מרובה דיירים. הסר את כולן והוסף חזרה רק מה שהיישום שלך דורש:

docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE my-app

יכולות נפוצות להימנע: SYS_ADMIN (בריחה ממכולה), NET_RAW (רחרחת מנות), SYS_PTRACE (ניפוי תהליכים). השתמש ב-docker run עם --security-opt no-new-privileges כדי למנוע הסלמת הרשאות באמצעות בינאריים setuid.

שלב 3: טען את מערכת הקבצים הראשית במצב קריאה בלבד

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

docker run --read-only --tmpfs /tmp:rw,noexec,nosuid,size=64m my-app

--tmpfs יוצר עיגון זמני לכתיבה עבור ספריות כמו /tmp ו-/var/run. הדגל noexec מונע ביצוע מאותו עיגון. גישה זו מאלצת תוקפים לעבור דרך ספריות ניתנות לכתיבה, שאותן תוכל לנטר.

שלב 4: אכוף מגבלות משאבים עם cgroups

מכולות ללא גבולות יכולות לבצע התקפות מניעת שירות על ידי מיצוי זיכרון המארח או המעבד. השתמש באילוצי זמן הריצה של Docker:

docker run --memory=512m --memory-swap=512m --cpus=0.5 --pids-limit=100 my-app
  • --memory ו---memory-swap קובעים גבולות קשיחים (ללא החלפה).
  • --cpus מגביל מעבד.
  • --pids-limit מונע פצצות fork על ידי הגבלת מספר התהליכים.

הסתייגות: מגבלות משאבים נאכפות על ידי cgroups, אך הן אינן מונעות הוצאת נתונים דרך הרשת. שלב עם בידוד רשת (השלב הבא).

שלב 5: בדל רשתות עם רשתות Docker מותאמות אישית

כברירת מחדל, מכולות Docker חולקות רשת גשר. בהגדרה מרובת דיירים, עליך לבודד את ערימת הרשת של כל דייר. צור רשת ייעודית לכל דייר:

docker network create tenant-alpha --internal
docker run --network tenant-alpha my-app

השתמש בדגל --internal כדי לחסום גישה לאינטרנט החוצה, ולאחר מכן חשוף רק את הפורטים הדרושים באמצעות -p. לבידוד רשת מתקדם יותר, שקול אבטחת אפליקציות אינטרנט עם בידוד Docker.

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

שלב 6: יישם פרופילי seccomp ו-AppArmor

Seccomp מסנן קריאות מערכת, ו-AppArmor (או SELinux) אוכף בקרות גישה חובה. Docker מספק פרופיל seccomp ברירת מחדל החוסם קריאות מערכת מסוכנות כמו clone עם דגלים מסוימים. לבידוד מחמיר יותר, צור פרופיל מותאם אישית:

docker run --security-opt seccomp=./custom.json --security-opt apparmor=docker-default my-app

אתה יכול ליצור פרופיל בסיס עם docker run --rm -it --security-opt seccomp=unconfined my-app strace -c -S time ולאחר מכן לצמצם. הסתייגות: פרופילים מגבילים מדי יכולים לשבור פונקציונליות לגיטימית. בדוק היטב בסביבת staging.

שלב 7: שקול בידוד היברידי עם מכונות וירטואליות

אם הדיירים שלך דורשים בידוד מוחלט (למשל, תעשייה מוסדרת), הרץ מכולות בתוך VM קל משקל. כלים כמו Sysbox או Kata Containers מספקים הפרדה ברמת החומרה מבלי להקריב את מהירות המכולה. זוהי הגישה שבה משתמשת Enhanced Container Isolation (ECI) של Docker. למרות שהעומס גבוה יותר ממכולות חשופות, הוא נמוך בהרבה מ-VMs מלאים לכל עומס עבודה.

למידע נוסף על בחירת רמת הבידוד הנכונה, קרא תכנון ארכיטקטורת Docker מרובת דיירים.

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

  1. בנה מכולות עם משתמש שאינו root.
  2. הסר את כל היכולות, הוסף רק הנדרשות.
  3. טען מערכת קבצים לקריאה בלבד עם עיגונים זמניים לכתיבה.
  4. הגדר מגבלות זיכרון, מעבד ו-PID.
  5. צור רשתות Docker מבודדות לכל דייר.
  6. יישם פרופילי seccomp ו-AppArmor מותאמים אישית.
  7. הערך מכולות VM היברידיות לצורכי אבטחה גבוהים.

מסקנה

הקשחת מכולות אינה משימה חד-פעמית – היא משמעת מתמשכת. השלבים לעיל מהווים קו בסיס אבטחה לאירוח מרובה דיירים. זכור שאף אמצעי בודד אינו מבטיח בטיחות; הגנה בעומק היא המפתח. התחל עם היסודות: משתמשים שאינם root ויכולות שהוסרו. לאחר מכן הוסף שכבות של מגבלות משאבים ובידוד רשת. עבור עומסי העבודה הרגישים ביותר, שלב מכולות עם VMs. עם מדריך זה, תוכל לפרוס בביטחון סביבות Docker מרובות דיירים שהן גם יעילות וגם מאובטחות.

Sources (5)