Zertifikate ausstellen, die die Identität eines Drittanbieters bestätigen

In dieser Anleitung wird gezeigt, wie Sie mithilfe von Identitätsreflexion und Workload Identity-Pools Zertifikate ausstellen können, die die Identität eines Drittanbieters bestätigen.

Mithilfe der Identitätsreflexion können Sie Zertifikate erstellen, die mit der bestätigten Identität eines Zertifikatsanfragestellers übereinstimmen. Mithilfe der Identitätsspiegelung können Sie einen nicht privilegierten Zertifikatforderer so einschränken, dass er nur Zertifikate mit einem alternativen Antragstellernamen (Subject Alternative Name, SAN) anfordert, der der Identität in seinen Anmeldedaten entspricht.

Lernziele

Diese Anleitung enthält Informationen dazu, wie Sie den Zertifizierungsstellendienst mit Workload Identity-Pools verwenden können, um eine Drittanbieteridentität zu föderieren und ein Zertifikat zu erhalten, das diese Identität attestiert.

Hinweise

Machen Sie sich zuerst mit den folgenden Konzepten vertraut:

  • Identitätspools für Arbeitslasten: Mit Workload Identity-Pools können Sie externe Identitätsanbieter verwalten. Weitere Informationen finden Sie unter Workload Identity-Pools und -Anbieter verwalten.
  • Identitätsföderation von Arbeitslasten: Die Identitätsföderation von Arbeitslasten nutzt Workload Identity-Pools, um Identitäten von Drittanbietern Zugriff auf Google Cloud-Dienste zu gewähren. Weitere Informationen finden Sie unter Identitätsföderation von Arbeitslasten.
  • Security Token Service (STS): Mit dem Security Token Service können Sie Anmeldedaten von Drittanbietern gegen eigene Tokens (Google Cloud) austauschen. Weitere Informationen finden Sie unter Security Token Service.
  • Identitätsreflexion: Mit der Funktion zur Identitätsreflexion kann die bestätigte Identität eines Zertifikatsanforderers das angeforderte Zertifikat aufrufen. Weitere Informationen finden Sie unter Identitätsreflexion.

Sie benötigen die folgenden IAM-Rollen:

  • Wenn Sie Zertifizierungsstellen (CAs) und CA-Pools verwalten und Zertifikate anfordern möchten, benötigen Sie die Rolle „CA Service Operation Manager“ (privateca.caManager). Weitere Informationen zu IAM-Rollen für CA Service finden Sie unter Zugriffssteuerung mit IAM.
  • Zum Verwalten von Workload Identity-Pools und -Anbietern benötigen Sie die Rolle „Workload Identity Pool Admin“ (iam.workloadIdentityPoolAdmin).
  • Zum Erstellen eines Dienstkontos benötigen Sie die Rolle „Service Account Admin“ (iam.serviceAccountAdmin).

Informationen zum Gewähren von IAM-Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten. Sie können einem Google-Konto, einem Dienstkonto, einer Google-Gruppe, einem Google Workspace-Konto oder einer Cloud Identity-Domain die erforderlichen IAM-Rollen zuweisen.

Workload Identity-Pool und Anbieter einrichten

In dieser Anleitung wird erläutert, wie Sie einen OIDC-Anbieter (Google OpenID Connect) in Kombination mit einem Dienstkonto als Identität eines Drittanbieters verwenden können. Der OIDC-Anbieter von Google-Konten fungiert als externer Identitätsanbieter (Identity Provider, IdP) und das Google Cloud-Dienstkonto ist eine beispielhafte Drittanbieteridentität, die von diesem IdP bestätigt wird.

Identitätspools von Arbeitslasten unterstützen eine Vielzahl von Identitätsanbietern, einschließlich Microsoft Azure/On-Premises Active Directory, AWS und SAML-basierte Identitätsanbieter.

So richten Sie einen Workload Identity-Pool und einen Anbieter ein: 1. Erstellen Sie einen Workload Identity-Pool, um einen vertrauenswürdigen Satz föderierter Identitäten darzustellen:

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

Replace the following:

- <var>IDENTITY_POOL_ID</var>: The unique identifier of the new workload
  identity pool.
  1. Erstellen Sie einen Workload Identity-Poolanbieter für Ihren externen Identitätsanbieter:

    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"
    

    Ersetzen Sie Folgendes:

    • PROVIDER_ID: Die eindeutige Kennung des Identitätsanbieters, den Sie im Workload Identity-Pool erstellen möchten.

    Sie können die folgenden Flags an Ihren Anwendungsfall anpassen:

    • attribute-mapping: Dieses Flag legt die Zuordnung zwischen den Anforderungen von Drittanbietern zur Google-Hauptanforderung google.subject fest. google.subject ist eine erforderliche Zuordnung, die Sie mithilfe eines CEL-Ausdrucks auf beliebige Anforderungen oder Kombinationen von Anforderungen festlegen können. Weitere Informationen finden Sie unter Attributzuordnung und Bedingung definieren.
    • issuer-uri: Für OIDC-Anbieter ist dieses Flag ein öffentlich zugänglicher Endpunkt, an den sich Google zur Überprüfung von Drittanbietertokens wendet. Weitere Informationen finden Sie unter Externen Identitätsanbieter vorbereiten.

    Weitere Informationen zum Einrichten eines Workload Identity-Anbieters finden Sie unter Workload Identity-Föderation konfigurieren.

CA-Pool und ausstellende Zertifizierungsstelle erstellen

In diesem Abschnitt wird erläutert, wie Sie einen Zertifizierungsstellenpool erstellen und ihm eine Stammzertifizierungsstelle hinzufügen. Mit diesem Zertifizierungsstellenpool können Sie identitätsreflektierte Zertifikate ausstellen. Wenn Sie einen vorhandenen CA-Pool und eine vorhandene Zertifizierungsstelle verwenden möchten, können Sie diesen Abschnitt überspringen.

Statt einer Stamm-CA können Sie auch eine untergeordnete Zertifizierungsstelle erstellen. Das Erstellen einer Stamm-CA hilft, den Vorgang zu verkürzen.

  1. Erstellen Sie einen Zertifizierungsstellenpool in der DevOps-Stufe:

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

    Ersetzen Sie Folgendes:

    • CA_POOL_ID: Die ID des CA Service-CA-Pools, der die Zertifikate ausstellt.
    • LOCATION – Der Standort des Zertifizierungsstellenpools.

    Weitere Informationen zum Erstellen von CA-Pools finden Sie unter CA-Pool erstellen.

  2. Erstellen Sie eine Stammzertifizierungsstelle:

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

    Ersetzen Sie Folgendes:

    • CA_ID: Die ID der Zertifizierungsstelle, die Zertifikate ausstellt.
    • CA_POOL_ID: Die ID des CA Service-CA-Pools, der die Zertifikate ausstellt.
    • LOCATION – Der Standort des Zertifizierungsstellenpools.

    Weitere Informationen zum Erstellen einer Root-Zertifizierungsstelle finden Sie unter Root-Zertifizierungsstelle erstellen.

  3. Aktivieren Sie aus dem Workload Identity-Pool föderierte Identitäten, um Zertifikate aus dem CA-Pool auszustellen. Für die Identitätsreflexion ist die IAM-Rolle „CA Service Workload Certificate Anforderer“ (roles/privateca.workloadCertificateRequester) für die Anforderer von CreateCertificate erforderlich.

    Sie können Hauptkonten von Workload Identity-Pools in verschiedenen Detaillierungsgraden darstellen, die von einem einzelnen Thema bis hin zu allen Identitäten im Pool anbieterübergreifend reichen. Weitere Informationen finden Sie auf dem Tab „Google Cloud CLI“ unter verfügbaren Hauptkonten oder Hauptkontensätzen für Ihren Anwendungsfall.

    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/*"
    

    Ersetzen Sie Folgendes:

    • PROJECT_NUMBER: Die Projektnummer des Projekts, in dem Sie den Workload Identity-Pool erstellt haben.

Dienstkonto erstellen, das die Identität eines Drittanbieters repräsentiert

Bei den folgenden Schritten wird davon ausgegangen, dass ein Dienstkonto einen Drittanbieter darstellt. In diesem Abschnitt wird gezeigt, wie Sie mit dem IAM-Endpunkt GenerateIdToken die Identität eines Drittanbieters in Form eines OIDC-Tokens abrufen können. Je nach Anwendungsfall müssen Sie möglicherweise verschiedene Schritte ausführen, um das Identitätstoken eines Drittanbieters Ihrer Wahl abzurufen.

gcloud iam service-accounts create SERVICE_ACCOUNT

Ersetzen Sie Folgendes:

  • SERVICE_ACCOUNT: Die ID des Dienstkontos, das die Identität des Drittanbieters darstellt.

Zertifikat zur Bestätigung der Identität eines Drittanbieters ausstellen

Prüfen Sie zuerst, ob Sie die IAM-Rolle „Service Account Token Creator“ (roles/iam.serviceAccountTokenCreator) haben. Sie benötigen diese IAM-Rolle, um die GenerateIdToken API aufzurufen.

So erhalten Sie ein Zertifikat, das die Identität eines Drittanbieters bestätigt:

  1. Fordern Sie ein externes Identitätstoken von Ihrem externen Identitätsanbieter an.

    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'])"`
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Die Google Cloud-Projekt-ID für das Projekt, in dem Sie Ressourcen erstellen möchten.

    Clientbibliotheken

    Für den programmatischen Zugriff auf das Drittanbietertoken können Sie ein Token aus dateibasierten Anmeldedaten oder aus über eine URL-Quelle abrufen. Weitere Informationen finden Sie unter Mit Clientbibliotheken, der gcloud CLI oder Terraform authentifizieren. In dieser Anleitung wird der Arbeitsablauf zur Beantragung der Dateiquelle erläutert.

    Laden Sie Ihre Anmeldedaten in einen Pfad, der für den Zertifikatanforderer lesbar ist:

    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
    

    Ersetzen Sie Folgendes:

    • PROJECT_ID: Die Projekt-ID des Projekts, in dem Sie Ressourcen erstellen möchten.
  2. Tauschen Sie das Drittanbietertoken über den STS-Endpunkt token gegen ein föderiertes OAuth-Token aus:

    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'])"`
    

    Clientbibliotheken

    1. Erstellen Sie eine Konfigurationsdatei mit dem Namen oidc_token.txt, die der Code, der das Zertifikat anfordert, lesen kann, um einen Tokenaustausch durchzuführen.
    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. Lesen Sie die Datei oidc_token.txt, um den Autorisierungsmechanismus in der Clientbibliothek festzulegen:

    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. Stellen Sie mit dem Subjektanfragemodus REFLECTED_SPIFFE eine Anfrage an CA Service:

    curl

    1. Optional: Wenn Sie keine CSR haben, erstellen Sie diese, indem Sie den folgenden Befehl ausführen.

      export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
      
    2. Fordern Sie ein Zertifikat mit der CSR, eine Lebensdauer und einen Modus für reflektierte Subjektanfrage an:

      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"}'
      

    Clientbibliotheken

    Zum Weiterleiten des eigenen Tokens an CA Service müssen Sie einen Client mit Anmeldedaten erstellen. Sie können dann mit diesem Client mit Anmeldedaten Zertifikatsanfragen stellen:

    1. Initiieren Sie einen CA Service-Client mit Anmeldedaten:

      python

      caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
      
    2. Fordern Sie ein Zertifikat an.

      Python

      Richten Sie für die Authentifizierung beim CA Service Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für eine lokale Entwicklungsumgebung einrichten.

      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. Prüfen Sie das Zertifikat. Ihr Zertifikat sollte einen Antragsteller haben, der einen einzelnen URI-SAN enthält. Das SAN, das eine Identität attestiert, hat folgendes Format:

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

      Ersetzen Sie:

      • IDENTITY_POOL_ID: Die eindeutige Kennung des Workload Identity-Pools.
      • PROJECT_NUMBER: Die Projektnummer des Projekts, in dem Sie den Workload Identity-Pool erstellt haben.

Bereinigen

Führen Sie die folgenden Vorgänge über die Google Cloud CLI aus, um zu vermeiden, dass Ihrem Google Cloud-Konto die Ressourcen des CA-Dienstes berechnet werden, die Sie nach diesem Dokument erstellt haben:

  1. Löschen Sie die von Ihnen erstellte Zertifizierungsstelle.

    1. Deaktivieren Sie die Zertifizierungsstelle:

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

      Ersetzen Sie:

      • CA_ID: Die eindeutige Kennung der Zertifizierungsstelle.
      • CA_POOL_ID: Die eindeutige Kennung des Zertifizierungsstellenpools.
      • LOCATION: Der Standort des Zertifizierungsstellenpools.
    2. Löschen Sie die Zertifizierungsstelle:

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

      Ersetzen Sie:

      • CA_ID: Die eindeutige Kennung der Zertifizierungsstelle.
      • CA_POOL_ID: Die eindeutige Kennung des Zertifizierungsstellenpools.
      • LOCATION: Der Standort des Zertifizierungsstellenpools.
  2. Löschen Sie den von Ihnen erstellten CA-Pool.

    gcloud privateca pools delete CA_POOL_ID --location LOCATION
    

    Ersetzen Sie:

    • CA_POOL_ID: Die eindeutige Kennung des Zertifizierungsstellenpools.
    • LOCATION: Der Standort des Zertifizierungsstellenpools.

    Weitere Informationen zum Befehl gcloud privateca pools delete finden Sie unter gcloud privatecapools delete.

  3. Löschen Sie den Workload Identity-Pool, den Sie erstellt haben:

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

    Ersetzen Sie:

    • IDENTITY_POOL_ID: Die eindeutige ID des Arbeitslast-Identitätspools.
  4. Löschen Sie das von Ihnen erstellte Dienstkonto:

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

    Ersetzen Sie:

    • SERVICE_ACCOUNT: Die eindeutige ID des Arbeitslast-Identitätspools.
    • PROJECT_ID: Das Projekt, zu dem das Dienstkonto gehört.

Die IAM-Rolle „CA Service Workload Certificate Requester“ (privateca.workloadCertificateRequester) beschränkt das Subjekt des ausgestellten Zertifikats auf die Identität des Anforderers. Achten Sie darauf, dass Nutzern oder Arbeitslasten, die das Feature zur Identitätsreflexion verwenden, nur die IAM-Rolle „CA Service Workload Certificate Requester“ (privateca.workloadCertificateRequester) gewährt wird. Um das Prinzip der geringsten Berechtigung zu befolgen, können Sie die IAM-Rolle „CA Service Certificate Anforderer“ (privateca.certificateRequester) vermeiden.

Nächste Schritte