הנפקת אישורים שמעידים על זהות של צד שלישי

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

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

מטרות

במדריך הזה מוסבר איך להשתמש ב-CA Service עם מאגרי זהויות של עומסי עבודה כדי לאחד זהות של צד שלישי ולקבל אישור שמעיד על הזהות הזו.

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

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

  • מאגרי זהויות של עומסי עבודה: מאגרי זהויות של עומסי עבודה מאפשרים לכם לנהל ספקי זהויות של צד שלישי. מידע נוסף זמין במאמר בנושא ניהול של ספקים ומאגרי זהויות של עומסי עבודה.
  • איחוד שירותי אימות הזהויות של עומסי עבודה: איחוד שירותי אימות הזהויות של עומסי עבודה מסתמך על מאגרי זהויות של עומסי עבודה כדי להעניק לזהויות של צד שלישי גישה לשירותי Google Cloud. מידע נוסף זמין במאמר איחוד שירותי אימות הזהות של עומסי עבודה.
  • Security Token Service (STS): שירות האסימונים מאפשר להחליף פרטי כניסה של צד שלישי באסימונים מהדומיין הנוכחי (Google Cloud). מידע נוסף זמין במאמר Security Token Service.
  • שיקוף הזהות: התכונה הזו מאפשרת להעביר את הזהות המאומתת של מי שמבקש אישור אל האישור המבוקש. מידע נוסף זמין במאמר בנושא שיקוף זהויות.

ודאו שיש לכם את תפקידי IAM הבאים:

  • כדי לנהל רשויות אישורים (CA) ומאגרי CA ולבקש אישורים, צריך לקבל את התפקיד 'מנהל תפעול של שירות CA' (privateca.caManager). מידע נוסף על תפקידי IAM ב-CA Service זמין במאמר בקרת גישה באמצעות IAM.
  • כדי לנהל מאגרים וספקים של זהויות של עומסי עבודה, צריך להיות לכם התפקיד 'אדמין של מאגר זהויות של כוח עבודה' (iam.workloadIdentityPoolAdmin).
  • כדי ליצור חשבון שירות, צריך להיות לכם התפקיד אדמין של חשבון שירות (iam.serviceAccountAdmin).

במאמר ניהול הגישה לפרויקטים, לתיקיות ולארגונים מוסבר איך להעניק תפקידי IAM. אפשר להעניק את תפקידי ה-IAM הנדרשים לחשבון Google, לחשבון שירות, לקבוצת Google, לחשבון Google Workspace או לדומיין Cloud Identity.

הגדרת ספק ומאגר זהויות של עומסי עבודה

במדריך הזה מוסבר איך להשתמש בספק Google OpenID Connect ‏ (OIDC) בשילוב עם חשבון שירות כדי לפעול כזהות של צד שלישי. ספק ה-OIDC של חשבונות Google פועל כספק זהויות (IdP) של צד שלישי, וחשבון השירות Google Cloud הוא דוגמה לזהות של צד שלישי שמאושרת על ידי ספק הזהויות הזה.

מאגרי הזהויות של עומסי עבודה תומכים במגוון ספקי זהויות, כולל Microsoft Azure/On-premises Active Directory,‏ AWS וספקי זהויות מבוססי SAML.

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

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

    gcloud iam workload-identity-pools create IDENTITY_POOL_ID --location global --display-name "tutorial-wip"
    

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

    • IDENTITY_POOL_ID: המזהה הייחודי של מאגר הזהויות החדש של כוח העבודה
  2. יוצרים ספק של מאגר זהויות של כוח עבודה עבור ספק הזהויות מצד שלישי:

    gcloud iam workload-identity-pools providers create-oidc PROVIDER_ID --location global --workload-identity-pool IDENTITY_POOL_ID --display-name "tutorial-oidc" --attribute-mapping "google.subject=assertion.sub" --issuer-uri="https://accounts.google.com"
    

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

    • PROVIDER_ID: המזהה הייחודי של ספק הזהויות שרוצים ליצור במאגר הזהויות של כוח העבודה

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

    • attribute-mapping: הדגל הזה מגדיר את המיפוי בין הטענות של הצד השלישי לבין הטענה של החשבון הראשי ב-Google, ‏ google.subject. ‫google.subject הוא מיפוי חובה שאפשר להגדיר לכל טענה או לשילוב של טענות באמצעות ביטוי CEL. מידע נוסף זמין במאמר הגדרת מיפוי של מאפיין ותנאי.
    • issuer-uri: אצל ספקי OIDC, הדגל הזה הוא נקודת קצה (endpoint) שזמינה לציבור ו-Google פונה אליה כדי לאמת אסימונים של צד שלישי. מידע נוסף זמין במאמר הכנת ספק זהויות חיצוני.

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

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

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

במקום רשות אישורים (CA) בסיסית, אפשר גם ליצור רשות אישורים משנית. יצירת רשות אישורים (CA) בסיסית עוזרת לקצר את התהליך.

  1. יוצרים מאגר CA במסלול DevOps:

    gcloud privateca pools create CA_POOL_ID --location LOCATION --tier devops
    

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

    • CA_POOL_ID – המזהה של מאגר ה-CA של שירות ה-CA שמנפיק אישורים
    • LOCATION – המיקום של מאגר אישורי ה-CA

    מידע נוסף על יצירת מאגרי CA זמין במאמר יצירת מאגר CA.

  2. יצירת רשות אישורים (CA) עליונה:

    gcloud privateca roots create CA_ID --pool CA_POOL_ID  --location LOCATION --subject "CN=test,O=test-org"
    

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

    • CA_ID – המזהה של רשות האישורים שמנפיקה את האישורים
    • CA_POOL_ID – המזהה של מאגר ה-CA של שירות ה-CA שמנפיק אישורים
    • LOCATION – המיקום של מאגר אישורי ה-CA

    מידע נוסף על יצירת רשות אישורי בסיס זמין במאמר יצירת רשות אישורי בסיס.

  3. הפעלת זהויות מאוחדות ממאגר הזהויות של עומסי העבודה כדי להנפיק אישורים ממאגר רשויות האישורים. כדי להשתמש בהשתקפות הזהות, מבקשי CreateCertificate צריכים את תפקיד ה-IAM‏ CA Service Workload Certificate Requester ‏(roles/privateca.workloadCertificateRequester).

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

    gcloud privateca pools add-iam-policy-binding CA_POOL_ID --location LOCATION --role roles/privateca.workloadCertificateRequester --member "principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/*"
    

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

    • CA_POOL_ID: המזהה של מאגר ה-CA של שירות ה-CA שמנפיק אישורים
    • LOCATION: המיקום של מאגר רשויות האישורים
    • PROJECT_NUMBER: מספר הפרויקט שבו יצרנו את מאגר הזהויות של עומסי עבודה
    • IDENTITY_POOL_ID: המזהה הייחודי של מאגר זהויות של עומסי עבודה חדש

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

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

gcloud iam service-accounts create SERVICE_ACCOUNT

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

  • SERVICE_ACCOUNT – המזהה של חשבון השירות שמייצג את הזהות של הצד השלישי

הנפקת אישור שמעיד על זהות של צד שלישי

לפני שמתחילים, מוודאים שיש לכם את תפקיד ה-IAM ‏(roles/iam.serviceAccountOpenIdTokenCreator) Service Account OpenID Connect Identity Token Creator. צריך את תפקיד ה-IAM הזה כדי להפעיל את GenerateIdToken API.

כדי לקבל אישור שמעיד על זהות של צד שלישי:

  1. מקבלים אסימון זהות של צד שלישי מספק הזהויות של הצד השלישי.

    curl

    export ID_TOKEN=`curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;print(json.load(sys.stdin)['token'])"`
    

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

    • PROJECT_ID – מזהה הפרויקט ב- Google Cloud שבו רוצים ליצור משאבים

    ספריות לקוח

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

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

    curl -d '{"audience":"//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID"}' -H 'Content-Type: application/json' -H "Authorization: Bearer $(gcloud auth print-access-token)" https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com:generateIdToken | python3 -c "import sys;import json;       print(json.load(sys.stdin)['token']) > /tmp/oidc_token.txt
    

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

    • PROJECT_ID: מזהה הפרויקט שבו רוצים ליצור משאבים
  2. מחליפים את האסימון של הצד השלישי באסימון מאוחד של OAuth באמצעות נקודת הקצה (endpoint) של STS: token

    curl

    export STS_TOKEN=`curl -L -X POST 'https://sts.googleapis.com/v1/token' -H 'Content-Type: application/json' \
    -d '{
        "grant_type": "urn:ietf:params:oauth:grant-type:token-exchange",
        "audience": "//iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID/providers/PROVIDER_ID",
        "requested_token_type": "urn:ietf:params:oauth:token-type:access_token",
        "scope": "https://www.googleapis.com/auth/cloud-platform",
        "subject_token": "'$ID_TOKEN'",
        "subject_token_type": "urn:ietf:params:oauth:token-type:jwt"
    }' | python3 -c "import sys;import json; print(json.load(sys.stdin)['access_token'])"`
    

    ספריות לקוח

    1. יוצרים קובץ תצורה של פרטי הכניסה בשם oidc_token.txt שהקוד שמבקש את האישור יכול לקרוא כדי לבצע החלפת אסימונים.
    gcloud iam workload-identity-pools create-cred-config projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/IDENTITY_POOL_ID --output-file=/tmp/cred_config.json --credential-source-file=/tmp/oidc_token.txt
    
    1. קוראים את קובץ oidc_token.txt כדי להגדיר את מנגנון ההרשאה בספריית הלקוח:

    python

    import json
    
    from google.auth import identity_pool
    
    with open('/tmp/cred_config.json', 'r') as f:
      json_config_info = json.loads(f.read())
    credentials = identity_pool.Credentials.from_info(json_config_info)
    scoped_credentials = credentials.with_scopes(
        ['https://www.googleapis.com/auth/cloud-platform'])
    
  3. שולחים בקשה ל-CA Service עם מצב בקשת הנושא REFLECTED_SPIFFE:

    curl

    1. אופציונלי: אם אין לכם CSR, יוצרים CSR על ידי הפעלת הפקודה הבאה.

      export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
      
    2. מבקשים אישור עם ה-CSR, משך חיים ומצב בקשת נושא משוקף:

      curl -H "Authorization: Bearer $(echo $STS_TOKEN)" https://privateca.googleapis.com/v1/projects/PROJECT_NUMBER/locations/LOCATION/caPools/CA_POOL_ID/certificates\?alt\=json  -X POST -H "Content-Type: application/json" -H 'Accept: application/json' --data '{"lifetime": "100s", "pemCsr": "'$TUTORIAL_CSR'", "subjectMode": "REFLECTED_SPIFFE"}'
      

    ספריות לקוח

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

    1. מפעילים לקוח מאומת של שירות CA:

      python

      caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
      
    2. לבקש אישור.

      Python

      כדי לבצע אימות ב-CA Service, צריך להגדיר את Application Default Credentials. מידע נוסף זמין במאמר הגדרת אימות לסביבת פיתוח מקומית.

      import google.cloud.security.privateca_v1 as privateca_v1
      from google.protobuf import duration_pb2
      
      
      def create_certificate(
          project_id: str,
          location: str,
          ca_pool_name: str,
          ca_name: str,
          certificate_name: str,
          common_name: str,
          domain_name: str,
          certificate_lifetime: int,
          public_key_bytes: bytes,
      ) -> None:
          """
          Create a Certificate which is issued by the Certificate Authority present in the CA Pool.
          The key used to sign the certificate is created by the Cloud KMS.
      
          Args:
              project_id: project ID or project number of the Cloud project you want to use.
              location: location you want to use. For a list of locations, see: https://cloud.google.com/certificate-authority-service/docs/locations.
              ca_pool_name: set a unique name for the CA pool.
              ca_name: the name of the certificate authority which issues the certificate.
              certificate_name: set a unique name for the certificate.
              common_name: a title for your certificate.
              domain_name: fully qualified domain name for your certificate.
              certificate_lifetime: the validity of the certificate in seconds.
              public_key_bytes: public key used in signing the certificates.
          """
      
          caServiceClient = privateca_v1.CertificateAuthorityServiceClient()
      
          # The public key used to sign the certificate can be generated using any crypto library/framework.
          # Also you can use Cloud KMS to retrieve an already created public key.
          # For more info, see: https://cloud.google.com/kms/docs/retrieve-public-key.
      
          # Set the Public Key and its format.
          public_key = privateca_v1.PublicKey(
              key=public_key_bytes,
              format_=privateca_v1.PublicKey.KeyFormat.PEM,
          )
      
          subject_config = privateca_v1.CertificateConfig.SubjectConfig(
              subject=privateca_v1.Subject(common_name=common_name),
              subject_alt_name=privateca_v1.SubjectAltNames(dns_names=[domain_name]),
          )
      
          # Set the X.509 fields required for the certificate.
          x509_parameters = privateca_v1.X509Parameters(
              key_usage=privateca_v1.KeyUsage(
                  base_key_usage=privateca_v1.KeyUsage.KeyUsageOptions(
                      digital_signature=True,
                      key_encipherment=True,
                  ),
                  extended_key_usage=privateca_v1.KeyUsage.ExtendedKeyUsageOptions(
                      server_auth=True,
                      client_auth=True,
                  ),
              ),
          )
      
          # Create certificate.
          certificate = privateca_v1.Certificate(
              config=privateca_v1.CertificateConfig(
                  public_key=public_key,
                  subject_config=subject_config,
                  x509_config=x509_parameters,
              ),
              lifetime=duration_pb2.Duration(seconds=certificate_lifetime),
          )
      
          # Create the Certificate Request.
          request = privateca_v1.CreateCertificateRequest(
              parent=caServiceClient.ca_pool_path(project_id, location, ca_pool_name),
              certificate_id=certificate_name,
              certificate=certificate,
              issuing_certificate_authority_id=ca_name,
          )
          result = caServiceClient.create_certificate(request=request)
      
          print("Certificate creation result:", result)
      
      

    3. מאמתים את האישור. באישור צריך להיות נושא שמכיל URI SAN אחד. ה-SAN שמעיד על זהות הוא בפורמט הבא:

      spiffe://IDENTITY_POOL_ID.PROJECT_NUMBER.global.workload.id.goog/subject/<oidc_subject_number>
      

      מחליפים את:

      • IDENTITY_POOL_ID: המזהה הייחודי של מאגר זהויות של עומסי עבודה
      • PROJECT_NUMBER – מספר הפרויקט שבו יצרתם את מאגר הזהויות של עומסי העבודה

הסרת המשאבים

כדי להימנע מחיובים ב Google Cloud חשבון על משאבי שירות CA שיצרתם בהתאם למסמך הזה, מבצעים את הפעולות הבאות באמצעות Google Cloud CLI:

  1. מוחקים את רשות האישורים שיצרתם.

    1. משביתים את ה-CA:

      gcloud privateca roots disable CA_ID --pool CA_POOL_ID  --location LOCATION
      

      מחליפים את:

      • CA_ID: המזהה הייחודי של ה-CA
      • CA_POOL_ID: המזהה הייחודי של מאגר רשויות האישורים
      • LOCATION: המיקום של מאגר רשויות האישורים
    2. מחיקת רשות האישורים:

      gcloud privateca roots delete CA_ID --pool CA_POOL_ID  --location LOCATION --ignore-active-certificates
      

      מחליפים את:

      • CA_ID: המזהה הייחודי של ה-CA
      • CA_POOL_ID: המזהה הייחודי של מאגר רשויות האישורים
      • LOCATION: המיקום של מאגר רשויות האישורים
  2. מוחקים את מאגר רשויות האישורים שיצרתם.

    gcloud privateca pools delete CA_POOL_ID --location LOCATION
    

    מחליפים את:

    • CA_POOL_ID: המזהה הייחודי של מאגר רשויות האישורים
    • LOCATION: המיקום של מאגר רשויות האישורים

    מידע נוסף על הפקודה gcloud privateca pools delete זמין במאמר gcloud privateca pools delete.

  3. מוחקים את מאגר הזהויות של עומסי העבודה שיצרתם:

    gcloud iam workload-identity-pools delete IDENTITY_POOL_ID --location global
    

    מחליפים את:

    • IDENTITY_POOL_ID: המזהה הייחודי של מאגר הזהויות של עומסי העבודה
  4. מוחקים את חשבון השירות שיצרתם:

    gcloud iam service-accounts delete SERVICE_ACCOUNT@PROJECT_ID.iam.gserviceaccount.com
    

    מחליפים את:

    • SERVICE_ACCOUNT: המזהה הייחודי של מאגר הזהויות של עומסי העבודה
    • PROJECT_ID: הפרויקט שבבעלותו חשבון השירות

תפקיד ה-IAM‏ CA Service Workload Certificate Requester ‏ (privateca.workloadCertificateRequester) מגביל את הנושא של האישור שהונפק רק לזהות של השולח. מוודאים שלמשתמשים או לעומסי עבודה שמשתמשים בתכונה 'שיקוף הזהות' מוקצה רק תפקיד ה-IAM ‏CA Service Workload Certificate Requester (privateca.workloadCertificateRequester). כדי לפעול בהתאם לעיקרון של הרשאות מינימליות, אפשר להימנע מהקצאת תפקיד ה-IAM 'שליחת בקשות לאישור שירות CA' (privateca.certificateRequester).

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