plaintext
אימות ואישור הם חלקים גדולים בחידת הביטחון שעליה להתמודד על ידי ארכיטקטים של מערכות ענן ומהנדסי DevOps. בבלוג זה, נבחן במיוחד איך להשיג אישור/שליטה בניגוד; האם כלומר, אילו פעולות היחידה המאומתת יכולה לבצע במשטח השירותים של Istio. זה עוזר להגן על התשתית על ידי מניעת פעולות עם כוונות שונאיות.
אישור במשטח שירותים יכול להיות מוגדר באמצעות פוליסיות OPA. OPA היא מנגנון שעוזר לאנשי DevOps להגדיר ולהפעיל פוליסיות אישור עבור עבודות Kubernetes. במאמר זה, נראה:
- מהי OPA
- למה יש לשלב OPA עם משטח השירותים של Istio
- איך Istio ו-OPA מאשרים בקשות
- הצעדים המדויקים שאפשר לעקוב אחריהם כדי לשלב OPA עם Istio
מה הוא OPA?
OPA (הצדקה ל "Open Policy Agent") הוא עוגן בפתוח המיועד לשימוש כללי להפעלת פוליסיות, שמאפשר לאנשי DevOps להגדיר פוליסיות כקוד באמצעות שפת ההצהרה הדיגרטיבית הנקראת Rego. OPA עוזר להגדיר ולהפעיל פוליסיות באופן מרכזי ברוחב המערכת בצדקה ממפתחי היישומים מכתיבת פוליסיות אישור בתוך קוד היישום. הנה כיצד עובד OPA (תסתכלו על תרשים 1):
- היישום/שירות קובע בקשה.
- השירות שולח בקשת אישור JSON ל-OPA.
- OPA בודק את הבקשה בניגוד לפוליסיות האישור המוגדרות.
- 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 כך שהבקשות הפנימיות יכשלו באימוץ ולכן באישור.
אנחנו נעבור בסדר אחד אחר אחד דרך השלבים הנתונים:
- תכנון הזרת OPA בתאי סידקר.
- אפשר תקשורת בין מעבדת העיתונים Istio וO PA
- הגדרת התצורה OPA
- יישם את התצורה של Istio
- הגדרת היישום של היישום ובדיקת ההגדרה של Istio-OPA לאישור
האדם הקדם להדגמה הוא להיות Istio v1.19+ מו Installed במסגרת הקהילה שלך. אני משתמש ב Istio v1.21.0 כאן.
OPA מעניקה לך quickstart.yaml בכדי להתקין בקלות. פרידתי את ה yaml לשלושה חלקים בכדי להבין יותר קל: IMESH GitHub repo.
שלב 1: הגדרת הזרימת הצדדים OPA
יישם את opa_controller.yaml:
kubectl apply -f opa_controller.yaml
ה opa_controller.yaml
מהגדר הכל – סמלים הטסט, ה ConfigMap שמכיל מדיניות הזרימה, הגיבוי של המנהל וההגדרה של הוובהוקים המשנים – לתוך השמות המעטפים opa-istio
(הסתכלו על תרשים 5):
- מנהל הוובהוקים המשנים (
opa-istio-admission-controller
) יהאץ אחר סמל ספציפי (opa-istio-injection
) עם ערך מוגדר לסגול. - הבקר של הקונטרולר של הרשת מתקשר עם
admission-controller
, שיש לו מדינית הזרמה. - המדינית הזרמה מספקת ל
admission-controller
את ההוראות על איך לזרום את התא הצדדי OPA לתוך הפוד.
תרשים 5: הגדרת זרימת OPA לצדדים
עכשיו, לפני שיגור היישומון של היישומון Bookinfo, ניצור את המרחב bookinfo
ונשלוף בצעדים הבאים:
ניצור את המרחב bookinfo
על-ידי יישום bookinfo-ns.yaml:
kubectl apply -f bookinfo-ns.yaml
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 עם מסגרת שירות ונתונים מסוימים על הפורט:
...
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', כי הן קשורות ליישומן:
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
.
השלמת ההגדרות:
kubectl apply -f opa_authz.yaml -n bookinfo
שלב 5: השלמת היישומון ובדיקה את ההגדרה של Istio-OPA לאישור
השלמת היישומון של היישומון Bookinfo והגטייווי:
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
:
kubectl get pods -n bookinfo
ניתן לראות שלכל פוד יש 3 קונטיינים שמתפקדים בתוכו: היישומון, המתווכין Envoy (istio-proxy
), ו OPA (opa-istio
).
קבלת האי.P של הגטייווי Istio על מנת גישה לשירות:
kubectl get svc -n istio-system

עכשיו, הכל מוכן, ואנחנו מוכנים לבדוק את המדיניות האישור. המדיניות שהגדרנו ב opa_config.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
מאליצי:
curl -vvv your_istio_gateway_ip/api/v1/products -u alice:password
אתה יכול לראות שתגייות 403 Forbidden
מוצגות מאז אליס אינה מקבלת גישה למסלול. בואו ננסה את אותו המסלול כמו בוב:
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