Zertifikate ausstellen, die die Identität von Drittanbietern bestätigen

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

Mit der Identitätsspiegelung können Sie Zertifikate erstellen, die der bestätigten Identität eines Zertifikatsanforderers entsprechen. Mit der Identitätsspiegelung können Sie einen Zertifikatsanforderer ohne Berechtigungen darauf beschränken, nur Zertifikate mit einem alternativen Antragstellernamen (Subject Alternative Name, SAN) anzufordern, der der Identität in seinem Anmeldedaten entspricht.

Lernziele

In dieser Anleitung erfahren Sie, wie Sie den CA Service mit Workload Identity-Pools verwenden können, um eine Drittanbieteridentität zu föderieren und ein Zertifikat zu erhalten, das diese Identität bestätigt.

Hinweise

Machen Sie sich vor dem Lesen dieser Seite mit den folgenden Konzepten vertraut:

  • Workload Identity-Pools: Mit Workload Identity-Pools können Sie Drittanbieter-Identitätsanbieter 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 Pools von Arbeitslastidentitäten verwendet, um Drittanbieteridentitäten 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 Drittanbieteranmeldedaten gegen Erstanbieter-Tokens (Google Cloud) eintauschen. Weitere Informationen finden Sie unter Security Token Service.
  • Identitätsspiegelung: Mit der Funktion zur Identitätsspiegelung wird die bestätigte Identität eines Zertifikatsanforderers auf das angeforderte Zertifikat übertragen. Weitere Informationen finden Sie unter Identitätsspiegelung.

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

  • 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-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 beschrieben, wie Sie einen Google OpenID Connect (OIDC)-Anbieter in Kombination mit einem Dienstkonto als Drittanbieteridentität verwenden können. Der Google-Konten-OIDC-Anbieter fungiert als Drittanbieter-Identitätsanbieter (IDP) und das Google Cloud Dienstkonto ist eine Beispielidentität eines Drittanbieters, die von diesem IDP bestätigt wird.

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

So richten Sie einen Workload Identity-Pool und -Anbieter ein: 1. Erstellen Sie einen Workload Identity-Pool, um eine vertrauenswürdige Gruppe von föderierten 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-Pool-Anbieter für Ihren Drittanbieter-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 zwischen den Drittanbieteransprüchen und dem Google-Hauptanspruch google.subject festgelegt. google.subject ist eine erforderliche Zuordnung, die Sie mithilfe eines CEL-Ausdrucks auf beliebige Ansprüche oder eine Kombination von Ansprüchen festlegen können. Weitere Informationen finden Sie unter Attributzuordnung und -bedingung definieren.
    • issuer-uri: Bei OIDC-Anbietern ist dieses Flag ein öffentlich zugänglicher Endpunkt, über den Google Drittanbieter-Tokens überprüft. 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 CA erstellen

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

Anstelle einer Stamm-CA können Sie auch eine untergeordnete CA erstellen. Wenn Sie eine Stammzertifizierungsstelle erstellen, können Sie das Verfahren verkürzen.

  1. Erstellen Sie einen CA-Pool 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-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 Ausstellung von Zertifikaten aus dem CA-Pool für Identitäten, die aus dem Workload Identity-Pool zusammengeführt wurden. Für die Identitätsspiegelung ist die IAM-Rolle „Anfragesteller des CA Service-Arbeitslastzertifikats“ (roles/privateca.workloadCertificateRequester) für die Anfragesteller von CreateCertificate erforderlich.

    Sie können Hauptkonten von Workload Identity-Pools in verschiedenen Granularitäten darstellen, von einem einzelnen Subjekt bis hin zu allen Identitäten im Pool über alle Anbieter hinweg. Weitere Informationen finden Sie unter Verfügbare Identitäten oder Identitätssätze (Tab „Google Cloud CLI“).

    gcloud privateca pools add-iam-policy-binding CA_POOL_ID \
        --location LOCATION \
        --role "roles/privateca.workloadCertificateRequester" \
        --member "group:PROJECT_ID.svc.id.goog:/allAuthenticatedUsers/"
    

    Ersetzen Sie Folgendes:

    • LOCATION: der Standort des CA-Pools
    • PROJECT_ID: die ID des Google Cloud Projekts, in dem Sie den Workload Identity-Pool erstellt haben

Dienstkonto erstellen, das eine Drittanbieteridentität darstellt

Beim folgenden Verfahren wird davon ausgegangen, dass ein Dienstkonto einen Drittanbieter repräsentiert. In diesem Abschnitt wird gezeigt, wie Sie mit dem IAM-Endpunkt GenerateIdToken eine Drittanbieteridentität in Form eines OIDC-Tokens abrufen können. Je nach Anwendungsfall sind möglicherweise unterschiedliche Schritte erforderlich, um das Drittanbieter-Identitätstoken Ihrer Wahl zu erhalten.

gcloud iam service-accounts create SERVICE_ACCOUNT

Ersetzen Sie Folgendes:

  • SERVICE_ACCOUNT: Die ID des Dienstkontos, das die Drittanbieteridentität repräsentiert.

Ein Zertifikat ausstellen, das die Identität eines Drittanbieters bestätigt

Bevor Sie beginnen, müssen Sie die IAM-Rolle „Ersteller von Dienstkonto-Tokens“ (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 Drittanbieter-Identitätstoken von Ihrem Drittanbieter-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 Drittanbieter-Token zugreifen möchten, können Sie ein Token aus Anmeldedaten abrufen, die aus einer Datei oder einer URL stammen. Weitere Informationen finden Sie unter Authentifizierung mit Clientbibliotheken, der gcloud CLI oder Terraform durchführen. In dieser Anleitung wird ein Workflow mit Anmeldedaten aus einer Datei verwendet.

    Laden Sie Ihre Anmeldedaten in einen Pfad, der von Ihrem Zertifikatanforderer 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 mit dem STS-Endpunkt token gegen ein föderiertes OAuth-Token ein:

    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 von Zertifikaten gelesen werden 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 eine Anfrage an CA Service mit dem Anfragemodus REFLECTED_SPIFFE:

    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 die reflektierte Betreffanfrage 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 CA Service weiterleiten möchten, müssen Sie einen Client mit Anmeldedaten erstellen. Sie können diesen Client mit Anmeldedaten dann verwenden, um Zertifikatsanfragen zu stellen:

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

      Python

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

      Python

      Richten Sie zur Authentifizierung beim CA Service 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. Überprüfen Sie das Zertifikat. Ihr Zertifikat sollte einen Antragsteller mit einem einzelnen URI-SAN enthalten. Der SAN, der 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

Mit den folgenden Schritten vermeiden Sie, dass Ihrem Google Cloud -Konto die CA Service-Ressourcen in Rechnung gestellt werden, die Sie gemäß dieser Anleitung erstellt haben:

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

    1. Deaktivieren Sie die CA:

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

      Ersetzen Sie:

      • CA_ID: Die eindeutige Kennung der CA.
      • CA_POOL_ID: Die eindeutige Kennung des CA-Pools.
      • LOCATION: Der Standort des CA-Pools.
    2. Löschen Sie die CA:

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

      Ersetzen Sie:

      • CA_ID: Die eindeutige Kennung der CA.
      • CA_POOL_ID: Die eindeutige Kennung des CA-Pools.
      • LOCATION: Der Standort des CA-Pools.
  2. Löschen Sie den CA-Pool, den Sie erstellt haben.

    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 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.

Die IAM-Rolle „Anfragesteller des CA Service-Arbeitslastzertifikats“ (privateca.workloadCertificateRequester) beschränkt das Subjekt des ausgestellten Zertifikats auf die Identität des Antragstellers. Achten Sie darauf, dass Nutzern oder Arbeitslasten, die die Funktion zur Identitätsspiegelung verwenden, nur die IAM-Rolle „Anfragesteller des CA Service-Arbeitslastzertifikats“ (privateca.workloadCertificateRequester) zugewiesen wird. Um das Prinzip der geringsten Berechtigung einzuhalten, können Sie die IAM-Rolle „CA Service-Zertifikatsanfragesteller“ (privateca.certificateRequester) vermeiden.

Nächste Schritte