הגדרת חשבונות שירות של צמתים ב-GKE

הצמתים שלכם ב-Google Kubernetes Engine‏ (GKE) משתמשים בחשבונות שירות של ניהול זהויות והרשאות גישה (IAM) למשימות כמו רישום ביומן ושליפה של תמונות קונטיינר לעומסי עבודה. במאמר הזה אנחנו מסבירים לאדמינים של פלטפורמות ולמהנדסי אבטחה איך להעניק תפקידים לחשבונות שירות לתרחישי שימוש ספציפיים, ואיך ליצור חשבונות שירות בהתאמה אישית במקום להשתמש בחשבון שירות שמוגדר כברירת מחדל. מידע נוסף מופיע במאמר בנושא חשבונות שירות של צמתים.

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

לפני שמתחילים, חשוב לוודא שביצעתם את הפעולות הבאות:

  • מפעילים את ממשק ה-API של Google Kubernetes Engine.
  • הפעלת Google Kubernetes Engine API
  • אם רוצים להשתמש ב-CLI של Google Cloud למשימה הזו, צריך להתקין ואז להפעיל את ה-CLI של gcloud. אם התקנתם בעבר את ה-CLI של gcloud, מריצים את הפקודה gcloud components update כדי לקבל את הגרסה העדכנית. יכול להיות שגרסאות קודמות של ה-CLI של gcloud לא יתמכו בהרצת הפקודות שמופיעות במסמך הזה.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לניהול חשבונות שירות ותפקידים ב-IAM, צריך לבקש מהאדמין להקצות לכם את תפקידי ה-IAM הבאים:

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

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

הקצאת התפקיד המינימלי הנדרש ל-GKE

‫GKE משתמש בחשבונות שירות של IAM שמצורפים לצמתים כדי להריץ משימות מערכת כמו רישום ביומן ומעקב. לפחות, חשבונות השירות של הצמתים צריכים לקבל את התפקיד Kubernetes Engine Default Node Service Account ‏(roles/container.defaultNodeServiceAccount) בפרויקט. כברירת מחדל, GKE משתמש בחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, שנוצר באופן אוטומטי בפרויקט, כחשבון השירות של הצומת.

אם בארגון שלכם נאכף iam.automaticIamGrantsForDefaultServiceAccounts אילוץ מדיניות הארגון, יכול להיות שלחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine בפרויקט שלכם לא יוקצו באופן אוטומטי ההרשאות הנדרשות ל-GKE.

בקטעים הבאים מוסבר איך להעניק את התפקיד roles/container.defaultNodeServiceAccount לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine או לחשבון שירות חדש בהתאמה אישית שאתם יוצרים.

הגדרת חשבון השירות של Compute Engine שמוגדר כברירת מחדל

כדי להעניק את התפקיד roles/container.defaultNodeServiceAccount לחשבון השירות שמוגדר כברירת המחדל של Compute Engine, מבצעים את השלבים הבאים:

המסוף

  1. נכנסים לדף Welcome:

    מעבר לדף Welcome

  2. בשדה מספר הפרויקט, לוחצים על העתקה ללוח.
  3. נכנסים לדף IAM:

    כניסה לדף IAM

  4. לוחצים על Grant access.
  5. בשדה New principals, מציינים את הערך הבא:
    PROJECT_NUMBER-compute@developer.gserviceaccount.com
    מחליפים את PROJECT_NUMBER במספר הפרויקט שהעתקתם.
  6. בתפריט Select a role (בחירת תפקיד), בוחרים בתפקיד Kubernetes Engine Default Node Service Account (חשבון השירות שמשמש כברירת מחדל לצומת ב-Kubernetes Engine).
  7. לוחצים על Save.

gcloud

  1. איך מוצאים את Google Cloud מספר הפרויקט:
    gcloud projects describe PROJECT_ID \
        --format="value(projectNumber)"

    מחליפים את PROJECT_ID במזהה הפרויקט.

    הפלט אמור להיראות כך:

    12345678901
    
  2. מקצים לחשבון השירות של Compute Engine שמוגדר כברירת מחדל את התפקיד roles/container.defaultNodeServiceAccount:
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com" \
        --role="roles/container.defaultNodeServiceAccount"

    מחליפים את PROJECT_NUMBER במספר הפרויקט מהשלב הקודם.

הגדרת חשבון שירות מותאם אישית של צומת

כדי ליצור חשבון שירות בהתאמה אישית ולהעניק לו את התפקיד הנדרש ל-GKE, צריך לבצע את הפעולות הבאות:

המסוף

  1. עוברים לדף Service accounts:

    כניסה לדף Service accounts

  2. לוחצים על יצירת חשבון שירות.
  3. מזינים שם לחשבון השירות. בשדה Service account ID נוצר אוטומטית מזהה ייחודי לחשבון השירות על סמך השם.
  4. לוחצים על Create and continue.
  5. בתפריט Select a role בוחרים בתפקיד Kubernetes Engine Default Node Service Account.
  6. לוחצים על סיום.

gcloud

  1. יוצרים את חשבון השירות:
    gcloud iam service-accounts create SA_NAME

    מחליפים את הערך SA_NAME בשם ייחודי שמזהה את חשבון השירות.

  2. מקצים לחשבון השירות את התפקיד חשבון השירות של צומת ברירת המחדל ב-Kubernetes Engine (roles/container.defaultNodeServiceAccount):
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:SA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
        --role=roles/container.defaultNodeServiceAccount

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

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • SA_NAME: השם של חשבון השירות שיצרתם.

Terraform

יוצרים חשבון שירות ב-IAM ומקצים לו את התפקיד roles/container.defaultNodeServiceAccount בפרויקט:

resource "google_service_account" "default" {
  account_id   = "gke-node-service-account"
  display_name = "GKE node service account"
}

data "google_project" "project" {
}

resource "google_project_iam_member" "default" {
  project = data.google_project.project.project_id
  role    = "roles/container.defaultNodeServiceAccount"
  member  = "serviceAccount:${google_service_account.default.email}"
}

Config Connector

הערה: כדי לבצע את השלב הזה, צריך להשתמש ב-Config Connector. פועלים לפי הוראות ההתקנה כדי להתקין את Config Connector באשכול.

  1. כדי ליצור את חשבון השירות, מורידים את המשאב הבא בתור service-account.yaml:
    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMServiceAccount
    metadata:
      name: [SA_NAME]
    spec:
      displayName: [DISPLAY_NAME]

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

    • [SA_NAME]: השם של חשבון השירות החדש.
    • [DISPLAY_NAME]: שם מוצג לחשבון השירות.
  2. יוצרים את חשבון השירות:
    kubectl apply -f service-account.yaml
  3. מקצים את התפקיד roles/logging.logWriter לחשבון השירות:
    1. הורדת המשאב הבא כ-policy-logging.yaml.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-logging
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/logging.logWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: השם של חשבון השירות.
      • [PROJECT_ID]: מזהה הפרויקט ב- Google Cloud .
    2. מקצים את התפקיד לחשבון השירות:
      kubectl apply -f policy-logging.yaml
  4. מקצים את התפקיד roles/monitoring.metricWriter לחשבון השירות:
    1. הורדת המשאב הבא כ-policy-metrics-writer.yaml. מחליפים את [SA_NAME] ואת [PROJECT_ID] בפרטים שלכם.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-metrics-writer
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/monitoring.metricWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: השם של חשבון השירות.
      • [PROJECT_ID]: מזהה הפרויקט ב- Google Cloud .
    2. מקצים את התפקיד לחשבון השירות:
      kubectl apply -f policy-metrics-writer.yaml
  5. מקצים את התפקיד roles/monitoring.viewer לחשבון השירות:
    1. הורדת המשאב הבא כ-policy-monitoring.yaml.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-monitoring
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/monitoring.viewer
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: השם של חשבון השירות.
      • [PROJECT_ID]: מזהה הפרויקט ב- Google Cloud .
    2. מקצים את התפקיד לחשבון השירות:
      kubectl apply -f policy-monitoring.yaml
  6. מקצים את התפקיד roles/autoscaling.metricsWriter לחשבון השירות:
    1. הורדת המשאב הבא כ-policy-autoscaling-metrics-writer.yaml.
      apiVersion: iam.cnrm.cloud.google.com/v1beta1
      kind: IAMPolicyMember
      metadata:
        name: policy-autoscaling-metrics-writer
      spec:
        member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
        role: roles/autoscaling.metricsWriter
        resourceRef:
          kind: Project
          name: [PROJECT_ID]

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

      • [SA_NAME]: השם של חשבון השירות.
      • [PROJECT_ID]: מזהה הפרויקט ב- Google Cloud .
    2. מקצים את התפקיד לחשבון השירות:
      kubectl apply -f policy-autoscaling-metrics-writer.yaml

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

מתן הרשאה לגורמים ראשיים לצרף חשבונות שירות בהתאמה אישית

אפשר לצרף חשבון שירות בהתאמה אישית כשיוצרים אשכול או מאגר צמתים. כדי לאפשר לחשבון משתמש (כמו אדמין פלטפורמה) להשתמש בחשבון שירות מותאם אישית כדי ליצור משאבי GKE, צריך להעניק לחשבון המשתמש הזה את התפקיד משתמש בחשבון שירות (roles/iam.serviceAccountUser) בחשבון השירות המותאם אישית. כדי להקצות את התפקיד הזה, בוחרים באחת מהאפשרויות הבאות:

המסוף

  1. נכנסים לדף Service accounts במסוף Google Cloud :

    כניסה לדף Service accounts

    בבורר המשאבים, בוחרים את הפרויקט שמכיל את חשבון השירות המותאם אישית.

  2. מסמנים את התיבה של חשבון השירות המותאם אישית שיצרתם לשימוש עם צמתי GKE.

  3. לוחצים על ניהול הגישה. תיפתח החלונית ניהול הגישה.

  4. לוחצים על Add principal. נפתחת החלונית הענקת גישה.

  5. בשדה New principals, מציינים את החשבון הראשי, כמו קבוצת אדמינים.

  6. בתפריט הנפתח Select a role בוחרים בתפקיד Service Account User.

  7. לוחצים על Save. החלונית הענקת גישה נסגרת.

  8. סוגרים את החלונית ניהול הגישה.

gcloud

הקצאת התפקיד roles/iam.serviceAccountUser:

gcloud iam service-accounts add-iam-policy-binding \
    SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
    --member=PRINCIPAL \
    --role=roles/iam.serviceAccountUser

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

  • SA_NAME: השם של חשבון השירות המותאם אישית.
  • SERVICE_ACCOUNT_PROJECT_ID: מזהה הפרויקט שמכיל את חשבון השירות המותאם אישית.
  • PRINCIPAL: המזהה של החשבון הראשי, למשל user:baklavainthebalkans@example.com.

Config Connector

הערה: כדי לבצע את השלב הזה, צריך להשתמש ב-Config Connector. פועלים לפי הוראות ההתקנה כדי להתקין את Config Connector באשכול.

מקצים את התפקיד iam.serviceAccountUser לחשבון השירות. הורדת המשאב הבא כקובץ policy-service-account-user.yaml. מחליפים את [SA_NAME] ואת [PROJECT_ID] בפרטים שלכם.

apiVersion: iam.cnrm.cloud.google.com/v1beta1
kind: IAMPolicyMember
metadata:
  name: policy-service-account-user
spec:
  member: serviceAccount:[SA_NAME]@[PROJECT_ID].iam.gserviceaccount.com
  role: roles/iam.serviceAccountUser
  resourceRef:
    kind: Project
    name: [PROJECT_ID]
kubectl apply -f policy-service-account-user.yaml

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

הגדרת השימוש בחשבון שירות בפרויקטים שונים

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

כדי להעניק את התפקידים הנדרשים בחשבונות שירות של צמתים שלא נמצאים בפרויקט של האשכול:

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

    המסוף

    1. נכנסים לדף Service accounts במסוף Google Cloud .

      כניסה לדף Service accounts

    2. מסמנים את התיבה של חשבון השירות המותאם אישית שיצרתם לשימוש עם צמתי GKE.

    3. לוחצים על ניהול הגישה. תיפתח החלונית ניהול הגישה.

    4. מקצים את התפקיד 'יצירת אסימונים בחשבון שירות' לסוכן השירות של Compute Engine בפרויקט של האשכול:

      1. בחלונית Manage Access, לוחצים על Add principal. נפתחת החלונית הענקת גישה.
      2. בשדה New principals, מציינים את כתובת האימייל של סוכן השירות של Compute Engine בפרויקט של האשכול:

        service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com
        

        מחליפים את CLUSTER_PROJECT_NUMBER במספר הפרויקט של פרויקט האשכול.

      3. בתפריט Select a role בוחרים בתפקיד Service Account Token Creator.

      4. לוחצים על Save. החלונית הענקת גישה נסגרת.

    5. מקצים את התפקיד Service Account User לסוכן השירות של GKE בפרויקט של האשכול:

      1. בחלונית Manage Access, לוחצים על Add principal. נפתחת החלונית הענקת גישה.
      2. בשדה New principals, מציינים את כתובת האימייל של סוכן השירות של GKE בפרויקט של האשכול:

        service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com
        
      3. בתפריט Select a role בוחרים את התפקיד Service Account User.

      4. לוחצים על Save. החלונית הענקת גישה נסגרת.

    6. סוגרים את החלונית ניהול הגישה.

    gcloud

    1. מקבלים את מספר הפרויקט של פרויקט האשכול:

      gcloud projects describe CLUSTER_PROJECT_ID \
          --format='value(projectNumber)'
      

      מחליפים את CLUSTER_PROJECT_ID במזהה הפרויקט של פרויקט האשכול.

      הפלט אמור להיראות כך: 123456789.

    2. מקצים את התפקיד roles/iam.serviceAccountTokenCreator בחשבון השירות המותאם אישית לסוכן השירות של Compute Engine בפרויקט האשכול:

      gcloud iam service-accounts add-iam-policy-binding \
          SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --member=service-CLUSTER_PROJECT_NUMBER@compute-system.iam.gserviceaccount.com \
          --role=roles/iam.serviceAccountTokenCreator
      

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

      • SA_NAME: השם של חשבון השירות המותאם אישית.
      • SERVICE_ACCOUNT_PROJECT_ID: מזהה הפרויקט שמכיל את חשבון השירות המותאם אישית.
      • CLUSTER_PROJECT_NUMBER: מספר הפרויקט של פרויקט האשכול.
    3. מקצים את התפקיד roles/iam.serviceAccountUser בחשבון השירות המותאם אישית לסוכן השירות של GKE בפרויקט של האשכול:

      gcloud iam service-accounts add-iam-policy-binding \
          SA_NAME@SERVICE_ACCOUNT_PROJECT_ID.iam.gserviceaccount.com \
          --member=service-CLUSTER_PROJECT_NUMBER@container-engine-robot.iam.gserviceaccount.com \
          --role=roles/iam.serviceAccountUser
      

התרת שליפת תמונות ממאגרים פרטיים

אם יש לכם תמונות במאגרי Artifact Registry פרטיים, אתם צריכים לתת לחשבון השירות של הצומת גישה למאגרים האלה. גם אם משתמשים בחשבון השירות שמוגדר כברירת מחדל של Compute Engine, יכול להיות שיהיה צורך לתת לחשבון השירות גישה למאגר אם המאגר נמצא בפרויקט אחר.

Google Cloud

כדי למשוך תמונות פרטיות מ-Artifact Registry, צריך להעניק את התפקיד 'קורא Artifact Registry' (roles/artifactregistry.reader) במאגר לחשבון השירות של הצומת.

המסוף

  1. נכנסים לדף Repositories במסוף Google Cloud .

    כניסה לדף Repositories

  2. מסמנים את התיבה של המאגר.

  3. לוחצים על הצגת חלונית המידע. חלונית פרטי המאגר תיפתח.

  4. בכרטיסייה Permissions, לוחצים על Add principal. נפתחת החלונית הענקת גישה.

  5. בשדה New principals, מציינים את כתובת האימייל של חשבון השירות של הצומת.

  6. לוחצים על Select a role (בחירת תפקיד) כדי לפתוח את תיבת הדו-שיח לבחירת תפקיד.

  7. בוחרים בתפקיד Artifact Registry Reader.

  8. לוחצים על Save.

gcloud

הקצאת התפקיד roles/artifactregistry.reader במאגר:

gcloud artifacts repositories add-iam-policy-binding REPOSITORY_NAME \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL \
    --project=REPOSITORY_PROJECT_ID \
    --role=roles/artifactregistry.reader

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

Config Connector

הערה: כדי לבצע את השלב הזה, צריך להשתמש ב-Config Connector. פועלים לפי הוראות ההתקנה כדי להתקין את Config Connector באשכול.

  1. שומרים את קובץ המניפסט הבא בשם policy-artifact-registry-reader.yaml:

    apiVersion: iam.cnrm.cloud.google.com/v1beta1
    kind: IAMPolicyMember
    metadata:
      name: policy-artifact-registry-reader
    spec:
      member: serviceAccount:"SA_NAME"@"PROJECT_ID".iam.gserviceaccount.com
      role: roles/artifactregistry.reader
      resourceRef:
        apiVersion: artifactregistry.cnrm.cloud.google.com/v1beta1
        kind: ArtifactRegistryRepository
        name: "REPOSITORY_NAME"

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

    • SA_NAME: השם של חשבון השירות ב-IAM.
    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud .
    • REPOSITORY_NAME: השם של מאגר Artifact Registry.
  2. מקצים לחשבון השירות את התפקיד Artifact Registry Reader:

    kubectl apply -f policy-artifact-registry-reader.yaml
    

המאמרים הבאים