מערכות מופרדות מאתגרות מעבר לאתגרים מסויימים בגלל המגוון והמיניאטור הגדול של הרכיבים המעורבים. עם שירותים רבים שמתעסקים אחד עם השני ברשתות שאולי אינן מאובטחות, סיכון הגישה לאינטרנט לא רשומה והפרצויות של מידע גדלים באופן סיבי. המאמר הזה חוקר גישה מעשית לאבטחת מערכות מופרדות בעזרת פרוייקט פתוח-סוף. הפרוייקט מראה איך להשתל בו מספר מנגנונים אבטחה וטכנולוגיות כדי להתמודד עם אתגרים אבטחה רגילים כמו ההתחברות, האימות והתקשורת הבטוחה.
הבנת אתגרים אבטחה במערכות מופרדות
מערכות מופרדות מכילות שירותים או מיקרו-שירותים שצריכים לתקשורת באופן בטוח מרחוק ברשת. אתגרים אבטחה העיקריים בארכיטקטורה הזו כוללים:
- תקשורת בטוחה: אזהרת של החיבור בין השירותים מוצפן ובטוח מהצקיף או הריסתם
- ההתחברות: אימות הזהות של המשתמשים והשירותים כדי למנוע גישה לא רשומה
- האימות: שליטה במה שמורשים למשתמשים ושירותים מוכרחים לעשות אחריו בהתבסס על התפקידים וההגישות שלהם
- אימוץ דיוקן של הגישות והמדיניות: יישום של שליטות גישות פסולת בעלות ומדיניות שמסביב לאינטראקצ
- מנהל תעודות: ניהול תעודות דיגיטליות להצפנת מידע ובניית אמון בין שירותים
הפרוייקט הפתוח הזה מתייחס לאתגרים האלה בעזרת כמה טכנולוגיות ופתרונות משולבים.
הגדרה וההגדרה של הפרוייקט
הפרוייקט מתחיל עם הגדרת הסביבה הבטיחה בעזרת סקripטים של שELL ו-Docker. ההגדרה מכילה את העיצוב של תעודות דיגיטליות ואת ההתחלה של השירותים הנחוצים כדי לוודא שכל הרכיבים מוכנים לתקשורת בטוחה.
שלבים להגדרת הסביבה
1. עיצוב תעודות
הפרוייקט משתמש בסקript של שELL (provisioning.sh
) כדי לדמות סוכנות הרשמה (CA) וליצור את התעודות הנחוצות לשירותים.
./provisioning.sh
2. התחלת שירותים
Docker Compose משמש כדי להתחיל את כל השירותים המוגדרים בפרוייקט, בכדי לוודא שהם מוגדרים נכונתם עבור תפקוד בטוח.
docker-compose up
3. בדיקת תקשורת שירותים-אל-שירותים
על מנת לוודא את התקשורת בין שירותים באמצעות תעודות וטוקנים JWT, נותן תסך-שירות test_services.sh
. התסך מדגים איך שירותים שונים מתחברים באמצעות תקשורת בטחונית בעזרת התעודות המיועדות להם.
פתרון אתגרי בטחון במערכות מפולצות
לפרוייקט הזה יש אינטגרציה של כמה טכנולוגיות עיקריות כדי להתמודד עם האתגרים הבטחוניים העיקריים האלה. כך שכל אתגר נטפל בדרך הבאה:
1. תקשורת בטוחה עם טLS הדדי (mTLS)
אתגר
במערכת מפולצת, השירותים צריכים לתקשר באופן בטוח כדי למנוע גישה לא מורשת ופרץ נתונים.
פתרון
הפרוייקט משתמש בטLS הדדי (mTLS)כדי לאסוף את התקשורת בין השירותים. mTLS מובטח שגם הלקוח והשרת מואמדים זה את השני בעזרת התעודות המיועדות להם. האמונה הדדית הזאת מונעת שירותים לא מורשת מתקשרים עם שירותים לא מורשתים.
יישום
Nginx מוגדר כפרוקסי הפוך לטיפול ב-mTLS. הוא דורש גם תעודות לקוח וגם תעודות שרת לצורך הקמת חיבור מאובטח, מה שמבטיח שהמידע המועבר בין השירותים נשאר סודי ואינו ניתן לשינוי.
2. אימות עם Keycloak
אתגר
אימות נכון של משתמשים ושירותים הוא קריטי למניעת גישה לא מורשית.
פתרון
הפרויקט מנצל את Keycloak, פתרון קוד פתוח לניהול זהויות וגישה, לניהול האימות. Keycloak תומך בשיטות אימות מרובות, כולל OpenID Connect ו-client credentials, מה שהופך אותו למתאים הן לאימות משתמשים והן לאימות שירותים.
- אימות משתמשים:
משתמשים מאומתים באמצעות OpenID Connect. Keycloak מוגדר עם לקוח (appTest-login-client
) שמטפל בתהליכי אימות משתמשים, כולל כניסה, הנפקת אסימונים וטיפול בקריאות חזרה. - אימות שירותים:
לאימות שירות לשירות, הפרויקט משתמש בלקוח Keycloak (client_credentials-test
) שמוגדר עבור סוג המענק של client credentials. שיטה זו אידיאלית לאימות שירותים ללא התערבות משתמש.
דוגמת תהליך אימות
- משתמשים מנווטים לדף הכניסה.
- אחרי ההתחברות המצלמדת, Keycloak מסייע את המשתמש לבעיר עבור דף חזרה עם קוד הסימן-התרעות.
- אחר כך, קוד הסימן-התרעות מחליף בטוקן JWT, שמשתמש בו לבקשים הבאים. הקובץ
authn.js
בתוך התוך התוך היררכיהnginx/njs
מספק יישום מפורט של התהליך הזה.
דוגמה לאמת מידע שירות בשימוש בתעמולות הלקוח
curl -X POST "http://localhost:9000/realms/tenantA/protocol/openid-connect/token" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "grant_type=client_credentials" \
-d "client_id=client_credentials-test" \
-d "client_secret=your-client-secret-here"
3. אמת מידע משתמש בעזרת מנהל המדיניות הפתוח (OPA) וטוקני JWT
אתגר
אימוץ בקשור בשימוש בשלטים נסיגים בגיון כדי לוודא שמשתמשים ושירותים מאמנים רק למשאבים מורשים
פתרון
הפרוייקט משתמש בשילוב של מנהל המדיניות הפתוח (OPA) ו טוקני JWT כדי לאמץ מדיניות אמת מידע. הפרוייקט מראה שלוש אסטרטגיות שונות לאימוץ הולמות את הביצועים האבטחתיים:
- שימוש בסיסמאות מקיימות מ-Keycloak: לוקח את הסיסמאות באופן דינמי מ-Keycloak כדי לאמץ את הטוקן.
- שימוש ב x5t (טבעות אצבע): משתמש בטבעות האצבע המוטבעות בתוך הטוקן כדי לאסוף את המפקד הציבורי ממאגר האמון המקומי.
- אמבדדת תעודות: מאשרת את הסימן באמצעות תעודה בלוקצ 'יין, ומוודאת שהתעודה מוכרת עם רשות סמכה מובטחת (CA).
הצע לקריאת הקובץ nginx/njs/token.js עבור ההתמצית המפורטת של האסטרטגיות האלה.
4. אימוץ דיקרטים עם סוכנות הדיקרטים הפתוחה (OPA)
אתגר
יישום דיקרטים של שימוש משתנים וגמישים לשליטה בשירותים ובמשתמשים
פתרון
OPA משמש לאימוץ דיקרטים פיניים לשליטה בגישות. הדיקרטים נכתבים בשפה דיוקרטיבית (Rego) ונאחסים בתוך התיקייה opa/. הדיקרטים האלה מציעים את התנאים בהם שירותים יכולים לתקשר ומשתמשים יכולים לגain גישה למשאבים, ומוודאים שמנגדלים הגישות מותקעים באופן קבוע במערכת.
5. ניהול תעודות
אתגר
ניהול תעודות דיגיטליות לשירותים בכדי לבסס אמון וסידור תקשורות מוגן.
פתרון:
הפרוייקט כולל מערכת ניהול מסמכים עמידה. תסלולת שELL (provisioning.sh
) משמשת לדמות סוכנות האימות המקוריים (CA) ולייצר מסמכים עבור כל שירות. הגישה הזו מפשטת את הניהול של המסמכים ומובטחת שלכל השירותים יש את הרשימות הנחוצות לתקשורת בטוחה.
אנחנו גם הוספנו קצת קישור במטרה לעדכון את מסמך השירות בלי צורך בהפעלה מחדש של nginx.
curl --insecure https://localhost/certs --cert certificates/gen/serviceA/client.crt --key certificates/gen/serviceA/client.key -F cert=@certificates/gen/serviceA/client.crt -F key=@certificates/gen/serviceA/client.key
הסיכון
בניית מערכת מופרדת בטוחה דורשת התייחסות בקדמה לאספקטים הבטיחות המגוונים, כולל תקשורת בטוחה, הכרת מוסד, אישור, פוליציה בודדת, וניהול מסמכים. פרוייקט זה של פתרונות פתוחות הוא דוגמה מופץ לאיך להדביק מספר מנגנונים בטיחות באופן מקרי לטפל באתגרים האלה באופן יעיל.
על ידי העמידה בהגדרות ובהגדרות המוצגות בפרוייקט הזה, מפתחים יכולים להשתמש ב-TLS הדדי, Keycloak, Open Policy Agent ו-Nginx כדי לבנות ארכיטקטורה בטוחה חזקה. הטכנולוגיות האלה, כשמשולבות, מעניקות יסוד חזק לאבטחת מערכות מופרדות נגד סוגים רבים של איומים, ומובטחת של הגנה על המידע ושל שליטת הגישה.
Source:
https://dzone.com/articles/designing-a-secure-architecture-for-distributed-systems