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, die die Identität eines Drittanbieters bestätigen.

Mit der Identitätsreflexion können Sie Zertifikate erstellen, die mit der bestätigten Identität eines Zertifikatsanfragers übereinstimmen. Mit der Identitätsreflexion können Sie einen Nutzer mit keinen Berechtigungen dazu einschränken, nur Zertifikate mit einem alternativen Antragstellernamen (Subject Alternative Name, SAN) anzufordern, der der Identität in seinen Anmeldedaten entspricht.

Lernziele

In dieser Anleitung erfahren Sie, wie Sie den CA-Dienst mit Workload Identity-Pools verwenden, um eine Identität eines Drittanbieters zu föderieren und ein Zertifikat für diese Identität zu erhalten.

Hinweise

Machen Sie sich vor dem Beginn mit den folgenden Konzepten vertraut:

  • Workload Identity-Pools: Mit Workload Identity-Pools können Sie Identitätsanbieter von Drittanbietern verwalten. Weitere Informationen finden Sie unter Workload Identity-Pools und Anbieter verwalten.
  • Identitätsföderation von Arbeitslasten: Bei der Identitätsföderation von Arbeitslasten werden Arbeitslastidentitätspools verwendet, 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 Identitätsreflexionsfunktion kann die bestätigte Identität eines Zertifikatsanfragers an das angeforderte Zertifikat weitergegeben werden. Weitere Informationen finden Sie unter Identitätsreflexion.

Prüfen Sie, ob Sie die folgenden IAM-Rollen haben:

  • Wenn Sie Zertifizierungsstellen (Certificate Authorities, 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 den CA-Dienst finden Sie unter Zugriffssteuerung mit IAM.
  • Wenn Sie Workload Identity-Pools und ‑Anbieter verwalten möchten, benötigen Sie die Rolle „Workload Identity-Pooladministrator“ (iam.workloadIdentityPoolAdmin).
  • Zum Erstellen eines Dienstkontos benötigen Sie die Rolle „Dienstkontoadministrator“ (iam.serviceAccountAdmin).

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

Workload Identity-Pool und -Anbieter einrichten

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

Workload Identity-Pools unterstützen eine Vielzahl von Identitätsanbietern, darunter Microsoft Azure/On-Premises Active Directory, AWS und SAML-basierte Identitätsanbieter.

So richten Sie einen Workload Identity-Pool und -Anbieter ein: 1. Wenn Sie eine vertrauenswürdige Gruppe von föderierten Identitäten darstellen möchten, erstellen Sie einen Workload Identity-Pool:

```
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. So erstellen Sie einen Workload Identity Pool-Anbieter für Ihren 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: Mit diesem Flag wird die Zuordnung der Ansprüche von Drittanbietern zum Hauptanspruch von Google, google.subject, festgelegt. google.subject ist eine erforderliche Zuordnung, die Sie mit einem CEL auf beliebige Ansprüche oder eine Kombination von Ansprüchen 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 Google zur Überprüfung von Drittanbieter-Tokens sendet. 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 beschrieben, wie Sie einen CA-Pool erstellen und ihm eine Stamm-CA hinzufügen. Sie können diesen Zertifizierungsstellenpool verwenden, um Identitäts-Zertifikate auszustellen. Wenn Sie einen vorhandenen CA-Pool und eine vorhandene Zertifizierungsstelle verwenden möchten, können Sie diesen Abschnitt überspringen.

Anstatt einer Stamm-CA können Sie auch eine untergeordnete Zertifizierungsstelle erstellen. Das Erstellen einer Stammzertifizierungsstelle verkürzt den Vorgang.

  1. So erstellen Sie einen CA-Pool in der DevOps-Ebene:

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

    Ersetzen Sie Folgendes:

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

    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-Pools des CA Service, der Zertifikate ausstellt.
    • LOCATION: Der Standort des CA-Pools.

    Weitere Informationen zum Erstellen einer Stamm-CA finden Sie unter Stamm-CA erstellen.

  3. Aktivieren Sie die Ausgabe von Zertifikaten aus dem CA-Pool durch Identitäten, die über den Workload Identity-Pool föderiert wurden. Für die Identitätsreflexion ist die IAM-Rolle „Anfragesteller des CA Service-Arbeitslastzertifikats“ (roles/privateca.workloadCertificateRequester) für die Antragsteller von CreateCertificate erforderlich.

    Sie können Workload Identity-Pool-Hauptkonten in verschiedenen Detailebenen darstellen, von einem einzelnen Subjekt bis hin zu allen Identitäten im Pool über alle Anbieter hinweg. Weitere Informationen finden Sie unter Verfügbare Hauptrollen oder Hauptrollengruppen (Tab „Google Cloud CLI“), die für Ihren Anwendungsfall am besten geeignet sind.

    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 eine Drittanbieteridentität darstellt

Bei der folgenden Anleitung wird davon ausgegangen, dass ein Dienstkonto für einen Drittanbieter steht. In diesem Abschnitt wird beschrieben, wie Sie mit dem IAM-Endpunkt GenerateIdToken eine Drittanbieteridentität in Form eines OIDC-Tokens abrufen. Je nach Anwendungsfall sind möglicherweise unterschiedliche Schritte erforderlich, um das gewünschte Identitätstoken eines Drittanbieters zu erhalten.

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

Bevor Sie beginnen, müssen Sie die IAM-Rolle „Dienstkonto-Token-Ersteller“ (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. Rufen Sie ein Identitätstoken von Ihrem externen Identitätsanbieter ab.

    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 des Projekts, in dem Sie Ressourcen erstellen möchten.

    Clientbibliotheken

    .

    Wenn Sie programmatisch auf das Drittanbietertoken zugreifen möchten, können Sie ein Token aus Anmeldedaten mit Dateiquelle oder URL-Quelle abrufen. Weitere Informationen finden Sie unter Authentifizierung mit Clientbibliotheken, dem gcloud CLI oder Terraform durchführen. In dieser Anleitung wird ein Workflow für Anmeldedaten für Dateiquellen verwendet.

    Laden Sie Ihre Anmeldedaten in einen Pfad, der von Ihrem Zertifikatsanfragesteller gelesen werden kann:

    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 Ihr Drittanbieter-Token über den STS-token-Endpunkt 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 für Anmeldedaten mit dem Namen oidc_token.txt, die vom Code zum Anfordern des Zertifikats gelesen werden kann, um einen Token-Austausch 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. Lies 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 eine Anfrage an den CA-Dienst mit dem Anfragemodus für das REFLECTED_SPIFFE-Subjekt:

    curl

    1. Optional: Wenn Sie kein CSR haben, erstellen Sie eines mit dem folgenden Befehl.

      export TUTORIAL_CSR=$(openssl req -newkey rsa:2048 -nodes -subj / -keyout tutorial_do_not_use.key)
      
    2. Fordern Sie ein Zertifikat mit dem CSR, einer Gültigkeitsdauer und einem Modus für Anfragen mit zurückgespiegeltem Subjekt 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

    Wenn Sie das selbst erhobene Token an den CA-Dienst weiterleiten möchten, müssen Sie einen Client mit Anmeldedaten erstellen. Sie können dann mit diesem berechtigten Client Zertifikatsanfragen stellen:

    1. Einen berechtigten CA Service-Client starten:

      Python

      caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
      
    2. Zertifikat anfordern

      Python

      Richten Sie zur Authentifizierung beim CA-Dienst die 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. Das Zertifikat muss einen Antragsteller mit einem einzelnen URI-SAN enthalten. Die SAN, die eine Identität bestätigt, hat das folgende 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

Damit Ihrem Google Cloud-Konto keine Kosten für die CA-Dienstressourcen in Rechnung gestellt werden, die Sie anhand dieses Dokuments erstellt haben, führen Sie die folgenden Schritte mit der Google Cloud CLI aus:

  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 CA-Pools.
      • LOCATION: Der Standort des CA-Pools.
    2. So 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 CA-Pools.
      • LOCATION: Der Standort des CA-Pools.
  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 CA-Pools.
    • LOCATION: Der Standort des CA-Pools.

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

  3. Löschen Sie den von Ihnen erstellten Workload Identity-Pool:

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

    Ersetzen Sie:

    • IDENTITY_POOL_ID: Die eindeutige Kennung des Workload Identity-Pools.
  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 Kennung des Workload Identity-Pools.
    • PROJECT_ID: Das Projekt, zu dem das Dienstkonto gehört.

Mit der IAM-Rolle „Anfragesteller des CA Service-Arbeitslastzertifikats“ (privateca.workloadCertificateRequester) wird das Subject des ausgestellten Zertifikats auf die Identität des Antragstellers beschränkt. Achten Sie darauf, dass Nutzern oder Arbeitslasten, die die Identitätsreflexion verwenden, nur die IAM-Rolle „Anfragesteller des CA Service-Arbeitslastzertifikats“ (privateca.workloadCertificateRequester) zugewiesen ist. Um dem Prinzip der geringsten Berechtigung zu folgen, sollten Sie dem Dienstkonto nicht die IAM-Rolle „CA Service-Zertifikatsanfragesteller“ (privateca.certificateRequester) zuweisen.

Nächste Schritte