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.
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-Hauptanforderunggoogle.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.
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.
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.
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 vonCreateCertificate
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:
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.
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
- 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
- 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'])
- Erstellen Sie eine Konfigurationsdatei mit dem Namen
Stellen Sie mit dem Subjektanfragemodus
REFLECTED_SPIFFE
eine Anfrage an CA Service:curl
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)
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:
Initiieren Sie einen CA Service-Client mit Anmeldedaten:
python
caServiceClient = privateca_v1.CertificateAuthorityServiceClient(credentials=scoped_credentials)
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.
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:
Löschen Sie die von Ihnen erstellte Zertifizierungsstelle.
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.
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.
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.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.
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
- Informationen zu den verschiedenen Richtliniensteuerelementen, mit denen Sie die Attribute des angeforderten Zertifikats über eine reflektierte Identität hinaus steuern können
- Hier erfahren Sie, wie Sie verschiedene Richtlinienkontrollen konfigurieren und verwalten.