יצירת פרטי כניסה לטווח קצר לחשבון שירות

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

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

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

יצירת אסימון גישה לטווח קצר

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

מידע נוסף מופיע במאמר אסימוני גישה.

כדי ליצור אסימון גישה לטווח קצר, צריך להשלים את המשימות הבאות:

מתן ההרשאות הנדרשות

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

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

חשבון שירות

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

  • חשבון שירות של מבצע הקריאה החוזרת (CALLER_SA)

    חשבון השירות הזה מייצג את אפליקציית הקריאה, שמנפיקה את הבקשה לפרטי הכניסה לטווח הקצר.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לתת הרשאות ל-CALLER_SA ליצור פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להקצות ל-CALLER_SA את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את כתובת האימייל של חשבון השירות של מבצע הקריאה החוזרת, CALLER_SA.

    לדוגמה, demo@my-project.iam.gserviceaccount.com.

  7. בוחרים את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).
  8. כדי להקצות את התפקיד לחשבון השירות, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_SA: כתובת האימייל של חשבון השירות שמייצג את האפליקציה שמבקשת את האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. צריך לשנות את מדיניות ההרשאה כדי להקצות ל-CALLER_SA את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    שיטת ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

פרטי הכניסה של המשתמש

כשרוצים להשתמש ב-Google Cloud CLI כדי ליצור אסימונים לטווח קצר, או ליצור אותם מסביבת פיתוח מקומית, אפשר להשתמש בחשבון משתמש כדי ליצור את האסימונים. לרוב, אפשר להשתמש בחשבון המשתמש שלכם.

כשמשתמשים בחשבון משתמש כדי ליצור אסימונים לטווח קצר, הזהויות הבאות מעורבות בכך:

  • החשבון של המתקשר (CALLER_ACCOUNT)

    חשבון המשתמש הזה משמש ליצירת פרטי כניסה לטווח קצר בשביל חשבון השירות שנושא את ההרשאות.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לאפשר ל-CALLER_ACCOUNT ליצור פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להעניק ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את המזהה של החשבון הראשי של מבצע הקריאה החוזרת, CALLER_ACCOUNT.

    לדוגמה, my-user@example.com.

  7. בוחרים את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).
  8. כדי להקצות את התפקיד לחשבון המשתמש, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_ACCOUNT: כתובת האימייל של חשבון המשתמש ששימש לבקשת האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. צריך לשנות את מדיניות ההרשאה כדי להקצות ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימונים בחשבון שירות' ( roles/iam.serviceAccountTokenCreator).

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

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

יצירת אסימון הגישה

אפשר ליצור אסימון גישה ל-OAuth 2.0 באמצעות ה-CLI של gcloud, ה-API ל-REST או באמצעות ספריות הלקוח ב-Cloud וספריות הלקוח של Google API.

אם משתמשים ב-API ל-REST, והגדרות המערכת שלכם יאפשרו תוחלת חיים מורחבת לאסימון, אפשר ליצור אסימון שתוחלת החיים שלו ארוכה מברירת המחדל. ב-Google Cloud CLI אין תמיכה בהגדרה של תוחלת חיים לאסימון.

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

יצירת אסימון גישה מסוג OAuth 2.0 בשביל חשבון שירות:

gcloud

  1. מוודאים שנכנסתם ל-CLI של gcloud באמצעות חשבון המשתמש של מבצע הקריאה.

  2. מריצים את הפקודה gcloud auth print-access-token כדי ליצור אסימון לחשבון השירות.

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

    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.

    מריצים את הפקודה הבאה:

    ‫Linux,‏ macOS או Cloud Shell

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    ‏Windows (PowerShell)

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    Windows‏ (cmd.exe)

    gcloud auth print-access-token --impersonate-service-account=PRIV_SA

    אמורים לקבל תגובה שדומה לזו:

    WARNING: This command is using service account impersonation. All API calls will be executed as
    [my-sa@my-project.iam.gserviceaccount.com].
    ya29.c.b0AXv0zTPnzTnDV8F8Aj5Fgy46Yf2v_v8eZIoKq7xGpfbpXuy23aQ1693m3gAuE8AZga7w6kdagN7a9bfdDYbdeoGY0CMHOClsCwIdutL7k_RFC672lOCbUgF5hS8Iu2nCA8hle-11LJXBLmaxFmH08ZTBJLuDrWSNd8cYqGYFunSC1K1qLIPBF18tsa0hxVgKPucI8b1A9L8_MK1JGLGcr0n7-zY77_lmbcdODG3NmIbLOGWOutjJgqSO_YoeCKK2QTUZIp5PG7RkKlXWnmYJA9pEahzNoQrs5sWZctc2bia9af_ITzqqlXC9h1Kj5-me6e8rd734MJvpagqYazRk0gGWpMb03XmMGpgPc_FBp4pnX9rGOzW83SNpcDz8zeFO1Q0Bo3N7CuZougjRce0y8I2_4rtw5ME_nV3wrCWa..................................................................................................................................................................................................................................................................................................
    

REST

שיטת 'ה-API של פרטי הכניסה של חשבון השירות' (serviceAccounts.generateAccessToken) יוצרת אסימון גישה מסוג OAuth 2.0 בשביל חשבון שירות.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
  • LIFETIME: משך הזמן עד שיפוג התוקף של אסימון הגישה, בשניות. לדוגמה: 300s.

    כברירת מחדל, משך החיים המקסימלי של אסימון הוא שעה אחת (3,600 שניות). כדי להאריך את משך החיים המקסימלי של האסימונים האלה ל-12 שעות (43,200 שניות), מוסיפים את חשבון השירות למדיניות הארגון שכוללת את אילוץ הרשימה constraints/iam.allowServiceAccountCredentialLifetimeExtension.

שיטת ה-HTTP וכתובת ה-URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateAccessToken

תוכן בקשת JSON:

{
  "scope": [
    "https://www.googleapis.com/auth/cloud-platform"
  ],
  "lifetime": "LIFETIME"
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אם הבקשה של generateAccessToken תאושר, גוף התגובה יכלול אסימון גישה מסוג OAuth 2.0 ומועד תפוגה. לאחר מכן אפשר יהיה להשתמש ב-accessToken כדי לאמת בקשה מטעם חשבון השירות, עד שמגיעים לזמן ה-expireTime:

{
  "accessToken": "eyJ0eXAi...NiJ9",
  "expireTime": "2020-04-07T15:01:23.045123456Z"
}

Go

import (
	"context"
	"fmt"
	"io"
	"time"

	"golang.org/x/oauth2/google"
	"google.golang.org/api/impersonate"
	"google.golang.org/api/option"
)

// getAccessTokenFromImpersonatedCredentials uses a service account (SA1) to impersonate
// another service account (SA2) and obtain OAuth2 token for the impersonated account.
// To obtain a token for SA2, SA1 should have the "roles/iam.serviceAccountTokenCreator" permission on SA2.
func getAccessTokenFromImpersonatedCredentials(w io.Writer, impersonatedServiceAccount, scope string) error {
	// impersonatedServiceAccount := "name@project.service.gserviceaccount.com"
	// scope := "https://www.googleapis.com/auth/cloud-platform"

	ctx := context.Background()

	// Construct the GoogleCredentials object which obtains the default configuration from your
	// working environment.
	credentials, err := google.FindDefaultCredentials(ctx, scope)
	if err != nil {
		fmt.Fprintf(w, "failed to generate default credentials: %v", err)
		return fmt.Errorf("failed to generate default credentials: %w", err)
	}

	ts, err := impersonate.CredentialsTokenSource(ctx, impersonate.CredentialsConfig{
		TargetPrincipal: impersonatedServiceAccount,
		Scopes:          []string{scope},
		Lifetime:        300 * time.Second,
		// delegates: The chained list of delegates required to grant the final accessToken.
		// For more information, see:
		// https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
		// Delegates is NOT USED here.
		Delegates: []string{},
	}, option.WithCredentials(credentials))
	if err != nil {
		fmt.Fprintf(w, "CredentialsTokenSource error: %v", err)
		return fmt.Errorf("CredentialsTokenSource error: %w", err)
	}

	// Get the OAuth2 token.
	// Once you've obtained the OAuth2 token, you can use it to make an authenticated call.
	t, err := ts.Token()
	if err != nil {
		fmt.Fprintf(w, "failed to receive token: %v", err)
		return fmt.Errorf("failed to receive token: %w", err)
	}
	fmt.Fprintf(w, "Generated OAuth2 token with length %d.\n", len(t.AccessToken))

	return nil
}

Java


package com.google.cloud.auth.samples;

import com.google.auth.oauth2.GoogleCredentials;
import com.google.auth.oauth2.ImpersonatedCredentials;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

public class AccessTokenFromImpersonatedCredentials {

  public static void main(String[] args) throws IOException {
    // TODO(Developer): Replace the below variables before running the code.

    // Provide the scopes that you might need to request access to Google APIs,
    // depending on the level of access you need.
    // This example uses the cloud-wide scope and uses IAM to narrow the permissions.
    // https://cloud.google.com/docs/authentication/external/authorization-gcp
    // For more information, see: https://developers.google.com/identity/protocols/oauth2/scopes
    String scope = "https://www.googleapis.com/auth/cloud-platform";

    // The name of the privilege-bearing service account for whom the credential is created.
    String impersonatedServiceAccount = "name@project.service.gserviceaccount.com";

    getAccessToken(impersonatedServiceAccount, scope);
  }

  // Use a service account (SA1) to impersonate another service account (SA2) and obtain an ID token
  // for the impersonated account.
  // To obtain a token for SA2, SA1 should have the "roles/iam.serviceAccountTokenCreator"
  // permission on SA2.
  public static void getAccessToken(
      String impersonatedServiceAccount, String scope) throws IOException {

    // Construct the GoogleCredentials object which obtains the default configuration from your
    // working environment.
    GoogleCredentials googleCredentials = GoogleCredentials.getApplicationDefault();

    // delegates: The chained list of delegates required to grant the final accessToken.
    // For more information, see:
    // https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
    // Delegate is NOT USED here.
    List<String> delegates = null;

    // Create the impersonated credential.
    ImpersonatedCredentials impersonatedCredentials =
        ImpersonatedCredentials.newBuilder()
            .setSourceCredentials(googleCredentials)
            .setTargetPrincipal(impersonatedServiceAccount)
            .setScopes(Arrays.asList(scope))
            .setLifetime(300)
            .setDelegates(delegates)
            .build();

    // Get the OAuth2 token.
    // Once you've obtained the OAuth2 token, you can use it to make an authenticated call.
    impersonatedCredentials.refresh();
    String accessToken = impersonatedCredentials.getAccessToken().getTokenValue();
    System.out.println("Generated access token.");
  }
}

Node.js

/**
 * TODO(developer):
 *  Uncomment and replace these variables before running the sample.
 */
// const impersonatedServiceAccount = 'name@project.service.gserviceaccount.com';
// const scope = 'https://www.googleapis.com/auth/cloud-platform';

const {GoogleAuth, Impersonated} = require('google-auth-library');

async function getAccessTokenFromImpersonatedCredentials() {
  const googleAuth = new GoogleAuth({
    scopes: scope,
  });
  // Construct the GoogleCredentials object which obtains the default configuration from your
  // working environment.
  const {credential} = await googleAuth.getApplicationDefault();

  // delegates: The chained list of delegates required to grant the final accessToken.
  // For more information, see:
  // https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
  // Delegate is NOT USED here.
  const delegates = [];

  // Create the impersonated credential.
  const impersonatedCredentials = new Impersonated({
    sourceClient: credential,
    delegates,
    targetPrincipal: impersonatedServiceAccount,
    targetScopes: [scope],
    lifetime: 300,
  });

  // Get the OAuth2 token.
  // Once you've obtained the OAuth2 token, you can use it to make an authenticated call
  // to the target audience.
  const resp = await impersonatedCredentials.getAccessToken();
  // Token is in resp.token.
  console.log('Generated OAuth2 token with length %s', resp.token.length);
}

getAccessTokenFromImpersonatedCredentials();

Python

def accesstoken_from_impersonated_credentials(
    impersonated_service_account: str, scope: str
):
    from google.auth import impersonated_credentials
    import google.auth.transport.requests

    """
      Use a service account (SA1) to impersonate another service account (SA2)
      and obtain an ID token for the impersonated account.
      To obtain a token for SA2, SA1 should have the
      "roles/iam.serviceAccountTokenCreator" permission on SA2.

    Args:
        impersonated_service_account: The name of the privilege-bearing service account for whom the credential is created.
            Examples: name@project.service.gserviceaccount.com

        scope: Provide the scopes that you might need to request to access Google APIs,
            depending on the level of access you need.
            For this example, we use the cloud-wide scope and use IAM to narrow the permissions.
            https://cloud.google.com/docs/authentication#authorization_for_services
            For more information, see: https://developers.google.com/identity/protocols/oauth2/scopes
    """

    # Construct the GoogleCredentials object which obtains the default configuration from your
    # working environment.
    credentials, project_id = google.auth.default()

    # Create the impersonated credential.
    target_credentials = impersonated_credentials.Credentials(
        source_credentials=credentials,
        target_principal=impersonated_service_account,
        # delegates: The chained list of delegates required to grant the final accessToken.
        # For more information, see:
        # https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#sa-credentials-permissions
        # Delegate is NOT USED here.
        delegates=[],
        target_scopes=[scope],
        lifetime=300,
    )

    # Get the OAuth2 token.
    # Once you've obtained the OAuth2 token, use it to make an authenticated call
    # to the target audience.
    request = google.auth.transport.requests.Request()
    target_credentials.refresh(request)
    # The token field is target_credentials.token.
    print("Generated OAuth2 token.")

יצירת אסימון מזהה של OpenID Connect (OIDC)

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

מידע נוסף זמין במאמרים אסימונים מזהים ואימות לאפליקציות שמתארחות ב-Cloud Run או בפונקציות של Cloud Run.

כדי ליצור אסימון מזהה, מבצעים את הפעולות האלה:

מתן ההרשאות הנדרשות

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

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

חשבון שירות

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

  • חשבון שירות של מבצע הקריאה החוזרת (CALLER_SA)

    חשבון השירות הזה מייצג את אפליקציית הקריאה, שמנפיקה את הבקשה לפרטי הכניסה לטווח הקצר.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לתת ל-CALLER_SA הרשאות ליצירת פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להקצות ל-CALLER_SA את התפקיד 'יצירת אסימון זהות' ב-OpenID Connect של חשבון שירות (roles/iam.serviceAccountOpenIdTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את כתובת האימייל של חשבון השירות של מבצע הקריאה החוזרת, CALLER_SA.

    לדוגמה, demo@my-project.iam.gserviceaccount.com.

  7. בוחרים בתפקיד 'יצירת אסימון זהות' ב-OpenID Connect של חשבון שירות (roles/iam.serviceAccountOpenIdTokenCreator).
  8. כדי להקצות את התפקיד לחשבון השירות, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_SA: כתובת האימייל של חשבון השירות שמייצג את האפליקציה שמבקשת את האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountOpenIdTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. משנים את מדיניות ההרשאה כדי להקצות ל-CALLER_SA את התפקיד 'יצירת אסימון זהות' ב-OpenID Connect של חשבון שירות (roles/iam.serviceAccountOpenIdTokenCreator).

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    שיטת ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

פרטי הכניסה של המשתמש

כשרוצים להשתמש ב-Google Cloud CLI כדי ליצור אסימונים לטווח קצר, או ליצור אותם מסביבת פיתוח מקומית, אפשר להשתמש בחשבון משתמש כדי ליצור את האסימונים. לרוב, אפשר להשתמש בחשבון המשתמש שלכם.

כשמשתמשים בחשבון משתמש כדי ליצור אסימונים לטווח קצר, הזהויות הבאות מעורבות בכך:

  • החשבון של המתקשר (CALLER_ACCOUNT)

    חשבון המשתמש הזה משמש ליצירת פרטי כניסה לטווח קצר בשביל חשבון השירות שנושא את ההרשאות.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לאפשר ל-CALLER_ACCOUNT ליצור פרטי כניסה לטווח קצר ל-PRIV_SA, צריך להקצות ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימון זהות' ב-OpenID Connect בחשבון שירות (roles/iam.serviceAccountOpenIdTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את המזהה של החשבון הראשי של מבצע הקריאה החוזרת, CALLER_ACCOUNT.

    לדוגמה, my-user@example.com.

  7. בוחרים בתפקיד 'יצירת אסימון זהות' ב-OpenID Connect של חשבון שירות (roles/iam.serviceAccountOpenIdTokenCreator).
  8. כדי להקצות את התפקיד לחשבון המשתמש, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_ACCOUNT: כתובת האימייל של חשבון המשתמש ששימש לבקשת האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountOpenIdTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountOpenIdTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. משנים את מדיניות ההרשאה כדי להקצות ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימון זהות' ב-OpenID Connect של חשבון שירות ( roles/iam.serviceAccountOpenIdTokenCreator).

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

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountOpenIdTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountOpenIdTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

יצירת האסימון המזהה

אפשר ליצור אסימון מזהה של OpenID Connect (OIDC), באמצעות ה-CLI של gcloud, ה-API ל-REST או באמצעות ספריות הלקוח ב-Cloud וספריות הלקוח של Google API.

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

אסימונים מזהים OIDC תקפים לשעה אחת (3,600 שניות).

יוצרים אסימון מזהה OIDC בחתימה של Google בשביל חשבון שירות:

gcloud

  1. מוודאים שנכנסתם ל-CLI של gcloud באמצעות חשבון המשתמש של מבצע הקריאה.

  2. מריצים את הפקודה gcloud auth print-identity-token כדי ליצור אסימון לחשבון השירות.

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

    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • AUDIENCE_NAME: הקהל של האסימון, בדרך כלל כתובת ה-URL של האפליקציה או השירות שישתמש באסימון כדי לגשת אליהם.
      • מריצים את הפקודה הבאה:

        ‫Linux,‏ macOS או Cloud Shell

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        ‏Windows (PowerShell)

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        Windows‏ (cmd.exe)

        gcloud auth print-identity-token --impersonate-service-account=PRIV_SA --audiences="AUDIENCE_NAME"

        אמורים לקבל תגובה שדומה לזו:

        WARNING: This command is using service account impersonation. All API calls will be executed as
        [my-sa@my-project.iam.gserviceaccount.com].
        eyJhbGciOiJSUzI1NiIsImtpZDNhMDg4ZDRmZmMjJkYTVmZTM5MDZjY2MiLCJ0eXAiOiJKV1QifQ.eyJhdWQiOiJ3d3cuZXhhbXBsJhenAiOiIxMTYzwNDYyMDk0ODIiLCJleHAiOjE2NTQ4ODU0MzEsImlhdCI6MTY1NDg4MTgzMSwiaXN6Ly9hY2NvdW50cy5nb29nbGUuY29tIiwic3ViIMDQ2MjA5NDgyIn0.F7mu8IHj5VQdu7ItFrnYAKyGd7YqXuOP_rFLc98q8BaFBycAF1zAQnSnwqnSUXba0UK9PDT_-IOry68qLwBObz4XlX9lk0ehpN0O0W9FcFToKLB6wefXXPd4h7xtuPe5KzmpSOqj2Qqv34HriGw00Nqd-oGSgNY_lZ4wGEf4rT4oQa_kEcrY57Q2G6pwd769BhgeFwoLi5aK_Cv2kvf_zfMszC-xlkP9zwWQ8XinJBwe-qcQBa4NTgrbueNtXsEjccBS366zmw
        

REST

שיטת 'ה-API של פרטי הכניסה של חשבון השירות' (serviceAccounts.generateIdToken) יוצרת אסימון מזהה מסוג OIDC בשביל חשבון שירות.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
  • AUDIENCE_NAME: הקהל של האסימון, בדרך כלל כתובת ה-URL של האפליקציה או השירות שישתמש באסימון כדי לגשת אליהם.

שיטת ה-HTTP וכתובת ה-URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:generateIdToken

תוכן בקשת JSON:

{
  "audience": "AUDIENCE_NAME",
  "includeEmail": "true"
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

{
  "token": "eyJ0eXAi...NiJ9"
}

יצירת ‎(JWT) JSON Web Token בחתימה עצמית

אפשר להשתמש ב-JSON Web Tokens ‏(JWT) בחתימה עצמית במגוון תרחישים:

  • תקשורת מאובטחת בין האפליקציות שלך. בתרחיש הזה, אפליקציה אחת יכולה לחתום על אסימון שאפליקציה אחרת יכולה לבדוק למטרות אימות.
  • אימות קריאה ל-Google API כפי שמתואר בהרשאה של חשבון שירות ללא OAuth.
  • אימות ל-API שנפרס באמצעות API Gateway.
  • התייחסות לחשבון שירות כספק זהויות באמצעות חתימה על JWT שמכיל הצהרות שרירותיות על משתמש, חשבון או מכשיר.

כדי ליצור JWT, מבצעים את הפעולות הבאות:

מתן ההרשאות הנדרשות

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

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

חשבון שירות

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

  • חשבון שירות של מבצע הקריאה החוזרת (CALLER_SA)

    חשבון השירות הזה מייצג את אפליקציית הקריאה, שמנפיקה את הבקשה לפרטי הכניסה לטווח הקצר.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לתת הרשאות ל-CALLER_SA ליצור פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להקצות ל-CALLER_SA את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את כתובת האימייל של חשבון השירות של מבצע הקריאה החוזרת, CALLER_SA.

    לדוגמה, demo@my-project.iam.gserviceaccount.com.

  7. בוחרים את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).
  8. כדי להקצות את התפקיד לחשבון השירות, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_SA: כתובת האימייל של חשבון השירות שמייצג את האפליקציה שמבקשת את האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. צריך לשנות את מדיניות ההרשאה כדי להקצות ל-CALLER_SA את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    שיטת ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

פרטי הכניסה של המשתמש

כשרוצים להשתמש ב-Google Cloud CLI כדי ליצור אסימונים לטווח קצר, או ליצור אותם מסביבת פיתוח מקומית, אפשר להשתמש בחשבון משתמש כדי ליצור את האסימונים. לרוב, אפשר להשתמש בחשבון המשתמש שלכם.

כשמשתמשים בחשבון משתמש כדי ליצור אסימונים לטווח קצר, הזהויות הבאות מעורבות בכך:

  • החשבון של המתקשר (CALLER_ACCOUNT)

    חשבון המשתמש הזה משמש ליצירת פרטי כניסה לטווח קצר בשביל חשבון השירות שנושא את ההרשאות.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לאפשר ל-CALLER_ACCOUNT ליצור פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להעניק ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את המזהה של החשבון הראשי של מבצע הקריאה החוזרת, CALLER_ACCOUNT.

    לדוגמה, my-user@example.com.

  7. בוחרים את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).
  8. כדי להקצות את התפקיד לחשבון המשתמש, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_ACCOUNT: כתובת האימייל של חשבון המשתמש ששימש לבקשת האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. צריך לשנות את מדיניות ההרשאה כדי להקצות ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימונים בחשבון שירות' ( roles/iam.serviceAccountTokenCreator).

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

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

יצירת ה-JWT

יצירת JWT בחתימה עצמית:

REST

שיטת 'ה-API של פרטי הכניסה של חשבון השירות' (serviceAccounts.signJwt) חותמת על JWT באמצעות מפתח פרטי בניהול מערכת של חשבון שירות.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
  • JWT_PAYLOAD: המטען הייעודי של JWT לחתימה שהוא אובייקט JSON שמכיל קבוצת הצהרות של JWT. מוסיפים את ההצהרות שנחוצות לתרחיש הרצוי, ושעומדות בדרישות האימות של השירות שרוצים לבצע אליו קריאה. אם מבצעים קריאה ל-Google API, מומלץ לעיין ב מדריך האימות של Google כדי לראות מהן דרישות ההצהרה.

    התוקף של ההצהרה exp (זמן התפוגה) צריך להיות בטווח של עד 12 שעות קדימה. כשמבצעים קריאה ל-Google API, צריך להגדיר את ההצהרהexp לא יותר משעה אחת קדימה.

    המטען הייעודי (payload) בדוגמה הבאה מכיל הצהרות לקריאה ל-Google API שבהן EXP היא חותמת זמן במספר שלם שמייצג את זמן התפוגה:

    { \"iss\": \"PRIV_SA\", \"sub\": \"PRIV_SA\", \"aud\": \"https://firestore.googleapis.com/\", \"iat\": 1529350000, \"exp\": EXP }

שיטת ה-HTTP וכתובת ה-URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signJwt

תוכן בקשת JSON:

{
  "payload": "JWT_PAYLOAD"
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אם הבקשה של signJwt תאושר, גוף התגובה יכלול JWT חתום ומזהה של מפתח החתימה ששימש לחתימה על ה-JWT. אפשר להשתמש בערך signedJwt כאסימון למוכ"ז כדי לאמת בקשה באופן ישיר מטעם חשבון השירות. האסימון תקף עד לזמן התפוגה שצוין בבקשה:

{
  "keyId": "42ba1e...fc0a",
  "signedJwt": "eyJ0eXAi...NiJ9"
}

יצירת אובייקט בינארי בחתימה עצמית (blob)

אובייקטים בינאריים בחתימה עצמית, או blobs, משמשים לשידור נתונים בינאריים כך שמקור הנתונים ידוע (כיוון שה-blob הוא בחתימה עצמית). אפשר להשתמש ב-blobs כדי ליצור חתימות, אובייקט ב-Cloud Storage שנדרש לתהליכי אימות שונים, כולל כתובות URL חתומות. למידע על חתימות, אפשר לעיין במשאבי העזרה של Cloud Storage.

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

מתן ההרשאות הנדרשות

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

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

חשבון שירות

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

  • חשבון שירות של מבצע הקריאה החוזרת (CALLER_SA)

    חשבון השירות הזה מייצג את אפליקציית הקריאה, שמנפיקה את הבקשה לפרטי הכניסה לטווח הקצר.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לתת הרשאות ל-CALLER_SA ליצור פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להקצות ל-CALLER_SA את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את כתובת האימייל של חשבון השירות של מבצע הקריאה החוזרת, CALLER_SA.

    לדוגמה, demo@my-project.iam.gserviceaccount.com.

  7. בוחרים את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).
  8. כדי להקצות את התפקיד לחשבון השירות, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_SA: כתובת האימייל של חשבון השירות שמייצג את האפליקציה שמבקשת את האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=serviceAccount:CALLER_SA --role=roles/iam.serviceAccountTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "serviceAccount:CALLER_SA"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwXhCB4eyjY=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. צריך לשנות את מדיניות ההרשאה כדי להקצות ל-CALLER_SA את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "serviceAccount:CALLER_SA"
            ]
          }
        ]
      }

    שיטת ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

פרטי הכניסה של המשתמש

כשרוצים להשתמש ב-Google Cloud CLI כדי ליצור אסימונים לטווח קצר, או ליצור אותם מסביבת פיתוח מקומית, אפשר להשתמש בחשבון משתמש כדי ליצור את האסימונים. לרוב, אפשר להשתמש בחשבון המשתמש שלכם.

כשמשתמשים בחשבון משתמש כדי ליצור אסימונים לטווח קצר, הזהויות הבאות מעורבות בכך:

  • החשבון של המתקשר (CALLER_ACCOUNT)

    חשבון המשתמש הזה משמש ליצירת פרטי כניסה לטווח קצר בשביל חשבון השירות שנושא את ההרשאות.

  • חשבון שירות שנושא את ההרשאות (PRIV_SA)

    חשבון השירות הזה קיבל את תפקידי ה-IAM שנדרשים בשביל האסימון לטווח קצר. זהו חשבון השירות שבשבילו נוצר האסימון לטווח קצר.

כדי לאפשר ל-CALLER_ACCOUNT ליצור פרטי כניסה לטווח קצר בשביל PRIV_SA, צריך להעניק ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator) ב-PRIV_SA.

הקצאת התפקיד הנדרש ב-PRIV_SA:

המסוף

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

    כניסה לדף Service Accounts

  2. בוחרים פרויקט.
  3. לוחצים על כתובת האימייל של חשבון השירות שנושא את ההרשאות, PRIV_SA.
  4. לוחצים על הכרטיסייה Permissions.
  5. תחת Principals with access to this service account לוחצים על Grant Access.
  6. מזינים את המזהה של החשבון הראשי של מבצע הקריאה החוזרת, CALLER_ACCOUNT.

    לדוגמה, my-user@example.com.

  7. בוחרים את התפקיד 'יצירת אסימונים בחשבון שירות' (roles/iam.serviceAccountTokenCreator).
  8. כדי להקצות את התפקיד לחשבון המשתמש, לוחצים על Save.

gcloud

הפקודה gcloud iam service-accounts add-iam-policy-binding מקצה תפקיד בחשבון שירות.

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

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון.
  • CALLER_ACCOUNT: כתובת האימייל של חשבון המשתמש ששימש לבקשת האסימון לטווח קצר.

מריצים את הפקודה הבאה:

‫Linux,‏ macOS או Cloud Shell

gcloud iam service-accounts add-iam-policy-binding PRIV_SA \
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

‏Windows (PowerShell)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA `
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

Windows‏ (cmd.exe)

gcloud iam service-accounts add-iam-policy-binding PRIV_SA ^
    --member=user:CALLER_ACCOUNT --role=roles/iam.serviceAccountTokenCreator --format=json

אמורים לקבל תגובה שדומה לזו:

Updated IAM policy for serviceAccount [PRIV_SA].
{
  "bindings": [
    {
      "members": [
        "user:my-user@example.com"
      ],
      "role": "roles/iam.serviceAccountTokenCreator"
    }
  ],
  "etag": "BwX1ZbefjXU=",
  "version": 1
}

REST

  1. צריך לקרוא את מדיניות ההרשאה ל-PRIV_SA:

    ה-method serviceAccounts.getIamPolicy מאפשרת לקבל את מדיניות ההרשאות של חשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן אחזור מדיניות.

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:getIamPolicy

    תוכן בקשת JSON:

    {
      "options": {
        "requestedPolicyVersion": POLICY_VERSION
      }
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

    אמורה להתקבל תגובת JSON שדומה לזו:

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
    

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

  2. צריך לשנות את מדיניות ההרשאה כדי להקצות ל-CALLER_ACCOUNT את התפקיד 'יצירת אסימונים בחשבון שירות' ( roles/iam.serviceAccountTokenCreator).

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

    {
      "version": 1,
      "etag": "BwWKmjvelug=",
      "bindings": [
        {
          "role": "roles/serviceAccountAdmin",
          "members": [
            "user:my-user@example.com"
          ]
        },
        {
          "role": "roles/iam.serviceAccountTokenCreator",
          "members": [
            "user:my-user@example.com"
          ]
        }
      ]
    }
  3. כתיבת מדיניות ההרשאה המעודכנת:

    השיטה serviceAccounts.setIamPolicy מגדירה מדיניות הרשאות מעודכנת לחשבון השירות.

    לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

    • PROJECT_ID: מזהה הפרויקט ב- Google Cloud . מזהי פרויקטים הם מחרוזות אלפאנומריות, כמו my-project.
    • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
    • POLICY_VERSION: גרסת המדיניות שתוחזר. בבקשות צריך לציין את הגרסה הכי עדכנית של המדיניות (3). פרטים נוספים מופיעים במאמר ציון גרסת מדיניות בזמן קבלת מדיניות.
    • POLICY: ייצוג JSON של המדיניות שרוצים להגדיר. מידע נוסף על הפורמט של מדיניות מופיע בחומר העזר בנושא מדיניות.

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

      {
        "version": 1,
        "etag": "BwWKmjvelug=",
        "bindings": [
          {
            "role": "roles/serviceAccountAdmin",
            "members": [
              "user:my-user@example.com"
            ]
          },
          {
            "role": "roles/iam.serviceAccountTokenCreator",
            "members": [
              "CALLER_ACCOUNT"
            ]
          }
        ]
      }

    ה-method של ה-HTTP וכתובת ה-URL:

    POST https://iam.googleapis.com/v1/projects/PROJECT_ID/serviceAccounts/PRIV_SA:setIamPolicy

    תוכן בקשת JSON:

    {
      "policy": POLICY
    }
    

    כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

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

יצירת blob בחתימה עצמית

יצירת blob בחתימה עצמית לחשבון השירות:

REST

שיטת 'ה-API של פרטי הכניסה של חשבון השירות' (serviceAccounts.signBlob) חותמת על blob באמצעות מפתח פרטי בניהול מערכת של חשבון שירות.

לפני שמשתמשים בנתוני הבקשה, צריך להחליף את הנתונים הבאים:

  • PRIV_SA: כתובת האימייל של חשבון השירות שנושא את ההרשאות שבשבילו נוצר האסימון לטווח קצר.
  • BLOB_PAYLOAD: מחרוזת מקודדת של base64 בבייטים. לדוגמה: VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cu.

שיטת ה-HTTP וכתובת ה-URL:

POST https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/PRIV_SA:signBlob

תוכן בקשת JSON:

{
  "payload": "BLOB_PAYLOAD"
}

כדי לשלוח את הבקשה צריך להרחיב אחת מהאפשרויות הבאות:

אם הבקשה של signBlob תאושר, גוף התגובה יכלול blob חתום ומזהה של מפתח החתימה ששימש לחתימה על ה-blob. אפשר להשתמש בערך signedBlob כאסימון למוכ"ז כדי לאמת בקשה באופן ישיר מטעם חשבון השירות. האסימון תקף עד שיפוג התוקף של המפתח הפרטי בניהול מערכת של חשבון השירות. המזהה של המפתח הזה הוא הערך של השדה keyId בתגובה.

{
  "keyId": "42ba1e...fc0a",
  "signedBlob": "eyJ0eXAi...NiJ9"
}