Zertifikate ausstellen, die die Identität Dritter bestätigen

In dieser Anleitung wird gezeigt, wie Sie Zertifikate ausstellen können, die eine Drittanbieter-Identität Identitätsreflexion und Workload Identity-Pools.

Mit der Identitätsreflexion können Sie Zertifikate erstellen, die mit der bestätigten Identität eines Zertifikatsanfragers übereinstimmen. Mithilfe der Identitätsreflexion können Sie nicht privilegierte Zertifikate anfordern, nur Zertifikate mit einer Alternativer Antragstellername (Subject Alternative Name, SAN), der der Identität in ihrem Anmeldedaten

Lernziele

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

Hinweise

Bevor Sie beginnen, sollten Sie sich mit den folgenden Konzepten vertraut machen:

  • Workload Identity-Pools: Mit Workload Identity-Pools können Sie Identitätsanbieter. 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 Drittanbieteridentitäten Zugriff auf Google Cloud zu gewähren . Weitere Informationen finden Sie unter Workload Identity“ Föderation.
  • Security Token Service (STS): Mit dem Security Token Service können Sie Anmeldedaten von Drittanbietern für eigene (Google Cloud)-Tokens. Weitere Informationen Weitere Informationen finden Sie unter Security Token Service.
  • Identitätsreflexion: Mit der Funktion zur Reflexion der Identität können bestätigte der Identität des Anforderers wird zum angeforderten Zertifikat weitergeleitet. Weitere Informationen finden Sie unter Identitätsreflexion.

Sie benötigen die folgenden IAM-Funktionen: Rollen:

  • 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 CA Service finden Sie unter Zugriffssteuerung mit IAM
  • Zum Verwalten von Workload Identity-Pools und -Anbietern benötigen Sie Folgendes: Rolle „Workload Identity Pool Admin“ (iam.workloadIdentityPoolAdmin).
  • Zum Erstellen eines Dienstkontos benötigen Sie den Dienstkontoadministrator Rolle (iam.serviceAccountAdmin).

Informationen zum Gewähren von IAM-Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen. Sie können dem erforderliche IAM-Rollen für ein Google-Konto, ein Dienstkonto, Google-Gruppe, ein Google Workspace-Konto oder eine Cloud Identity-Domain.

Workload Identity-Pool und -Anbieter einrichten

In dieser Anleitung wird erläutert, wie Sie Google OpenID Connect (OIDC) verwenden. mit einem Dienstkonto kombiniert, um als Identität eines Drittanbieters zu fungieren. Die Der OIDC-Anbieter für Google-Konten agiert als externer Identitätsanbieter (Identity Provider, IdP) und Das Google Cloud-Dienstkonto ist eine Beispielidentität eines Drittanbieters, die von diesem IdP beansprucht wird.

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

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

```
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. Anbieter von Workload Identity-Pools für Ihre Drittanbieteridentität erstellen Anbieter:

    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 der Ansprüche auf die Hauptanforderung von Google, google.subject. google.subject ist eine erforderliche Zuordnung, die du für beliebige Ansprüche oder Kombinationen aus Ansprüche mit einer CEL Ausdruck. Weitere Informationen finden Sie unter Attributzuordnung definieren und Bedingung ab.
    • issuer-uri: Bei OIDC-Anbietern ist dieses Flag ein öffentlich zugänglicher Endpunkt, an den sich Google zur Überprüfung durch Drittanbieter wendet Tokens. Weitere Informationen finden Sie unter Externe Identität vorbereiten Dienstanbieter.

    Weitere Informationen zum Einrichten einer Workload Identity finden Sie unter Workload Identity konfigurieren Föderation.

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 eine identitätsreflektierte Ausgabe auszugeben Zertifikate. Wenn Sie einen vorhandenen CA-Pool und eine vorhandene Zertifizierungsstelle verwenden möchten, können Sie diesen Abschnitt überspringen.

Anstelle einer Stamm-CA können Sie auch eine untergeordnete Zertifizierungsstelle erstellen. Wird erstellt... eine Stammzertifizierungsstelle verkürzt den Vorgang.

  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-Dienst-Zertifizierungspools, der Zertifikate ausgibt.
    • LOCATION – Der Standort des Zertifizierungsstellenpools.

    Weitere Informationen zum Erstellen von CA-Pools finden Sie unter Erstellen Sie einen Zertifizierungsstellenpool.

  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-Dienst-Zertifizierungspools, der Zertifikate ausgibt.
    • LOCATION – Der Standort des Zertifizierungsstellenpools.

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

  3. Aktivieren Sie Identitäten, die aus dem Workload Identity-Pool föderiert werden, um sie auszugeben Zertifikate aus dem CA-Pool. Die Identitätsreflexion erfordert die Anforderer von CA Service-Arbeitslastzertifikaten (roles/privateca.workloadCertificateRequester) IAM-Rolle für Anforderer von CreateCertificate

    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 in den verfügbaren Hauptkonten oder Hauptkontogruppen (Tab „Google Cloud CLI“), die am besten zu Ihrem Anwendungsfall passen.

    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.

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

Bei der folgenden Anleitung wird davon ausgegangen, dass ein Dienstkonto für einen Drittanbieter steht. In diesem Abschnitt wird gezeigt, wie Sie den GenerateIdToken IAM-Endpunkt zum Abrufen einer Drittanbieteridentität in der Form Ein OIDC-Token. Je nach Anwendungsfall müssen Sie möglicherweise unterschiedliche Schritte ausführen, Drittanbieter-Identitätstoken Ihrer Wahl abrufen.

gcloud iam service-accounts create SERVICE_ACCOUNT

Ersetzen Sie Folgendes:

  • SERVICE_ACCOUNT – Die ID des Dienstkontos, das den Identität von Drittanbietern.

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

Sie benötigen den Ersteller von Dienstkonto-Tokens, bevor Sie beginnen (roles/iam.serviceAccountTokenCreator) IAM-Rolle. Das brauchst du IAM-Rolle zum Aufrufen der GenerateIdToken API.

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

  1. Fordern Sie ein Drittanbieter-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, das Sie erstellen Ressourcen erstellen möchten.

    Clientbibliotheken

    .

    Für den programmatischen Zugriff auf das Drittanbieter-Token können Sie ein Token von einem dateibasierte Anmeldedaten oder URL-basierte Anmeldedaten. Weitere Informationen Siehe Mit Clientbibliotheken, der gcloud CLI authentifizieren, oder Terraform. In dieser Anleitung folgen wir dem Workflow für Anmeldedaten aus Dateiquellen.

    Laden Sie Ihre Anmeldedaten in einen Pfad, der für Ihr Zertifikat lesbar ist Antragsteller:

    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, Ressourcen erstellen möchten.
  2. Drittanbietertoken mithilfe von STS gegen ein föderiertes OAuth-Token austauschen Endpunkt 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'])"`
    

    Clientbibliotheken

    1. Anmeldedaten erstellen Konfigurationsdatei namens oidc_token.txt, die das Zertifikat anfragenden Code auslesen 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. Die Datei oidc_token.txt lesen, um den Autorisierungsmechanismus im Client festzulegen Bibliothek:

    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. Senden Sie mit dem Modus für Betreffanfrage in REFLECTED_SPIFFE:

    curl

    1. Optional: Wenn Sie keine CSR haben, erstellen Sie eine CSR, indem Sie den folgenden Befehl.

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

      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. Anschließend können Sie diesen Client mit Anmeldedaten , um Zertifikatsanfragen zu stellen:

    1. Initiieren Sie einen berechtigten CA Service-Client:

      Python

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

      Python

      Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei CA Service zu authentifizieren. 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. Bestätigen Sie das Zertifikat. Ihr Zertifikat sollte einen Betreff haben mit einem einzelnen URI-SAN. Der SAN, der eine Identität bestätigt, im folgenden 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-Pool.
      • PROJECT_NUMBER: die Projektnummer des Projekts, in dem Sie den Workload Identity-Pool erstellt haben.

Bereinigen

Um zu vermeiden, dass Ihrem Google Cloud-Konto Gebühren für CA Service-Ressourcen, die Sie im Anschluss an dieses Dokument erstellt haben, führen Sie folgende Vorgänge mit der Google Cloud CLI ausführen:

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

    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 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 Kennzeichnung der Arbeitslast Identitätspool.
  4. Löschen Sie das erstellte Dienstkonto:

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

    Ersetzen Sie:

    • SERVICE_ACCOUNT: Die eindeutige Kennzeichnung der Arbeitslast Identitätspool.
    • PROJECT_ID: Das Projekt, zu dem das Dienstkonto gehört.

Die CA Service-Arbeitslast Zertifikatsanforderer (privateca.workloadCertificateRequester) Die IAM-Rolle beschränkt das Subjekt des ausgestellten Zertifikats auf die Identität des Antragstellers. Achten Sie darauf, dass Nutzer oder Arbeitslasten, die die Identität verwenden, Reflexionsfunktion wird nur dem CA Service gewährt Anforderer von Arbeitslastzertifikaten (privateca.workloadCertificateRequester) IAM-Rolle Um sich an das Prinzip der geringsten Berechtigung zu halten, können Sie es dem Anforderer für CA Service-Zertifikate nicht (privateca.certificateRequester) IAM-Rolle.

Nächste Schritte