Wenn Sie eine Google-Dienstkonto-Schlüsseldatei für ein externes System erstellen, muss der private Schlüssel
transportiert werden. Außerdem ist der erzeugte Schlüssel bis zum 1. Januar
des Jahres 10000 gültig. In diesem Blog zeige ich Ihnen, wie sich ein externes System als
Dienstkonto ausweisen kann, ohne den privaten Schlüssel preiszugeben.
Warum sind die Schlüsseldateien für das Google-Servicekonto ein Problem?
Für die meisten Anwendungen, die auf Google Cloud Platform laufen, ist es nicht erforderlich, eine
Datei herunterzuladen: Die Laufzeitumgebung stellt Ihrer Anwendung temporäre Anmeldeinformationen zur Verfügung. Leider haben die externen Systeme von
diesen Luxus nicht. Warum sind Dienstkontenschlüssel also ein Problem? Sehen Sie sich einen an:
{
"type": "service_account",
"project_id": "demo-project",
"private_key_id": "f871b60d0617be19393bb66ea142887fc9621360",
"private_key": "-----BEGIN RSA PRIVATE KEY-----.....",
"client_email": "look-no-keys@demo-project.iam.gserviceaccount.com",
"client_id": "102234449335144000000",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/look-no-keys%40demo-project.iam.gserviceaccount.com"
}
Wie Sie sehen können, befindet sich dort ein privater RSA-Schlüssel im Klartext! Und wenn der Schlüssel
kompromittiert wird, ist er bis zum 1. Januar des Jahres 10000 gültig.
Erstellen Sie Ihre eigene private Schlüsseldatei für Ihr Google-Servicekonto
Wenn Sie sich eine Schlüsseldatei für ein Google-Servicekonto ansehen, finden Sie die folgenden variablen Teile:
Daraus geht hervor, dass Sie, wenn Sie über einen privaten RSA-Schlüssel verfügen, eine Schlüsseldatei
erstellen und den öffentlichen Schlüssel mit einem beliebigen Dienstkonto verknüpfen können, indem Sie den Befehl
key upload verwenden. Um dies zu tun, müssen Sie:
- Erstellen Sie ein Dienstkonto
- Binden Sie eine Rolle an sie
- Einen privaten Schlüssel generieren
- Erstellen Sie ein selbstsigniertes Zertifikat
- Laden Sie den öffentlichen Schlüssel hoch
- Erzeugen Sie die Schlüsseldatei für das Dienstkonto Danach können Sie die Schlüsseldatei verwenden, um sich als Dienstkonto zu identifizieren!
Erstellen Sie ein Dienstkonto
Um unser Demo-Servicekonto zu erstellen, geben Sie ein:
gcloud iam service-accounts create look-no-keys
PROJECT_ID=$(gcloud config get-value project)
CLIENT_EMAIL=look-no-keys@${PROJECT_ID}.iam.gserviceaccount.com
CLIENT_ID=$(gcloud iam service-accounts \
describe $CLIENT_EMAIL \
--format 'value(uniqueId)')
Eine Rolle binden
Um eine Rolle an das Dienstkonto zu binden, geben Sie ein:
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member "serviceAccount:$CLIENT_EMAIL" \
--role roles/viewer
Zu Demonstrationszwecken haben wir die Rolle des Projektbetrachters gewählt.
Einen privaten Schlüssel generieren
Um Ihren eigenen privaten Schlüssel zu erzeugen, geben Sie ein:
PRIVATE_KEY=$(openssl genrsa 4096)
Natürlich können Sie auch einen vorhandenen privaten Schlüssel auf Ihrem System verwenden.
Erstellen Sie ein selbstsigniertes Zertifikat
Um ein selbstsigniertes X509-Zertifikat mit Ihrem eigenen privaten Schlüssel zu erstellen, geben Sie ein:
openssl req -x509 -new \
-key - \
-subj /CN=markvanholsteijn@binx.io \
-out csr.pem <<< $PRIVATE_KEY
openssl x509 \
-in csr.pem \
-signkey - \
-days 365 \
-out certificate.pem <<< $PRIVATE_KEY
Das Zertifikat enthält sowohl Informationen über den Betreff als auch den öffentlichen Schlüssel.
Laden Sie den öffentlichen Schlüssel hoch
Um diesen öffentlichen Schlüssel in das Dienstkonto hochzuladen, geben Sie ein:
gcloud iam service-accounts keys \
upload certificate.pem \
--iam-account $CLIENT_EMAIL \
--format json > uploaded.json
PRIVATE_KEY_ID=$(jq -r .name uploaded.json | \
awk -F/ '{print $NF}')
Ich sollte in der Lage sein, die Schlüssel-ID aus der certificate.pem zu berechnen, aber ich habe nicht herausgefunden, welchen
Algorithmus Google verwendet.
die Schlüsseldatei für das Google-Servicekonto erzeugen
Um die Schlüsseldatei für das Google-Dienstkonto zu erstellen, geben Sie ein:
touch look-no-keys.json
chmod 0600 look-no-keys.json
jq -n \
--arg PRIVATE_KEY "$PRIVATE_KEY" \
--arg PROJECT_ID $PROJECT_ID \
--arg CLIENT_EMAIL $CLIENT_EMAIL \
--arg CLIENT_ID $CLIENT_ID \
--arg PRIVATE_KEY_ID $PRIVATE_KEY_ID \
'{
"type": "service_account",
"project_id": $PROJECT_ID,
"private_key_id": $PRIVATE_KEY_ID,
"private_key": $PRIVATE_KEY,
"client_email": $CLIENT_EMAIL,
"client_id": $CLIENT_ID,
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": @uri "https://www.googleapis.com/robot/v1/metadata/x509/\($CLIENT_EMAIL)"
}' > look-no-keys.json
In dieser Demonstration kopieren wir den privaten Schlüssel in die Datei
Authentifizieren Sie sich mit Ihrem privaten Schlüssel
Um sich mit Ihrem eigenen privaten Schlüssel zu authentifizieren, geben Sie ein:
gcloud auth activate-service-account \
--key-file look-no-keys.json
Jetzt können Sie die Projektressourcen anzeigen, aber nichts ändern:
$ gcloud compute instances list
Listed 0 items.
$ gcloud compute instances create demo1
ERROR (gcloud.compute.instances.create) Could not fetch resource:
- Required 'compute.instances.create' permission
Fazit
In diesem Blog habe ich gezeigt, dass sich ein externes System mit seinem eigenen privaten RSA-Schlüssel authentifizieren kann.
Der Schlüssel muss nicht transportiert werden, und die Lebensdauer des öffentlichen Schlüssels kann auf einen Zeitraum
Ihrer Wahl begrenzt werden. Dieses Wissen kann genutzt werden, um die Daten des privaten Schlüssels aus der Terraform-Statusdatei herauszuhalten oder
um Ihre Anmeldedaten programmatisch mit einem vorhandenen privaten Schlüssel zu erstellen.
Bild von Steve Buissinne aus Pixabay
Verfasst von

Mark van Holsteijn
Mark van Holsteijn is a senior software systems architect at Xebia Cloud-native solutions. He is passionate about removing waste in the software delivery process and keeping things clear and simple.
Contact