פתרון בעיות שקשורות למדיניות הארגון בחשבונות שירות

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

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

כדי לקבל את ההרשאות שדרושות לפתרון בעיות שקשורות למדיניות הארגון, צריך לבקש מהאדמין להקצות לכם את תפקיד ה-IAM‏ Organization policy administrator (אדמין של מדיניות הארגון) ‏(roles/orgpolicy.policyAdmin) בארגון. כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

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

פתרון בעיות שקשורות ליצירת מפתחות לחשבונות שירות מושבתים

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

שגיאה ביצירת מפתח

אם מנסים ליצור מפתח לחשבון שירות, אבל הפעולה נחסמת על ידי האילוץ iam.disableServiceAccountKeyCreation, מוצגת הודעת השגיאה הבאה:

המסוף

במסוף Cloud de Confiance , תופיע תיבת דו-שיח עם הכותרת יצירת מפתח לחשבון שירות מושבתת. בתיבת הדו-שיח מצוין שההגבלה iam.disableServiceAccountKeyCreation נאכפת בארגון שלכם.

gcloud

ERROR: (gcloud.iam.service-accounts.keys.create) FAILED_PRECONDITION: Key
creation is not allowed on this service account.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
  violations:
  - description: Key creation is not allowed on this service account.
    subject: projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID@PROJECT_ID.s3ns.iam.gserviceaccount.com?configvalue=SERVICE_ACCOUNT_ID%40PROJECT_ID.s3ns.iam.gserviceaccount.com
    type: constraints/iam.disableServiceAccountKeyCreation

REST

{
  "error": {
    "code": 400,
    "message": "Key creation is not allowed on this service account.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/iam.disableServiceAccountKeyCreation",
            "subject": "projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_ID@PROJECT_ID.s3ns.iam.gserviceaccount.com?configvalue=SERVICE_ACCOUNT_ID%40PROJECT_ID.s3ns.iam.gserviceaccount.com",
            "description": "Key creation is not allowed on this service account."
          }
        ]
      }
    ]
  }
}

פתרון מומלץ לשגיאה ביצירת מפתח לחשבון שירות

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

  1. בודקים אם נדרש מפתח של חשבון שירות.

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

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

  2. אם בתרחיש לדוגמה שלכם יש צורך במפתח של חשבון שירות, צריך להשבית את האילוץ iam.disableServiceAccountKeyCreation בפרויקט.

כדי להשבית את אילוץ מדיניות הארגון, משביתים את האכיפה של האילוץ או מוציאים את הפרויקט מהאכיפה:

  • כדי להשבית את האכיפה של ההגבלה בכל הארגון: פועלים לפי השלבים הבאים:

    1. חשוב לוודא שיש לכם את התפקיד 'אדמין של מדיניות הארגון' (roles/orgpolicy.policyAdmin) ברמת הארגון. אפשר לתת את התפקיד הזה רק בארגונים, והוא לא מופיע ברשימת התפקידים בפרויקטים.

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

    2. במסוף Cloud de Confiance , נכנסים לדף מדיניות הארגון.

      מעבר למדיניות הארגון

    3. ברשימת הפרויקטים, בוחרים את הארגון שרוצים להשבית בו את האילוץ iam.disableServiceAccountKeyCreation.

    4. בשדה מסנן, מזינים iam.disableServiceAccountKeyCreation. לאחר מכן, ברשימת המדיניות, לוחצים על השבתה של יצירת מפתח של חשבון שירות.

    5. לוחצים על ניהול המדיניות.

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

    7. בקטע Enforcement, משביתים את האכיפה של האילוץ הזה של מדיניות הארגון.

    8. לוחצים על הגדרת מדיניות.

  • כדי להחריג את הפרויקט שלכם מהאכיפה:

    1. חשוב לוודא שהוקצו לכם התפקידים 'Tag Administrator' (roles/resourcemanager.tagAdmin) ו'אדמין מדיניות ארגונית' (roles/orgpolicy.policyAdmin) ברמת הארגון. במאמר ניהול הגישה לפרויקטים, לתיקיות ולארגונים מוסבר איך מקצים תפקידים ברמת הארגון.
    2. ברמת הארגון, יוצרים מפתח תג וערך תג שישמשו להגדרה אם משאב צריך להיות פטור ממדיניות הארגון. מומלץ ליצור תג עם המפתח disableServiceAccountKeyCreation והערכים enforced ו-not_enforced.

      במאמר איך יוצרים ומגדירים תגים חדשים מוסבר איך ליצור מפתחות וערכים של תגים.

    3. מצרפים את התג disableServiceAccountKeyCreation לארגון ומגדירים את הערך שלו ל-enforced. כל המשאבים בארגון יורשים את ערך התג הזה, אלא אם הוא נדרס על ידי ערך תג אחר.

      במאמר צירוף תגים למשאבים מוסבר איך לצרף תגים למשאבים.

    4. לכל חשבון שירות שרוצים להחריג ממדיניות הארגון, מצרפים את התג disableServiceAccountKeyCreation ומגדירים את הערך שלו ל-not_enforced. הגדרת ערך תג לחשבון שירות בדרך הזו מבטלת את ערך התג שהתקבל בירושה מהארגון.
    5. יוצרים או מעדכנים את מדיניות הארגון שמונעת יצירה של מפתחות של חשבונות שירות, כך שהיא לא תאכוף את האילוץ על משאבים שפטורים ממנו. המדיניות הזו צריכה לכלול את הכללים הבאים:

      • מגדירים את האילוץ iam.disableServiceAccountKeyCreation כך שלא ייאכף על משאבים עם התג disableServiceAccountKeyCreation: not_enforced. התנאי בכלל הזה צריך להיראות כך:

        "resource.matchTag('ORGANIZATION_ID/disableServiceAccountKeyCreation', 'not_enforced')"
        
      • מגדירים את האילוץ iam.disableServiceAccountKeyCreation כך שהוא ייאכף על כל שאר המשאבים.

פתרון בעיות שקשורות להשבתת יצירת חשבונות שירות

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

שגיאה ביצירת חשבון שירות

אם מנסים ליצור חשבון שירות, אבל הפעולה נחסמת על ידי האילוץ iam.disableServiceAccountCreation, מוצגת הודעת השגיאה הבאה:

המסוף

במסוף Cloud de Confiance , מופיעה תיבת דו-שיח עם הכותרת Service account creation failed. בתיבת הדו-שיח מופיעה ההודעה הפעולה שניסית לבצע נכשלה. כדאי לנסות שוב.

gcloud

ERROR: (gcloud.iam.service-accounts.create) FAILED_PRECONDITION: Service account
creation is not allowed on this project.
- '@type': type.googleapis.com/google.rpc.PreconditionFailure
  violations:
  - description: Service account creation is not allowed on this project.
    subject: projects/PROJECT_ID/serviceAccounts/?configvalue=
    type: constraints/iam.disableServiceAccountCreation

REST

{
  "error": {
    "code": 400,
    "message": "Service account creation is not allowed on this project.",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.PreconditionFailure",
        "violations": [
          {
            "type": "constraints/iam.disableServiceAccountCreation",
            "subject": "projects/PROJECT_ID/serviceAccounts/?configvalue=",
            "description": "Service account creation is not allowed on this project."
          }
        ]
      }
    ]
  }
}

פתרון מומלץ לשגיאה ביצירת חשבון שירות

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

  1. בודקים אם צריך חשבון שירות.

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

  2. אם בתרחיש לדוגמה שלכם יש צורך בחשבון שירות, צריך להשבית את האילוץ iam.disableServiceAccountCreation בפרויקט.

כדי להשבית את אילוץ מדיניות הארגון, משביתים את האכיפה של האילוץ או מוציאים את הפרויקט מהאכיפה:

  • כדי להשבית את האכיפה של ההגבלה בכל הארגון: פועלים לפי השלבים הבאים:

    1. חשוב לוודא שיש לכם את התפקיד 'אדמין של מדיניות הארגון' (roles/orgpolicy.policyAdmin) ברמת הארגון. אפשר לתת את התפקיד הזה רק בארגונים, והוא לא מופיע ברשימת התפקידים בפרויקטים.

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

    2. במסוף Cloud de Confiance , נכנסים לדף מדיניות הארגון.

      מעבר למדיניות הארגון

    3. ברשימת הפרויקטים, בוחרים את הארגון שרוצים להשבית בו את האילוץ iam.disableServiceAccountCreation.

    4. בשדה מסנן, מזינים iam.disableServiceAccountCreation. לאחר מכן, ברשימת המדיניות, לוחצים על Disable service account creation (השבתת יצירת חשבונות שירות).

    5. לוחצים על ניהול המדיניות.

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

    7. בקטע Enforcement, משביתים את האכיפה של האילוץ הזה של מדיניות הארגון.

    8. לוחצים על הגדרת מדיניות.

  • כדי להחריג את הפרויקט שלכם מהאכיפה:

    1. חשוב לוודא שהוקצו לכם התפקידים 'Tag Administrator' (roles/resourcemanager.tagAdmin) ו'אדמין מדיניות ארגונית' (roles/orgpolicy.policyAdmin) ברמת הארגון. במאמר ניהול הגישה לפרויקטים, לתיקיות ולארגונים מוסבר איך מקצים תפקידים ברמת הארגון.
    2. ברמת הארגון, יוצרים מפתח תג וערך תג שישמשו להגדרה אם משאב צריך להיות פטור ממדיניות הארגון. מומלץ ליצור תג עם המפתח disableServiceAccountCreation והערכים enforced ו-not_enforced.

      במאמר איך יוצרים ומגדירים תגים חדשים מוסבר איך ליצור מפתחות וערכים של תגים.

    3. מצרפים את התג disableServiceAccountCreation לארגון ומגדירים את הערך שלו ל-enforced. כל המשאבים בארגון יורשים את ערך התג הזה, אלא אם הוא נדרס על ידי ערך תג אחר.

      במאמר צירוף תגים למשאבים מוסבר איך לצרף תגים למשאבים.

    4. לכל פרויקט או תיקייה שרוצים להחריג ממדיניות הארגון, מצרפים את התג disableServiceAccountCreation ומגדירים את הערך שלו ל-not_enforced. הגדרה של ערך תג לפרויקט או לתיקייה בדרך הזו מבטלת את ערך התג שהתקבל בירושה מהארגון.
    5. יוצרים או מעדכנים את מדיניות הארגון שמונעת יצירה של חשבונות שירות, כך שהיא לא תאכוף את האילוץ על משאבים שפטורים ממנו. המדיניות הזו צריכה לכלול את הכללים הבאים:

      • מגדירים את האילוץ iam.disableServiceAccountCreation כך שלא ייאכף על משאבים עם התג disableServiceAccountCreation: not_enforced. התנאי בכלל הזה צריך להיראות כך:

        "resource.matchTag('ORGANIZATION_ID/disableServiceAccountCreation', 'not_enforced')"
        
      • מגדירים את האילוץ iam.disableServiceAccountCreation כך שהוא ייאכף על כל שאר המשאבים.

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

חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine נוצר באופן אוטומטי בפרויקט כשמשתמשים בשירותים מסוימים Cloud de Confiance . מזהה חשבון השירות הוא PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com.

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

  • iam.automaticIamGrantsForDefaultServiceAccounts: אילוץ מוגדר מראש שמונע מחשבונות שירות שמוגדרים כברירת מחדל לקבל תפקידים באופן אוטומטי. האילוץ הזה לא מונע מכם להעניק בהמשך את התפקיד 'עריכה' לחשבונות שירות שמוגדרים כברירת מחדל.
  • constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts: אילוץ מנוהל שמונע את ההקצאה של התפקידים 'עריכה' ו'בעלים' (roles/owner) לחשבונות שירות שמוגדרים כברירת מחדל.

שגיאה בהקצאת תפקידים בסיסיים לחשבונות שירות

אם המגבלה iam.automaticIamGrantsForDefaultServiceAccounts או המגבלה constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts נאכפות בפרויקט שלכם, יכול להיות שיהיו עומסי עבודה בפרויקט שמשתמשים בחשבונות השירות שמוגדרים כברירת מחדל, ויופיעו שגיאות שקשורות להרשאות לא מספיקות. במאמר פתרון מומלץ למתן תפקידים לחשבונות שירות שמוגדרים כברירת מחדל מוסבר אילו תפקידים כדאי לתת לחשבון שירות שמוגדר כברירת מחדל.

המגבלה iam.automaticIamGrantsForDefaultServiceAccounts לא גורמת לשגיאות כשלעצמה. עם זאת, בגלל המגבלה הזו, יכול להיות שעומס עבודה שמשתמש בחשבון השירות שמוגדר כברירת מחדל לא יקבל את ההרשאות שהוא צריך.

בנוסף, אם האילוץ constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts נאכף בפרויקט שלכם, תופיע הודעת שגיאה כמו זו שבהמשך אם תנסו להעניק את התפקיד Owner או Editor לחשבון שירות שמוגדר כברירת מחדל:

המסוף

במסוף Cloud de Confiance , מופיעה תיבת דו-שיח עם הכותרת עדכון מדיניות ה-IAM נכשל. בתיבת הדו-שיח מופיעה ההודעה 'אי אפשר לבצע את השינויים האלה במדיניות ב-IAM בגלל מגבלות שהגדיר האדמין שאחראי על מדיניות הארגון', ואז מפורטות המגבלות שמונעות את העדכון. המגבלות שמופיעות כוללות את המגבלה customConstraints/custom.cantGrantProjectIamAdmin.

gcloud

ERROR: (gcloud.projects.set-iam-policy) FAILED_PRECONDITION: Operation denied by
org policy on resource 'RESOURCE_ID':
["constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts":
"When this constraint is enforced, it prevents anyone from granting the Editor
role (roles/editor) or the Owner role (roles/owner) to the Compute Engine and
App Engine default service accounts, at any time. To learn more about default
service accounts, see
https://cloud.google.com/iam/help/service-accounts/default. Enforcing this
constraint prevents the default service accounts from automatically being
granted the Editor role (roles/editor). This might cause permission issues for
services that use these service accounts. To learn which roles to grant to each
service account, see
https://cloud.google.com/iam/help/service-accounts/troubleshoot-roles-default."].

REST

{
  "error": {
    "code": 400,
    "message": "Operation denied by org policy on resource
    'RESOURCE_ID':
    [\"constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts\":
    \"When this constraint is enforced, it prevents anyone from granting the
    Editor role (roles/editor) or the Owner role (roles/owner) to the Compute
    Engine and App Engine default service accounts, at any time. To learn more
    about default service accounts, see
    https://cloud.google.com/iam/help/service-accounts/default.\n Enforcing this
    constraint prevents the default service accounts from automatically being
    granted the Editor role (roles/editor). This might cause permission issues
    for services that use these service accounts. To learn which roles to grant
    to each service account, see
    https://cloud.google.com/iam/help/service-accounts/troubleshoot-roles-default.\"].",
    "status": "FAILED_PRECONDITION",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.ErrorInfo",
        "reason": "CUSTOM_ORG_POLICY_VIOLATION",
        "domain": "googleapis.com",
        "metadata": {
          "customConstraints": "constraints/iam.managed.preventPrivilegedBasicRolesForDefaultServiceAccounts",
          "resource": "projects/PROJECT_ID"
        }
      }
    ]
  }
}

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

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

כדי להבין איזה תפקיד צריך להקצות לחשבון השירות שמוגדר כברירת מחדל ב-Compute Engine, צריך לעיין בטבלה הבאה, בהתאם לשירות שבו משתמשים:

שירות חשבון שירות המשמש כברירת מחדל התפקיד שרוצים להקצות
Compute Engine חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com)

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

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

Cloud Build חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com) תפקיד בחשבון השירות של Cloud Build‏ (roles/cloudbuild.builds.builder)
Cloud Deploy חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com) כדי לראות אילו תפקידים צריך להעניק לחשבון השירות הזה, צריך למצוא את המדריך למתחילים של Cloud Deploy שמתאים לתרחיש השימוש שלכם, ואז להעניק את התפקידים שמתוארים במדריך למתחילים הזה. רשימה של מדריכים למתחילים ב-Cloud Deploy זמינה במאמר מדריכים למתחילים במסמכי Cloud Deploy.
פונקציות Cloud Run ו-Cloud Functions חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com)

כדי לפרוס פונקציות: תפקיד בחשבון Cloud Build‏ (roles/cloudbuild.builds.builder)

מידע נוסף מופיע במאמר בנושא חשבון שירות בהתאמה אישית ל-Cloud Build.

Cloud Run חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com)

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

פרטים על תפקידים ב-Cloud Run זמינים במאמר בקרת גישה באמצעות IAM במסמכי התיעוד של Cloud Run.

Google Kubernetes Engine חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com)

תפקיד חשבון השירות של צומת ברירת המחדל של Kubernetes Engine‏ (roles/container.defaultNodeServiceAccount)

מידע נוסף מופיע במאמר שימוש בחשבונות שירות ב-IAM עם הרשאות מינימליות.

Workflows חשבון השירות של Compute Engine שמוגדר כברירת מחדל (PROJECT_NUMBER-compute@developer.s3ns-system.iam.gserviceaccount.com)

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

במאמר איך נותנים הרשאה לתהליך עבודה לגשת למשאבים של Cloud de Confiance במאמרי העזרה בנושא Workflows מפורטות שיטות מומלצות.