5 שלבים לשילוב איסטיו עם OPA

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

אישור במשטח שירותים יכול להיות מוגדר באמצעות פוליסיות OPA. OPA היא מנגנון שעוזר לאנשי DevOps להגדיר ולהפעיל פוליסיות אישור עבור עבודות Kubernetes. במאמר זה, נראה:

  • מהי OPA
  • למה יש לשלב OPA עם משטח השירותים של Istio
  • איך Istio ו-OPA מאשרים בקשות
  • הצעדים המדויקים שאפשר לעקוב אחריהם כדי לשלב OPA עם Istio

מה הוא OPA?

OPA (הצדקה ל "Open Policy Agent") הוא עוגן בפתוח המיועד לשימוש כללי להפעלת פוליסיות, שמאפשר לאנשי DevOps להגדיר פוליסיות כקוד באמצעות שפת ההצהרה הדיגרטיבית הנקראת Rego. OPA עוזר להגדיר ולהפעיל פוליסיות באופן מרכזי ברוחב המערכת בצדקה ממפתחי היישומים מכתיבת פוליסיות אישור בתוך קוד היישום. הנה כיצד עובד OPA (תסתכלו על תרשים 1):

  1. היישום/שירות קובע בקשה.
  2. השירות שולח בקשת אישור JSON ל-OPA.
  3. OPA בודק את הבקשה בניגוד לפוליסיות האישור המוגדרות.
  4. OPA ל

תרשים 1: זרימת בקשת אישור עם OPA

שימו לב שזה לא חייב להיות יישום שנכתב על ידי מפתחים ששולחים את בקשת האישור: זה יכול להיות Argo CD, משאב של Kubernetes Gateway API, Terraform, Prometheus, או מה שלא מכיוון שOPA היא מנגנון כללי-מודל. (זכרתי וציירתי את היישום בקובניטיס כדי להקל ולהבין טוב יותר.)

מדוע להדביק OPA אית Istio?

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

  • מערכת הניהול המרכזית עבור הגדרות ואימוץ מדיניות: OPA מקל לDevOps לניהול מרכזי את הפילטים האישור בכל המערכת. זה כולל עבודות ברשת, מערכת לא משולשת, וגם בדיקות האישור (פילט שמונע הגדרה בימים שלישיים, לדוגמה).
  • פלנגריות ופיזור קטן יותר בהגדרת הפילטים: אם תסתכלו על הטבלה הבאה (תרשים 2), יהיה ברור שאישור Istio יכול לעשות הרבה ולהתאים בקשה לפי מגוון של שדות ממקורות משונים. אך צורך יהיה בקונפיגורציית הפילטים האישור באיסטיו על גבי הבקשה HTTP או מידע הקשור בתנאים בשדות, על הם OPA יכולה להיות משמשת. בניגוד לאיסטיו, OPA יכולה להשתמש במידע כלשהו לבחינה הפילטים.
  • הגדר

תרשים 2: השוואה טבלאית בין Istio והאישור OPA (מקור)

איך Istio וOPA מאשרים בקשות

DevOps יכול להשתמש בOPA בתור שירות נפרד או בתור תא צדדי יחד עם המתקן Envoy והתא היישומי בפוד. הגישה של תא צדדי היא טובה יותר במטרה להפחית ההתאמה.

תאי צדדי OPA צריכים להודבק לתא היישומי באותו אופן של תאי צדדי המתקן Envoy של Istio. אנחנו יכולים להגדיר את התאים OPA המודבקים כדי להדביק ConfigMaps שמכילים את החוקים האישוריים; כל תא OPA צדדי בשם המיקום ידביק את אותה ההגדרה ואת החוקים AuthZ המוגדרים בConfigMap.

אחרי שתא OPA צדדי נודבק, המתקן Envoy ישלח בקשות אישור אל OPA על מנת להגיע להחלטות אישור בעת שהשירות מקבל בקשה:

תרשים 3: עבודת אישור Istio-OPA

אם העובדי DevOps לא רוצים שכל תא OPA צדדי המודבק באותו שם מיקום יעקב אחר אותה ההגדרות ורוצים לאמץ חוקים שונים, הם יכולים לבצע אף אחד מהדברים הבאים:

  • הוצאת את הקידוד הקשה שמאפשר למדיניות ההכנסה הנוכחית להשתמש בConfigMap מסויים
  • סדרת טעויות אקונמיות ובטלת ההכנסה של התאים ברמת הפוד.
  • משתמש בחבילות הדיפלומטים משרת HTTP מרחוק
  • הגדרת היישומה והסידקרים בשמות המערך השונים עם תעודות ConfigMap שונות

שלבים לאישור את השילוב של OPA עם Istio: דמו

הרעיון פה הוא להפוך OPA למורשה החיצוני במקום הסידקרים של Envoy — להחליט על הגישה.

אני אשתמש באפליקציית Bookinfo הקלאסית ממסמך Istio עבור הדמו. אני יוצא את ההגדרות של OPA עם Istio עבור בקרת הגישה ואני אבדן אם הם מוכחים על ידי שילוח בקשות אל bookinfo/productpage:

דיagram 4: סיור בשילוב Istio-OPA

שימו לב ש /productpage הוא המסך המשמש, שעושה בקשות פנימיות לשירותים אחרים, כמו שירותים של דיאגרמה ודירגומים (diagram). אני אשתל את OPA לכל פוד בשמיים bookinfo; כל תאי OPA מתקנים את אותו תעודת ConfigMap ויש להם את אותן המדיניות הסיסמית בגלל זה. התנהגות הברירת מחדל של האפליקציית Bookinfo אינה מעבירה את כל הגישה הHTTP כך שהבקשות הפנימיות יכשלו באימוץ ולכן באישור.

אנחנו נעבור בסדר אחד אחר אחד דרך השלבים הנתונים:

  1. תכנון הזרת OPA בתאי סידקר.
  2. אפשר תקשורת בין מעבדת העיתונים Istio וO PA
  3. הגדרת התצורה OPA
  4. יישם את התצורה של Istio
  5. הגדרת היישום של היישום ובדיקת ההגדרה של Istio-OPA לאישור

האדם הקדם להדגמה הוא להיות Istio v1.19+ מו Installed במסגרת הקהילה שלך. אני משתמש ב Istio v1.21.0 כאן.

OPA מעניקה לך quickstart.yaml בכדי להתקין בקלות. פרידתי את ה yaml לשלושה חלקים בכדי להבין יותר קל: IMESH GitHub repo

שלב 1: הגדרת הזרימת הצדדים OPA

יישם את opa_controller.yaml:

YAML

 

kubectl apply -f opa_controller.yaml

ה opa_controller.yaml מהגדר הכל – סמלים הטסט, ה ConfigMap שמכיל מדיניות הזרימה, הגיבוי של המנהל וההגדרה של הוובהוקים המשנים – לתוך השמות המעטפים opa-istio (הסתכלו על תרשים 5):

  1. מנהל הוובהוקים המשנים (opa-istio-admission-controller) יהאץ אחר סמל ספציפי (opa-istio-injection) עם ערך מוגדר לסגול.
  2. הבקר של הקונטרולר של הרשת מתקשר עם admission-controller, שיש לו מדינית הזרמה.
  3. המדינית הזרמה מספקת ל admission-controller את ההוראות על איך לזרום את התא הצדדי OPA לתוך הפוד.

תרשים 5: הגדרת זרימת OPA לצדדים

עכשיו, לפני שיגור היישומון של היישומון Bookinfo, ניצור את המרחב bookinfo ונשלוף בצעדים הבאים:

ניצור את המרחב bookinfo על-ידי יישום bookinfo-ns.yaml:

YAML

 

kubectl apply -f bookinfo-ns.yaml

You can see the namespace has the label opa-istio-injection: enabled, to auto-inject OPA sidecars.

שלב 2: הפעלת תקשורת בין המישורר של Istio ו OPA

עריכה בתוכנית ההגדרות של Istio במרחב istio-system והוספת extensionProviders (opa-ext-authz-grpc), כך שתאפשר הסכמה חיצונית במשך המשטח:

  • העתקת extensionProviders מההערה ב opa_controller.yaml.
  • עריכה בתוכנית ההגדרות של Istio והוספת extensionProviders בשדה המשטח.
  • ובדאי לוודא שההתקדמות נראית נכונה.
  • שמירת ההגדרות.

השלב הזה מאפשר ל istio-proxy לדבר עם תא opa-istio בתוך הפוד עבור בקשות האישור.

אם תסתכלו על extensionProviders, זה סוג של פילטר ExtAuthzGrpc בEnvoy עם מסגרת שירות ונתונים מסוימים על הפורט:

YAML

 

...

extensionProviders:
- name: opa-ext-authz-grpc
envoyExtAuthzGrpc:
service: opa-ext-authz-grpc.local
       port: "9191"

...

שמות המורשים extensionProviders וכתוביות השירותים והפורטים צריכים להיות אותם אותם ב opa_authz.yaml וב opa_config.yaml.

שלב 3: הגבלה של הגדרות OPA

ה opa_config.yaml מגדיר את הגדרות הקשורות למדיניות פתוחה. יש לו opa-istio-config ו opa-policy ConfigMaps – שמגדירים את הייצוג השירותי הgRPC (envoy_ext_authz_grpc) ואת המדיניות האותורזיסציונליות האמתיות, בעיקר.

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

על מנת להתרגל למדיניות האותורזיסציונליות, עליך להפעיל גירסה חדשה יותר של Rego. תרשו לו מילים מסוגים מסויימים (מילה תנאי האישור 'allow if', לדוגמה).

יש ליישם את הגדרות של OPA בשמית 'bookinfo', כי הן קשורות ליישומן:

YAML

 

kubectl apply -f opa_config.yaml -n bookinfo

שלב 4: יישום הגדרות Istio

הקובץ opa_authz.yaml מכיל הגדרות של Istio. יש לו AuthorizationPolicy וServiceEntry . שימו לב שספק האישור הוא opa-ext-authz-grpc , שהוא אותו extensionProvider שהוגדרנו ב ConfigMap בשלב 2.

באופן דומה, השמו המסור בServiceEntry הוא אותו של הכתובת השירות שנתנו בextensionProvider (opa-ext-authz-grpc.local). השירות ה gRPC ירדן על פורט 9191 ב localhost 127.0.0.1, שהServiceEntry יפתח את הopa-istio של הצדקרות בתוך הפוד על ידי הקונטיין istio-proxy.

השלמת ההגדרות:

YAML

 

kubectl apply -f opa_authz.yaml -n bookinfo

שלב 5: השלמת היישומון ובדיקה את ההגדרה של Istio-OPA לאישור

השלמת היישומון של היישומון Bookinfo והגטייווי:

YAML

 

kubectl apply -f /your_Istio_directory/samples/bookinfo/platform/kube/bookinfo.yaml -n bookinfo
kubectl apply -f /your_Istio_directory/samples/bookinfo/networking/bookinfo-gateway.yaml -n bookinfo

בדיקת הפודים במערכת שם bookinfo :

YAML

 

kubectl get pods -n bookinfo

ניתן לראות שלכל פוד יש 3 קונטיינים שמתפקדים בתוכו: היישומון, המתווכין Envoy (istio-proxy), ו OPA (opa-istio).

קבלת האי.P של הגטייווי Istio על מנת גישה לשירות:

YAML

 

kubectl get svc -n istio-system

עכשיו, הכל מוכן, ואנחנו מוכנים לבדוק את המדיניות האישור. המדיניות שהגדרנו ב opa_config.yaml הן הבאות:

YAML

 

...

user_roles = {
"alice": ["guest"],
"bob": ["admin"]
}

role_perms = {
"guest": [
{"method": "GET", "path": "/productpage"},
],
"admin": [
{"method": "GET", "path": "/productpage"},
{"method": "GET", "path": "/api/v1/products"},
        ],

...

אליצי היא משתמש מוביל שיכול לגשת רק ל/productpage; בוב הוא מנהל שיכול לגשת לנתיבים /productpage ו /api/v1/products. בואו נבדוק את המדיניות.

ניסיון לגשת /api/v1/products מאליצי:

YAML

 

curl -vvv your_istio_gateway_ip/api/v1/products -u alice:password

אתה יכול לראות שתגייות 403 Forbidden מוצגות מאז אליס אינה מקבלת גישה למסלול. בואו ננסה את אותו המסלול כמו בוב:

YAML

 

curl -vvv your_istio_gateway_ip/api/v1/products -u bob:password

זה מראה את מצב הHTTP 200 OK ואת תוכן הדף בסוף התגובה.

דוגמא סינריו לשליטה בגישה בעזרת OPA

אתה יכול להשתמש ב CRD AuthorizationPolicy של Istio כדי לאפשר את המדיניות שראינו בדמו למעלה. אתה לא צריך OPA. אך יש מקרים בהם האutorציון ב Istio יכול להיות מוגבל, כפי שציינתי בטבלה בהתחלה. תנו לי לתת דוגמה פשוטה.

נניח שיש אפליקציית BookReviews שהיא שירות GraphQL, בו מדורסים מסרים, עורכים עורכים ומועדים את המסרים החדשים, ומשתמשים קוראים למסרים הפורשים.

כשמדורס מוסיף משוב ספר לשירות, הבקשה תכלל את ה JWT שלו, שמכילה את הקבוצות והתפקידים (מדורס או עורך) שלו, בנוסף לגוף הבקשה של השאלה GraphQL עם המשוב החדש המוצע.

נניח שאתה רוצה לוודא את התנאים הבאים:

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

הנה הדיאגרמה המכילה את המדיניות האחרונות:

מדיניות האutorציון של Istio תקשה להניע א

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

סרטון: הדגמה בפעולה

אם אתה מעדיף לצפות בהדגמה בפעולה, בבקשה תביט בסרטון מתחת:S

תמיכה עירך עבור הדמיית Istio

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

Source:
https://dzone.com/articles/5-steps-to-integrate-istio-with-opa