במסמך הזה מוסברות שיטות מומלצות לתכנון מדיניות בקרת גישה מבוססת-תפקידים (RBAC) ב-Google Kubernetes Engine (GKE). במסמך הזה אנחנו יוצאים מנקודת הנחה שאתם מכירים את הנושאים הבאים:
RBAC היא תכונת אבטחה מרכזית ב-Kubernetes שמאפשרת ליצור הרשאות מפורטות כדי לנהל את הפעולות שמשתמשים ועומסי עבודה יכולים לבצע במשאבים באשכולות. אתם יוצרים תפקידים של RBAC ומקשרים את התפקידים האלה לנושאים, שהם משתמשים מאומתים כמו חשבונות שירות או קבוצות Google.
המסמך הזה מיועד למומחי אבטחה ולמפעילים שמתכננים ומיישמים מדיניות RBAC בארגון שלהם. מידע נוסף על תפקידים נפוצים ומשימות לדוגמה שאנחנו מתייחסים אליהם בתוכן זמין במאמר תפקידים נפוצים של משתמשים ומשימות ב-GKE. Google Cloud
לרשימת משימות של ההנחיות במסמך הזה, אפשר לעיין בסיכום רשימת המשימות.
במאמר הגדרת בקרת גישה מבוססת-תפקידים מוסבר איך להטמיע RBAC ב-Google Kubernetes Engine (GKE).
איך RBAC עובד
מערכת RBAC תומכת בסוגים הבאים של תפקידים וקישורים:
- ClusterRole: קבוצת הרשאות שאפשר להחיל על כל מרחב שמות או על כל האשכול.
- תפקיד: קבוצה של הרשאות שמוגבלת למרחב שמות יחיד.
- ClusterRoleBinding: קישור של
ClusterRoleלמשתמש או לקבוצה בכל מרחבי השמות באשכול. - RoleBinding: קשירת
RoleאוClusterRoleלמשתמש או לקבוצה במרחב שמות ספציפי.
מגדירים הרשאות כ-rules ב-Role או ב-ClusterRole. כל rules
שדה בתפקיד מורכב מקבוצת API, ממשאבי ה-API בתוך קבוצת ה-API הזו, ומפעלים (פעולות) שמותרים במשאבים האלה. אפשר גם להגדיר את היקף הפעולה של הפעלים למופעים בעלי שם של משאבי API באמצעות השדה resourceNames. דוגמה מופיעה במאמר בנושא הגבלת הגישה למופעים ספציפיים של משאבים.
אחרי שמגדירים תפקיד, משתמשים ב-RoleBinding או ב-ClusterRoleBinding כדי לקשר את התפקיד לנושא. בוחרים את סוג הקישור בהתאם לרצון להעניק הרשאות במרחב שמות יחיד או בכמה מרחבי שמות.
עיצוב תפקידי RBAC
שימוש בעיקרון של הרשאות מינימליות
כשמקצים הרשאות בתפקיד RBAC, כדאי להשתמש בעיקרון של הרשאות מינימליות ולהעניק את ההרשאות המינימליות שנדרשות לביצוע משימה. השימוש בעיקרון של הרשאות מינימליות מצמצם את הסיכון להסלמת הרשאות אם האשכול שלכם ייפרץ, ומקטין את הסיכוי שגישה מוגזמת תוביל לאירוע אבטחה.
כשמעצבים את התפקידים, חשוב לשים לב לסיכונים נפוצים של הרשאות מוגברות, כמו פעלים escalate או bind, גישת create ל-PersistentVolumes או גישת create לבקשות לחתימת אישורים. רשימת הסיכונים זמינה במאמר בנושא Kubernetes RBAC – סיכונים של הסלמת הרשאות.
לא למחוק תפקידים וקישורים של RBAC במערכת
Kubernetes יוצר כמה משאבי RBAC עם התחילית system:, כמו system:basic-user, system:discovery ו-system:public-info-viewer ClusterRoleBindings. המשאבים האלה נדרשים כדי שהאשכול יפעל בצורה תקינה. מומלץ להימנע ממחיקה של תפקידים וקשרים במערכת, כי זה עלול לגרום לחוסר יציבות באשכול. שרת ה-API של Kubernetes מנסה לבצע באופן אוטומטי תהליך של התאמה בין המשאבים האלה בזמן ההפעלה, אבל אם ההתאמה נכשלת, יכול להיות שהאשכול יהפוך ללא נגיש.
כדי לוודא שתפקידים וקישורים במערכת לא נמחקים או משתנים, כדאי לבדוק את מדיניות ה-RBAC ולוודא שלסובייקטים אין הרשאות delete או update ב-RoleBindings וב-ClusterRoleBindings עם קידומות system:.
לא כדאי להשתמש בתפקידים ובקבוצות שמוגדרים כברירת מחדל
Kubernetes יוצרת קבוצה של ClusterRoles ו-ClusterRoleBindings שמוגדרים כברירת מחדל, שאפשר להשתמש בהם כדי לגלות את ה-API וכדי להפעיל את הפונקציונליות של רכיבים מנוהלים. ההרשאות שניתנות על ידי תפקידי ברירת המחדל האלה עשויות להיות נרחבות, בהתאם לתפקיד. ב-Kubernetes יש גם קבוצה של משתמשים וקבוצות משתמשים שמוגדרים כברירת מחדל, ומזוהים על ידי התחילית system:.
כברירת מחדל, Kubernetes ו-GKE מקשרים את התפקידים האלה באופן אוטומטי לקבוצות ברירת המחדל ולנושאים שונים. רשימה מלאה של תפקידי ברירת המחדל והקישורים שנוצרים ב-Kubernetes מופיעה במאמר תפקידי ברירת מחדל וקישורי תפקידים.
בטבלה הבאה מתוארים כמה תפקידים, משתמשים וקבוצות שמוגדרים כברירת מחדל. מומלץ להימנע מאינטראקציה עם התפקידים, המשתמשים והקבוצות האלה, אלא אם בדקתם אותם בקפידה, כי אינטראקציה עם המשאבים האלה עלולה לגרום להשלכות לא רצויות על מצב האבטחה של האשכול.
| שם | סוג | תיאור |
|---|---|---|
cluster-admin |
ClusterRole | מעניקה לנושא הרשאה לעשות כל דבר בכל משאב באשכול. |
system:anonymous |
משתמש | מערכת Kubernetes מקצה את המשתמש הזה לבקשות של שרת API שלא סופק לגביהן מידע לאימות. קישור תפקיד למשתמש הזה מעניק לכל משתמש לא מאומת את ההרשאות שמוענקות על ידי התפקיד הזה. |
system:unauthenticated |
קבוצה | Kubernetes מקצה את הקבוצה הזו לבקשות לשרת ה-API שלא סופק להן מידע אימות. קישור תפקיד לקבוצה הזו מעניק לכל משתמש לא מאומת את ההרשאות שניתנות על ידי התפקיד הזה. |
system:authenticated |
קבוצה | GKE מקצה את הקבוצה הזו לבקשות של שרת API שמוגשות על ידי כל משתמש שמחובר לחשבון Google, כולל כל חשבונות Gmail. בפועל, אין הבדל משמעותי בין צירוף תפקיד לקבוצה הזו מעניק לכל משתמש עם חשבון Google, כולל כל חשבונות Gmail, את ההרשאות שמוענקות על ידי התפקיד הזה. |
system:masters |
קבוצה | כברירת מחדל, Kubernetes מקצה את אם תוסיפו נושאים משלכם לקבוצה הזו, תהיה להם גישה לכל המשאבים באשכול. |
אם אפשר, כדאי להימנע מיצירת קשרים שכוללים את המשתמשים, התפקידים והקבוצות שמוגדרים כברירת מחדל. זה עלול להוביל להשלכות לא מכוונות על מצב האבטחה של האשכול. לדוגמה:
- קישור של
cluster-adminClusterRole שמוגדר כברירת מחדל לקבוצהsystem:unauthenticatedמעניק למשתמשים לא מאומתים גישה לכל המשאבים באשכול (כולל סודות). הקישורים האלה עם ההרשאות הגבוהות הם יעד פעיל להתקפות כמו קמפיינים של תוכנות זדוניות בהיקף נרחב. - קישור של תפקיד בהתאמה אישית לקבוצה
system:unauthenticatedמעניק למשתמשים לא מאומתים את ההרשאות שמוענקות על ידי התפקיד הזה.
במידת האפשר, כדאי לפעול לפי ההנחיות הבאות:
- אל תוסיפו נושאים משלכם לקבוצה
system:masters. - לא לקשר את הקבוצה
system:unauthenticatedלאף תפקיד RBAC. - לא לקשר את הקבוצה
system:authenticatedלאף תפקיד RBAC. - לא לקשר את המשתמש
system:anonymousלתפקידים כלשהם ב-RBAC. - אל תקשרו את
cluster-adminClusterRole לנושאים שלכם או למשתמשים ולקבוצות שמוגדרים כברירת מחדל. אם האפליקציה שלכם דורשת הרשאות רבות, כדאי לקבוע אילו הרשאות בדיוק נדרשות וליצור תפקיד ספציפי למטרה הזו. - לפני שמקשרים נושאים, כדאי לבדוק את ההרשאות שניתנות על ידי תפקידי ברירת מחדל אחרים.
- כדאי לבדוק את התפקידים שמשויכים לקבוצות ברירת המחדל לפני שמשנים את חברי הקבוצות האלה.
איך מונעים שימוש בקבוצות ברירת מחדל
אפשר להשתמש ב-CLI של gcloud כדי להשבית קישורי RBAC שאינם ברירת מחדל באשכול שמפנים לקבוצות system:unauthenticated ו-system:authenticated או למשתמש system:anonymous. משתמשים באחד מהדגלים הבאים או בשניהם כשיוצרים אשכול GKE חדש או מעדכנים אשכול קיים.
השימוש בדגלים האלה לא משבית את הקישורים של Kubernetes שמוגדרים כברירת מחדל ומפנים לקבוצות האלה. כדי להשתמש בדגלים האלה, צריך GKE בגרסה 1.30.1-gke.1283000 ואילך.
-
--no-enable-insecure-binding-system-authenticated: השבתה של קשירות שאינן ברירת מחדל שמפנות אלsystem:authenticated. -
--no-enable-insecure-binding-system-unauthenticated: השבתה של קשירות לא מוגדרות כברירת מחדל שמפנות אלsystem:unauthenticatedו-system:anonymous.
זיהוי והסרה של שימוש בתפקידים ובקבוצות שמוגדרים כברירת מחדל
כדי לבדוק אם האשכולות שלכם מפנים למשתמשים ולקבוצות האלה בהתחייבויות של RBAC, צריך להפעיל את רמת הביניים של סריקת מצב האבטחה של Kubernetes באשכולות או בצי שלכם, כדי ש-GKE יוכל להציג לכם את התוצאות בלוח הבקרה של מצב האבטחה ב Google Cloud מסוף. הוראות מפורטות מופיעות במאמר הפעלת ביקורת על הגדרת עומסי עבודה.
בקטעים הבאים מוסבר איך למצוא את ה-RoleBindings או ה-ClusterRoleBindings הספציפיים שמפנים למשתמשים ולקבוצות שמוגדרים כברירת מחדל, ואיך למחוק את המשאבים האלה.
ClusterRoleBindings
מציגים את השמות של כל ClusterRoleBindings עם הנושא
system:anonymous,system:unauthenticatedאוsystem:authenticated:kubectl get clusterrolebindings -o json \ | jq -r '["Name"], ["-----"], (.items[] | select((.subjects | length) > 0) | select(any(.subjects[]; .name == "system:anonymous" or .name == "system:unauthenticated" or .name == "system:authenticated")) | [.metadata.namespace, .metadata.name]) | @tsv'הפלט צריך לכלול רק את ה-ClusterRoleBindings הבאים:
Name ---- "system:basic-user" "system:discovery" "system:public-info-viewer"אם הפלט מכיל קישורים נוספים שאינם ברירת המחדל, מבצעים את הפעולות הבאות לכל קישור נוסף. אם הפלט לא מכיל קשירות שאינן ברירת מחדל, אפשר לדלג על השלבים הבאים.
מציגים את ההרשאות של התפקיד שמשויך לקישור:
kubectl get clusterrolebinding CLUSTER_ROLE_BINDING_NAME -o json \ | jq ' .roleRef.name +" " + .roleRef.kind' \ | sed -e 's/"//g' \ | xargs -l bash -c 'kubectl get $1 $0 -o yaml'מחליפים את
CLUSTER_ROLE_BINDING_NAMEבשם של ClusterRoleBinding שאינו ברירת המחדל.הפלט אמור להיראות כך:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: ... rules: - apiGroups: - "" resources: - secrets verbs: - get - watch - listאם קובעים שההרשאות בפלט בטוחות להענקה למשתמשים או לקבוצות שמוגדרים כברירת מחדל, לא נדרשת פעולה נוספת. אם קובעים שההרשאות שניתנו על ידי הקישור לא בטוחות, ממשיכים לשלב הבא.
כדי למחוק קישור לא בטוח מהאשכול:
kubectl delete clusterrolebinding CLUSTER_ROLE_BINDING_NAMEמחליפים את
CLUSTER_ROLE_BINDING_NAMEבשם של ClusterRoleBinding שרוצים למחוק.
RoleBindings
מציגים את מרחב השמות ואת השם של כל RoleBinding עם הנושא
system:anonymous,system:unauthenticatedאוsystem:authenticated:kubectl get rolebindings -A -o json \ | jq -r '["Namespace", "Name"], ["---------", "-----"], (.items[] | select((.subjects | length) > 0) | select(any(.subjects[]; .name == "system:anonymous" or .name == "system:unauthenticated" or .name == "system:authenticated")) | [.metadata.namespace, .metadata.name]) | @tsv'אם האשכול מוגדר בצורה נכונה, הפלט צריך להיות ריק. אם הפלט מכיל קישורים שאינם ברירת מחדל, מבצעים את השלבים הבאים לכל קישור נוסף. אם הפלט ריק, מדלגים על השלבים הבאים.
אם אתם יודעים רק את השם של RoleBinding, אתם יכולים להשתמש בפקודה הבאה כדי למצוא התאמות של RoleBinding בכל מרחבי השמות:
kubectl get rolebindings -A -o json \ | jq -r '["Namespace", "Name"], ["---------", "-----"], (.items[] | select((.subjects | length) > 0) | select(.metadata.name == "ROLE_BINDING_NAME") | [.metadata.namespace, .metadata.name]) | @tsv'מחליפים את
ROLE_BINDING_NAMEבשם של RoleBinding שאינו ברירת המחדל.מציגים את ההרשאות של התפקיד שמשויך לקישור:
kubectl get rolebinding ROLE_BINDING_NAME --namespace ROLE_BINDING_NAMESPACE -o json \ | jq ' .roleRef.name +" " + .roleRef.kind' \ | sed -e 's/"//g' \ | xargs -l bash -c 'kubectl get $1 $0 -o yaml --namespace ROLE_BINDING_NAMESPACE'מחליפים את מה שכתוב בשדות הבאים:
-
ROLE_BINDING_NAME: השם של RoleBinding שאינו ברירת המחדל. -
ROLE_BINDING_NAMESPACE: מרחב השמות של RoleBinding שאינו ברירת המחדל.
הפלט אמור להיראות כך:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: ... rules: - apiGroups: - "" resources: - secrets verbs: - get - watch - listאם קובעים שההרשאות בפלט בטוחות להענקה למשתמשים או לקבוצות שמוגדרים כברירת מחדל, לא נדרשת פעולה נוספת. אם קובעים שההרשאות שניתנו על ידי הקישור לא בטוחות, ממשיכים לשלב הבא.
-
כדי למחוק קישור לא בטוח מהאשכול:
kubectl delete rolebinding ROLE_BINDING_NAME --namespace ROLE_BINDING_NAMESPACEמחליפים את מה שכתוב בשדות הבאים:
-
ROLE_BINDING_NAME: השם של RoleBinding שרוצים למחוק. -
ROLE_BINDING_NAMESPACE: מרחב השמות של ה-RoleBinding שרוצים למחוק.
-
הגדרת הרשאות ברמת מרחב השמות
משתמשים בקישורים ובתפקידים באופן הבא, בהתאם לצרכים של עומס העבודה או המשתמש:
- כדי להעניק גישה למשאבים במרחב שמות אחד, משתמשים ב-
RoleעםRoleBinding. - כדי להעניק גישה למשאבים ביותר ממרחב שמות אחד, צריך להשתמש ב-
ClusterRoleעםRoleBindingלכל מרחב שמות. - כדי להעניק גישה למשאבים בכל מרחבי השמות, משתמשים ב-
ClusterRoleעםClusterRoleBinding.
כדאי להעניק הרשאות בכמה שמות מתחם שאפשר.
לא להשתמש בתווים כלליים
התו * הוא תו כללי לחיפוש שחל על הכול. מומלץ להימנע משימוש בתווים כלליים בכללים. מציינים במפורש קבוצות, משאבים ופעלים של API בכללי RBAC. לדוגמה, אם מציינים * בשדה verbs, מקבלים הרשאות get, list, watch, patch, update, deletecollection ו-delete למשאבים. בטבלה הבאה מוצגות דוגמאות לכללים שבהם לא נעשה שימוש בתווים כלליים:
| מומלץ | לא מומלץ |
|---|---|
- rules: apiGroups: ["apps","extensions"] resources: ["deployments"] verbs: ["get","list","watch"] ההרשאות |
- rules: apiGroups: ["*"] resources: ["deployments"] verbs: ["get","list","watch"] ההרשאה ניתנת לפעולות |
- rules: apiGroups: ["apps", "extensions"] resources: ["deployments"] verbs: ["get", "list", "watch"] ההרשאות שניתנות הן רק לפעלים |
- rules: apiGroups: ["apps", "extensions"] resources: ["deployments"] verbs: ["*"] נותן את כל הפעלים, כולל |
שימוש בכללים נפרדים כדי להעניק גישה עם הרשאות מינימליות למשאבים ספציפיים
כשמתכננים את הכללים, כדאי לנסות את השלבים הבאים כדי ליצור כללים יעילים יותר של הרשאות מינימליות בכל תפקיד:
- יוצרים כללי RBAC נפרדים לכל פועל בכל משאב שנושא צריך לגשת אליו.
- אחרי שכותבים את הכללים, צריך לנתח אותם כדי לבדוק אם לכמה כללים יש את אותה
verbsרשימה. משלבים את הכללים האלה לכלל אחד. - חשוב להפריד בין כל הכללים הנותרים.
הגישה הזו מאפשרת ליצור כללים מאורגנים יותר, שבהם כללים שמעניקים את אותם הפעלים למספר משאבים משולבים, וכללים שמעניקים פעלים שונים למשאבים מופרדים.
לדוגמה, אם לעומס העבודה שלכם נדרשות הרשאות למשאב deployments, אבל נדרשות לו גם הרשאות list ו-watch למשאבים daemonsets, כדאי להשתמש בכללים נפרדים כשיוצרים תפקיד. כשמקשרים את תפקיד ה-RBAC לעומס העבודה, אי אפשר להשתמש ב-watch ב-deployments.
דוגמה נוספת: אם עומס העבודה שלכם צריך get ו-watch גם במשאב pods וגם במשאב daemonsets, אתם יכולים לשלב אותם בכלל אחד, כי עומס העבודה צריך את אותם פעלים בשני המשאבים.
בטבלה הבאה, שני סוגי הכללים פועלים, אבל הכללים המפוצלים מגבילים את הגישה למשאבים בצורה יותר מדויקת בהתאם לצרכים שלכם:
| מומלץ | לא מומלץ |
|---|---|
- rules: apiGroups: ["apps"] resources: ["deployments"] verbs: ["get"] - rules: apiGroups: ["apps"] resources: ["daemonsets"] verbs: ["list", "watch"] התפקיד הזה מעניק גישה ל- |
- rules: apiGroups: ["apps"] resources: ["deployments", "daemonsets"] verbs: ["get","list","watch"] ההרשאות ניתנות גם ל-Deployments וגם ל-DaemonSets. נושא
שלא צריך גישה לאובייקטים של |
- rules: apiGroups: ["apps"] resources: ["daemonsets", "deployments"] verbs: ["list", "watch"] משלב בין שני כללים כי הנושא צריך את אותם פעלים גם למשאב |
- rules: apiGroups: ["apps"] resources: ["daemonsets"] verbs: ["list", "watch"] - rules: apiGroups: ["apps"] resources: ["deployments"] verbs: ["list", "watch"] הכללים המפוצלים האלה יניבו את אותה תוצאה כמו הכלל המשולב, אבל הם ייצרו עומס מיותר במניפסט התפקידים |
הגבלת הגישה למופעים ספציפיים של משאבים
ב-RBAC אפשר להשתמש בשדה resourceNames בכללים כדי להגביל את הגישה למופע ספציפי של משאב עם שם. לדוגמה, אם אתם כותבים תפקיד RBAC שצריך update את ConfigMap seccomp-high ולא שום דבר אחר, אתם יכולים להשתמש ב-resourceNames כדי לציין רק את ConfigMap הזה. מומלץ להשתמש ב-resourceNames כשאפשר.
| מומלץ | לא מומלץ |
|---|---|
- rules: apiGroups: [""] resources: ["configmaps"] resourceNames: ["seccomp-high"] verbs: ["update"] מגביל את הנושא לעדכון רק של |
- rules: apiGroups: [""] resources: ["configmaps"] verbs: ["update"] הנושא יכול לעדכן את |
- rules: apiGroups: [""] resources: ["configmaps"] verbs: ["list"] - rules: apiGroups: [""] resources: ["configmaps"] resourceNames: ["seccomp-high"] verbs: ["update"] מעניק |
- rules: apiGroups: [""] resources: ["configmaps"] verbs: ["update", "list"] מעניק גישת |
אל תאפשרו לחשבונות שירות לשנות משאבי RBAC
אל תקשרו משאבים של Role או ClusterRole עם הרשאות bind, escalate, create, update או patch בקבוצת ה-API של rbac.authorization.k8s.io לחשבונות שירות במרחב שמות כלשהו. escalate ו-bind בפרט יכולים לאפשר לתוקף לעקוף את מנגנוני מניעת ההרשאות שמוטמעים ב-RBAC.
הגבלת היכולת של עומסי עבודה לשנות את עצמם
לעומסי עבודה מסוימים של Kubernetes, במיוחד לעומסי עבודה של המערכת, יש הרשאה לבצע שינויים בעצמם. לדוגמה, חלק מעומסי העבודה מבצעים שינוי גודל אוטומטי אנכי בעצמם. שינוי עצמי יכול לאפשר לתוקף שכבר פרץ לצומת להרחיב את הגישה שלו באשכול. לדוגמה, תוקף יכול לשנות את מרחב השמות של עומס עבודה כדי להריץ אותו כ-ServiceAccount עם הרשאות גבוהות יותר באותו מרחב שמות.
אלא אם יש צורך בכך, אל תתנו ל-Pods הרשאה לשנות את עצמם. אם חלק מה-Pods צריכים לשנות את עצמם, אפשר להשתמש ב-Policy Controller כדי להגביל את השינויים שעומסי העבודה יכולים לבצע. לדוגמה, אפשר להשתמש בתבנית האילוץ NoUpdateServiceAccount כדי למנוע מ-Pods לשנות את ServiceAccount. כשיוצרים מדיניות, צריך להחריג מהאילוצים את כל רכיבי ניהול האשכולות, כמו בדוגמה הבאה:
parameters:
allowedGroups:
- system:masters
allowedUsers:
- system:addon-manager
חשבונות שירות של Kubernetes
יצירת חשבון שירות ב-Kubernetes לכל עומס עבודה
יוצרים חשבון שירות נפרד ב-Kubernetes לכל עומס עבודה. מקשרים הרשאת Role או ClusterRole עם הרשאות מינימליות לחשבון השירות הזה.
לא להשתמש בחשבון השירות שמוגדר כברירת מחדל
Kubernetes יוצר חשבון שירות בשם default בכל מרחב שמות. חשבון השירות default מוקצה אוטומטית ל-Pods שלא מצוין בהם חשבון שירות באופן מפורש במניפסט. לא מומלץ לקשר Role או ClusterRole לחשבון השירות default. יכול להיות שמערכת Kubernetes תקצה את חשבון השירות default לפוד שלא צריך את הגישה שניתנה בתפקידים האלה.
לא להפעיל באופן אוטומטי את הטוקנים של חשבון השירות
השדה automountServiceAccountToken במפרט של ה-Pod אומר ל-Kubernetes להחדיר אסימון של פרטי כניסה לחשבון שירות של Kubernetes לתוך ה-Pod. ה-Pod יכול להשתמש באסימון הזה כדי לשלוח בקשות מאומתות לשרת ה-API של Kubernetes. ערך ברירת המחדל של השדה הזה הוא true.
בכל הגרסאות של GKE, צריך להגדיר את automountServiceAccountToken=false במפרט של ה-Pod אם ה-Pods לא צריכים לתקשר עם שרת ה-API.
עדיף להשתמש בטוקנים זמניים במקום בטוקנים מבוססי-סוד
כברירת מחדל, תהליך kubelet בצומת מאחזר טוקן של חשבון שירות לזמן קצר, שמתבצעת לו רוטציה אוטומטית לכל Pod. kubelet מטמיע את האסימון הזה ב-Pod כנפח מוטל, אלא אם מגדירים את השדה automountServiceAccountToken לערך false במפרט של ה-Pod. כל קריאה ל-Kubernetes API מה-Pod משתמשת באסימון הזה כדי לבצע אימות לשרת ה-API.
אם אתם מאחזרים אסימונים של חשבון שירות באופן ידני, אל תשתמשו ב-Kubernetes Secrets כדי לאחסן את האסימון. טוקנים של חשבונות שירות שמבוססים על סודות הם אמצעי אימות מדור קודם שלא פג תוקפם ולא מתבצעת עבורם רוטציה אוטומטית. אם אתם צריכים פרטי כניסה לחשבונות שירות, אתם יכולים להשתמש ב-TokenRequest API כדי לקבל אסימונים לטווח קצר שמסתובבים באופן אוטומטי.
בדיקה מתמשכת של הרשאות RBAC
כדאי לבדוק באופן קבוע את התפקידים והגישה שלכם ב-RBAC כדי לזהות נתיבי הסלמה פוטנציאליים וכללים מיותרים. לדוגמה, נניח שלא מוחקים RoleBinding שמקשר Role עם הרשאות מיוחדות למשתמש שנמחק. אם תוקף יוצר חשבון משתמש במרחב השמות הזה עם אותו שם כמו של המשתמש שנמחק, הוא ישויך ל-Role ויקבל את אותה גישה. בדיקות תקופתיות ממזערות את הסיכון הזה.
סיכום רשימת המשימות
המאמרים הבאים
- מידע נוסף על אבטחת GKE
- קריאת שיטות מומלצות ל-RBAC ב-Kubernetes
- שיטות מומלצות נוספות
- דוגמאות למניפסטים של תפקידים נפוצים באשכול