הגדרת אימות OIDC באשכולות של חברי צי

במאמר הזה מוסבר איך מנהלי אשכולות או מפעילי אפליקציות יכולים להגדיר אשכולות שתומכים באימות באמצעות ספק OpenID Connect (OIDC) של צד שלישי.

מגבלות

אתם צריכים להשתמש בסוג אשכול שתומך ב-OIDC.

לפני שמתחילים

  1. התקינו את ה-CLI של Google Cloud.

  2. אם אתם משתמשים בספק זהויות חיצוני (IdP), קודם אתם צריכים להיכנס ל-CLI של gcloud באמצעות המאגר המאוחד לניהול זהויות.

  3. כדי לאתחל את ה-CLI של gcloud, הריצו את הפקודה הבאה:

    gcloud init
  4. אחרי שתאתחלו את ה-CLI של gcloud, עדכנו אותו והתקינו את הרכיבים הנדרשים:

    gcloud components update
    gcloud components install kubectl
  5. מוודאים שאדמין הפלטפורמה נתן לכם את כל המידע שאתם צריכים על הספק. מידע נוסף זמין במאמר בנושא שיתוף הפרטים של ספק הזהויות.
  6. כדי לבצע אימות באמצעות Google Cloud המסוף, צריך לרשום כל אשכול שרוצים להגדיר ב-Fleet של הפרויקט. מידע נוסף זמין במאמר סקירה כללית על יצירת צי.
  7. כדי להתחבר למישור הבקרה של אשכול AWS או Azure שנמצא מחוץ לרשת ה-VPC הנוכחית דרך יעד מבוצר (bastion host), צריך לוודא שיצרתם את יעד מבוצר (bastion host) והפעלתם מנהרת SSH ביציאה 8118. כשמריצים פקודות kubectl במסמך הזה, צריך להוסיף לפקודות את הקידומת HTTPS_PROXY=http://localhost:PORT, כאשר PORT הוא מספר היציאה שבה השתמשתם כשהפעלתם את מנהרת ה-SSH.
  8. באשכולות GKE ב- Google Cloud, צריך לרשום את האשכולות ב-Fleet.

הגדרת אשכולות

כדי להגדיר אימות לאשכול באמצעות OIDC, מוסיפים את הפרטים הבאים למשאב מותאם אישית של Kubernetes בשם ClientConfig:

  • מידע על ספק הזהויות, כמו מזהה לקוח וסוד.
  • מידע על אסימוני האינטרנט מסוג JSON‏ (JWT) שספק הזהויות משתמש בהם לאימות.
  • היקפים או פרמטרים נוספים שייחודיים לספק הזהויות.

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

האשכול משתמש בשדות במשאב המותאם אישית ClientConfig כדי ליצור אינטראקציה עם ספק הזהויות. לכל אשכול יש ClientConfig בשם default במרחב השמות kube-public. השדות הספציפיים שצריך לשנות תלויים בספק הזהויות.

כדי לערוך את default ClientConfig, מוודאים שאפשר להתחבר לאשכול kubectl, ואז מריצים את הפקודה הבאה:

kubectl --kubeconfig=KUBECONFIG_PATH edit ClientConfigs default -n kube-public

מחליפים את KUBECONFIG_PATH בנתיב לקובץ kubeconfig של האשכול, לדוגמה $HOME/.kube/config.

כלי לעריכת טקסט טוען את משאב ClientConfig של האשכול. מוסיפים את האובייקט spec.authentication.oidc כמו בדוגמה הבאה. אל תשנו נתוני ברירת מחדל שכבר נכתבו.

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - name: NAME
    oidc:
      certificateAuthorityData: CERTIFICATE_AUTHORITY_DATA
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      deployCloudConsoleProxy: PROXY_BOOLEAN
      extraParams: EXTRA_PARAMS
      groupsClaim: GROUPS_CLAIM
      groupPrefix: GROUP_PREFIX
      issuerURI: ISSUER_URI
      kubectlRedirectURI: KUBECTL_REDIRECT_URI
      scopes: SCOPES
      userClaim: USER_CLAIM
      userPrefix: USER_PREFIX
      enableAccessToken: ENABLE_ACCESS_TOKEN
    proxy: PROXY_URL
# Rest of the resource is managed by Google. DO NOT MODIFY.

לדוגמה, שימו לב לשדות הבאים של אסימון הזהות:

{
  'iss': 'https://server.example.com'
  'sub': 'u98523-4509823'
  'groupList': ['developers@example.corp', 'us-east1-cluster-admins@example.corp']
  # Multiple lines are omitted here
}

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

בדוגמה הקודמת של הטוקן, מעדכנים את השדות הבאים באובייקט spec.authentication.oidc של ClientConfig:

issuerURI: 'https://server.example.com'
userClaim: 'sub'
groupsClaim: 'groupList'
# Multiple lines are omitted here

אפשר להוסיף כמה הגדרות של ספקי זהויות ב-OIDC, ב-LDAP וב-SAML לאותו ClientConfig. האשכול מנסה לבצע אימות עם כל הגדרה לפי הסדר שבו הן מוגדרות, ומפסיק אחרי האימות הראשון שמצליח. בדוגמה הבאה של ClientConfig מוגדרים כמה ספקי זהויות בסדר מסוים:

apiVersion: authentication.gke.io/v2alpha1
kind: ClientConfig
metadata:
  name: default
  namespace: kube-public
spec:
  authentication:
  - aws:
      region: us-west-2
    name: AWS Login
  - ldap:
  # Multiple lines are omitted here.
  - saml:
  # Multiple lines are omitted here.
  - azureAD:
  # Multiple lines are omitted here.
  - oidc:
    name: Okta OIDC
  # Multiple lines are omitted here.
  - oidc:
    name: Google OIDC
  # Multiple lines are omitted here.

שדות ClientConfig OIDC

בטבלה הבאה מתוארים השדות של האובייקט ClientConfig oidc. השדות שצריך להוסיף תלויים בטוקנים של ספק הזהויות ובאופן שבו האדמין של הפלטפורמה הגדיר את הספק.

שדה חובה תיאור פורמט
name כן השם שרוצים להשתמש בו כדי לזהות את ההגדרה הזו, בדרך כלל שם ספק הזהויות. שם ההגדרה צריך להתחיל באות ואחריה עד 39 אותיות קטנות, מספרים או מקפים, והוא לא יכול להסתיים במקף. String
certificateAuthorityData לא אם מנהל הפלטפורמה סיפק מחרוזת אישור בקידוד PEM לספק הזהויות, צריך להזין אותה. כוללים את המחרוזת שמתקבלת ב-certificateAuthorityData כשורה אחת. String
clientID כן מזהה הלקוח מספק הזהויות. String
clientSecret לא סוד משותף בין אפליקציית הלקוח של OIDC לבין ספק OIDC. String
deployCloudConsoleProxy לא מציינת אם נפרס שרת proxy שמאפשר למסוף Google Cloud להתחבר לספק זהויות מקומי שלא נגיש באופן ציבורי דרך האינטרנט. כברירת מחדל, ההגדרה היא false. בוליאני
extraParams לא פרמטרים נוספים של key=value לשליחה לספק הזהויות, שמוגדרים כרשימה מופרדת בפסיקים – לדוגמה, `prompt=consent,access_type=offline`. רשימה מופרדת בפסיקים
groupsClaim לא הצהרת ה-JWT (שם השדה) שבה הספק משתמש כדי להחזיר את קבוצות האבטחה של החשבון. String
groupPrefix לא הקידומת שרוצים להוסיף לשמות של קבוצות אבטחה כדי למנוע התנגשויות עם שמות קיימים בכללי בקרת הגישה, אם יש לכם הגדרות לכמה ספקי זהויות (בדרך כלל שם הספק). String
issuerURI כן ה-URI שבו נשלחות בקשות הרשאה לספק הזהויות שלכם. ה-URI חייב להשתמש ב-HTTPS ולא להסתיים בלוכסן. מחרוזת של כתובת URL
kubectlRedirectURI כן כתובת ה-URL להפניה אוטומטית והיציאה שמשמשות את ה-CLI של gcloud ומצוינות על ידי האדמין של הפלטפורמה בזמן ההרשמה, בדרך כלל בפורמט http://localhost:PORT/callback. מחרוזת של כתובת URL
היקפי הרשאות כן היקפי הרשאות נוספים שיישלחו לספק OpenID. לדוגמה, ב-Microsoft Azure וב-Okta נדרש היקף ההרשאות offline_access. רשימה מופרדת בפסיקים
userClaim לא ההצהרה (שם השדה) ב-JWT שספק הזהויות משתמש בה כדי לזהות חשבון משתמש. אם לא תציינו ערך, ערך ברירת המחדל יהיה 'sub', שהוא טענת ה-User-ID שמשמשת ספקים רבים. אפשר לבחור הצהרות אחרות, כמו 'כתובת אימייל' או 'שם', בהתאם לספק OpenID. לכל הטענות מלבד 'אימייל' מתווסף בתחילת השורה קידומת של כתובת ה-URL של הגורם המנפיק, כדי למנוע התנגשויות בשמות. String
userPrefix לא התחילית שרוצים להוסיף לפני הצהרות המשתמש כדי למנוע התנגשויות עם שמות קיימים, אם לא רוצים להשתמש בתחילית שמוגדרת כברירת מחדל. String
enableAccessToken לא אם האפשרות הזו מופעלת, האשכול יכול להשתמש בנקודת הקצה userinfo של ספק הזהויות כדי לקבל מידע על קבוצות כשמשתמש מתחבר משורת הפקודה. כך תוכלו להשתמש בקבוצות אבטחה לצורך הרשאה אם יש לכם ספק (כמו Okta) שמספק הצהרות קבוצה מנקודת הקצה הזו. אם לא מגדירים את המדיניות, ברירת המחדל היא false. בוליאני
שרת proxy לא כתובת שרת ה-Proxy שמשמשת לחיבור לספק הזהויות, אם רלוונטי. יכול להיות שתצטרכו להגדיר את זה אם, לדוגמה, האשכול שלכם נמצא ברשת פרטית וצריך להתחבר לספק זהויות ציבורי. לדוגמה: http://user:password@10.10.10.10:8888. String

אחרי שמעדכנים את ClientConfig, שומרים את הקובץ כדי לעדכן את ClientConfig עבור האשכול. אם יש שגיאות תחביר, תופיע בקשה לתקן את השגיאות ולשמור את הקובץ.

הגדרות ספציפיות לספק

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

Microsoft Entra ID

זוהי הגדרת ברירת המחדל להגדרת אשכול לאימות באמצעות Microsoft Entra ID. ההגדרה הזו מאפשרת לאשכול לקבל מידע על משתמשים וחברות בקבוצות מ-Microsoft Entra ID, ומאפשרת להגדיר בקרת גישה מבוססת-תפקידים (RBAC) ב-Kubernetes על סמך קבוצות. עם זאת, השימוש בהגדרה הזו מגביל אתכם לאחזור של כ-200 קבוצות לכל משתמש.

אם אתם צריכים לאחזר יותר מ-200 קבוצות לכל משתמש, תוכלו לעיין בהוראות ל-Microsoft Entra ID (מתקדם).

# Multiple lines are omitted here.
spec:
  authentication:
  - name: oidc-entraid
    oidc:
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
      extraParams: prompt=consent, access_type=offline
      issuerURI: https://login.microsoftonline.com/TENANT_ID/v2.0
      kubectlRedirectURI: http://localhost:PORT/callback
      scopes: openid,email,offline_access
      userClaim: email
# Multiple lines are omitted here. Do not modify any pre-filled data.

מחליפים את מה שכתוב בשדות הבאים:

  • ‫CLIENT_ID: מזהה הלקוח מ-Microsoft Entra ID.
  • ‫CLIENT_SECRET: סוד משותף בין אפליקציית הלקוח של OIDC לבין ספק OIDC.
  • ‫TENANT_ID: סוג החשבון ב-Microsoft Entra ID שצריך לאמת. הערכים הנתמכים הם מזהה הדייר או שם הדייר של חשבונות ששייכים לדייר ספציפי. שם הדייר נקרא גם הדומיין הראשי. במאמר איך מוצאים את מזהה הדייר (tenant) ואת שם הדומיין הראשי ב-Microsoft Entra מוסבר איך מוצאים את הערכים האלה.
  • ‫PORT: מספר היציאה שנבחר לכתובת ה-URL להפניה אוטומטית שמשמשת את ה-CLI של gcloud, שצוין על ידי מנהל הפלטפורמה במהלך ההרשמה.

Microsoft Entra ID (מתקדם)

ההגדרה האופציונלית הזו ל-Microsoft Entra ID מאפשרת לאשכול לאחזר מידע על משתמשים וקבוצות ללא הגבלה על מספר הקבוצות לכל משתמש, באמצעות Microsoft Graph API.

מידע על פלטפורמות שתומכות בהגדרה הזו זמין במאמר הגדרה מתקדמת של Microsoft Entra ID.

אם אתם צריכים לאחזר פחות מ-200 קבוצות לכל משתמש, מומלץ להשתמש בהגדרת ברירת המחדל באמצעות עוגן oidc ב-ClientConfig. מידע נוסף מופיע בהוראות של Microsoft Entra ID.

חובה למלא את כל השדות בדוגמה הבאה להגדרה.

# Multiple lines are omitted here.
spec:
  authentication:
  - name: NAME
    proxy: PROXY_URL
    azureAD:
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      tenant: TENANT_ID
      kubectlRedirectURI: http://localhost:PORT/callback
      groupFormat: GROUP_FORMAT
      userClaim: USER_CLAIM
# Multiple lines are omitted here. Do not modify any pre-filled data.

מחליפים את מה שכתוב בשדות הבאים:

  • ‫NAME: השם שרוצים להשתמש בו כדי לזהות את ההגדרה הזו, בדרך כלל שם ספק הזהויות. שם ההגדרה צריך להתחיל באות ואחריה עד 39 אותיות קטנות, מספרים או מקפים, והוא לא יכול להסתיים במקף.
  • ‫PROXY_URL: כתובת שרת ה-proxy שמשמשת להתחברות לספק הזהויות, אם רלוונטי. יכול להיות שתצטרכו להגדיר את זה אם, לדוגמה, האשכול שלכם נמצא ברשת פרטית וצריך להתחבר לספק זהויות ציבורי. לדוגמה: http://user:password@10.10.10.10:8888.
  • ‫CLIENT_ID: מזהה הלקוח מ-Microsoft Entra ID.
  • ‫CLIENT_SECRET: סוד משותף בין אפליקציית הלקוח של OIDC לבין ספק ה-OIDC.
  • ‫TENANT: סוג החשבון ב-Microsoft Entra שרוצים לאמת. הערכים הנתמכים הם מזהה הדייר או שם הדייר של חשבונות ששייכים לדייר ספציפי. שם הדייר נקרא גם הדומיין הראשי. במאמר איך מוצאים את מזהה הדייר (tenant) ואת שם הדומיין הראשי ב-Microsoft Entra מוסבר איך מוצאים את הערכים האלה.
  • ‫PORT: מספר היציאה שנבחר לכתובת ה-URL להפניה אוטומטית שמשמשת את ה-CLI של gcloud, שצוין על ידי מנהל הפלטפורמה במהלך ההרשמה.
  • ‫GROUP_FORMAT: הפורמט שבו רוצים לאחזר את פרטי הקבוצה. השדה הזה יכול לקבל ערכים שמתאימים ל-ID או ל-NAME של קבוצות המשתמשים. הערה: ההגדרה הזו זמינה רק לאשכולות בפריסות של Google Distributed Cloud לשרת פיזי.
  • ‫USER_CLAIM (אופציונלי): הצהרת ה-JWT (שם השדה) שהספק משתמש בה כדי לזהות חשבון. אם לא מציינים כאן ערך, האשכול משתמש בערך בסדר הבא כדי לאחזר את פרטי המשתמש: 'email',‏ 'preferred_username' או 'sub'. אפשר להשתמש במאפיין הזה החל מגרסה 1.28.

Okta

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

# Multiple lines are omitted here.
spec:
  authentication:
  - name: okta
    oidc:
      clientID: CLIENT_ID
      clientSecret: CLIENT_SECRET
      cloudConsoleRedirectURI: https://console.cloud.google.com/kubernetes/oidc
      enableAccessToken: true
      extraParams: prompt=consent
      groupsClaim: groups
      issuerURI: https://OKTA_ISSUER_URI/
      kubectlRedirectURI: http://localhost:PORT/callback
      scopes: offline_access,email,profile,groups
      userClaim: email
# Multiple lines are omitted here. Do not modify any pre-filled data.

מגבלות על גישה לקבוצות

משתמשי Okta יכולים לאחזר מידע על קבוצות של משתמשים ששמות הקבוצות שלהם, אם הם מחוברים, הם באורך של פחות מ-170, 000 תווים. זה תואם לחברות בכ-650 קבוצות, בהתאם לאורך המקסימלי של קבוצה ב-Okta. אם המשתמש חבר ביותר מדי קבוצות, קריאת האימות נכשלת.

מה השלב הבא?

אחרי שההגדרה מוחלת, ממשיכים אל הגדרת גישת משתמשים לאשכולות.