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

In dieser Anleitung wird gezeigt, wie Sie mit Identitätsspiegelung und Workload Identity-PoolsZertifikate ausstellen können, die die Identität eines Drittanbieters bestätigen.

Mit der Identitätsspiegelung können Sie Zertifikate erstellen, die der bestätigten Identität eines Zertifikatsanfragestellers entsprechen. Mit der Identitätsspiegelung können Sie einen Zertifikatsanfragesteller ohne Berechtigungen so einschränken, dass er nur Zertifikate mit einem alternativen Antragstellernamen (Subject Alternative Name, SAN) anfordern kann, der der Identität in seinen Anmeldedaten entspricht.

Ziele

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

Hinweis

Bevor Sie beginnen, sollten Sie die folgenden Konzepte kennen:

  • 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.
  • Workload Identity-Föderation: Bei der Workload Identity-Föderation werden Workload Identity-Pools verwendet, um Identitäten von Drittanbietern Zugriff auf Google Cloud Dienste 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 gegen Erstanbieter-Tokens (Google Cloud) austauschen. Weitere Informationen finden Sie unter Security Token Service.
  • Identitätsspiegelung: Mit der Funktion zur Identitätsspiegelung wird die bestätigte Identität eines Zertifikatsanfragestellers in das angeforderte Zertifikat übernommen. Weitere Informationen finden Sie unter Identitätsspiegelung.

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

  • Zum Verwalten von Zertifizierungsstellen (CAs) und CA-Pools sowie zum Anfordern von Zertifikaten 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 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 erklärt, wie Sie einen Google OpenID Connect-Anbieter (OIDC) in Kombination mit einem Dienstkonto verwenden können, um als Identität eines Drittanbieters zu fungieren. Der OIDC-Anbieter für Google-Konten fungiert als Identitätsanbieter (IDP) eines Drittanbieters 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 föderierter Identitäten darzustellen:

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

    Ersetzen Sie Folgendes:

    • IDENTITY_POOL_ID: Die eindeutige ID des neuen Workload Identity-Pools
  2. Erstellen Sie einen Workload Identity-Pool-Anbieter für Ihren Identitätsanbieter eines Drittanbieters:

    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 ID 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 Ansprüchen des Drittanbieters und dem Anspruch des Google-Hauptkontos google.subject festgelegt. google.subject ist eine erforderliche Zuordnung, die Sie mit einem CEL Ausdruck 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, an den sich Google wendet, um Tokens von Drittanbietern zu überprüfen. Weitere Informationen finden Sie unter Externen Identitäts anbieter 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 erklärt, wie Sie einen CA-Pool erstellen und eine Root-CA hinzufügen. Mit diesem CA-Pool können Sie Zertifikate mit Identitätsspiegelung ausstellen. Wenn Sie einen vorhandenen CA-Pool und eine vorhandene CA verwenden möchten, können Sie diesen Abschnitt überspringen.

Anstelle einer Root-CA können Sie auch eine untergeordnete CA erstellen. Das Erstellen einer Root-CA verkürzt den Vorgang.

  1. 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 von 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 Root-CA:

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

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

  3. Aktivieren Sie die Ausstellung von Zertifikaten aus dem CA-Pool für Identitäten, die aus dem Workload Identity-Pool föderiert 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 Antragsteller bis hin zu allen Identitäten im Pool über alle Anbieter hinweg. Weitere Informationen finden Sie unter den verfügbaren Hauptkonten oder Hauptkontogruppen (verwenden Sie den 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:

    • CA_POOL_ID: Die ID des CA-Pools von CA Service, der Zertifikate ausstellt
    • LOCATION: Der Standort des CA-Pools
    • PROJECT_NUMBER: Die Projektnummer des Projekts, in dem Sie den Workload Identity-Pool erstellt haben
    • IDENTITY_POOL_ID: Die eindeutige ID des neuen Workload Identity-Pools

Dienstkonto erstellen, das eine Identität eines Drittanbieters darstellt

Bei der folgenden Vorgehensweise wird davon ausgegangen, dass ein Dienstkonto einen Drittanbieter darstellt. In diesem Abschnitt wird gezeigt, wie Sie den GenerateIdToken IAM-Endpunkt verwenden können, um eine Identität eines Drittanbieters in Form eines OIDC-Tokens abzurufen. Je nach Anwendungsfall sind möglicherweise andere Schritte erforderlich, um das gewünschte Token für die Identität 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 ausstellen, das die Identität eines Drittanbieters bestätigt

Prüfen Sie, ob Sie die IAM-Rolle „Ersteller des OpenID Connect-Identitätstokens für das Dienstkonto“ (roles/iam.serviceAccountOpenIdTokenCreator) 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 Token für die Identität eines Drittanbieters von Ihrem Identitätsanbieter eines Drittanbieters 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

    Um programmatisch auf das Token des Drittanbieters zuzugreifen, können Sie ein Token aus dateibasierten oder URL-basierten Anmeldedaten abrufen. Weitere Informationen finden Sie unter Authentifizierung mit Clientbibliotheken, der gcloud CLI, oder Terraform durchführen. In dieser Anleitung folgen wir einem Workflow mit dateibasierten Anmeldedaten.

    Laden Sie Ihre Anmeldedaten in einen Pfad, der vom 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 Token des Drittanbieters mit dem 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 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. Senden Sie eine Anfrage an CA Service mit dem REFLECTED_SPIFFE Anfragemodus für das Subject:

    curl

    1. Optional: Wenn Sie keine CSR-Anfrage haben, erstellen Sie eine, 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-Anfrage, einer Gültigkeitsdauer und einem Anfragemodus für das gespiegelte Subject 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

    Um das Erstanbieter-Token an CA Service weiterzuleiten, müssen Sie einen Client mit Anmeldedaten erstellen. Mit diesem Client mit Anmeldedaten können Sie dann 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 zur Authentifizierung bei CA Service die Standardanmeldedaten für Anwendungen (ADC) 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 ein Subject mit einem einzelnen URI-SAN haben. Das SAN, das 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 ID 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 in dieser Anleitung erstellten CA Service-Ressourcen in Rechnung gestellt werden. Führen Sie dazu die folgenden Vorgänge mit der Google Cloud CLI aus:

  1. Löschen Sie die 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 ID der CA
      • CA_POOL_ID: Die eindeutige ID 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 ID der CA
      • CA_POOL_ID: Die eindeutige ID des CA-Pools
      • LOCATION: Der Standort des CA-Pools
  2. Löschen Sie den erstellten CA-Pool.

    gcloud privateca pools delete CA_POOL_ID --location LOCATION
    

    Ersetzen Sie:

    • CA_POOL_ID: Die eindeutige ID 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 ID des Workload Identity-Pools
  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 ID 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 Subject des ausgestellten Zertifikats auf die Identität des Anfragestellers. 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 dem Prinzip der geringsten Berechtigung zu entsprechen, können Sie die IAM-Rolle „CA Service-Zertifikatsanfragesteller“ (privateca.certificateRequester) nicht zuweisen.

Nächste Schritte