Mit dem Befehl gcloud compute reset-windows-password
können Nutzer, die Schreibzugriff auf das Compute Engine-Projekt haben, Passwörter für Konten auf Windows-Instanzen sicher abrufen.
Der Befehl führt dies durch, indem ein Nutzername und ein öffentlicher RSA-Schlüssel an die Instanz gesendet werden. Der Agent, der auf der Instanz ausgeführt wird, führt dann einen der folgenden Schritte aus:
- Er erstellt für diesen Nutzernamen ein Konto auf der Instanz und generiert ein zufälliges Passwort.
- Er setzt das Passwort auf einen zufälligen Wert zurück, wenn das Konto bereits existiert.
Der Agent, der auf der Instanz ausgeführt, verschlüsselt das Passwort mit dem bereitgestellten öffentlichen Schlüssel und sendet es an den Client zurück, der es mit dem entsprechenden privaten Schlüssel wieder entschlüsselt.
In diesem Abschnitt wird beschrieben, wie der Vorgang funktioniert, und es werden einige Beispiele gegeben, die diese Schritte programmatisch nachvollziehen. Wenn Sie diese Schritte manuell ausführen möchten, lesen Sie die Anleitung für die manuelle Vorgehensweise weiter unten.
Hinweise
- Erstellen Sie eine Windows-Instanz.
-
Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben.
Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft.
Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich bei Compute Engine authentifizieren.
Select the tab for how you plan to use the samples on this page:
Console
When you use the Google Cloud console to access Google Cloud services and APIs, you don't need to set up authentication.
gcloud
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
Generieren Sie ein 2048-Bit-RSA-Schlüsselpaar. In OpenSSL generieren Sie dieses Schlüsselpaar mit folgendem Befehl:
$ openssl genrsa -out private_key 2048
Dies generiert eine private Schlüsseldatei mit dem Namen private_key, deren Inhalt so aussieht:
$ cat private_key -----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEAwgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1vCQVQAkBwnWigcC qOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPqnDIM2qiK36up3SKkYwFjff6F2ni/ ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naOvJXfY5v0hGPWqCADao +xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDRnmJ GQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystu FsJnrrhbNXJbpSjM6sjo/aduAkZJl4FmOt0R7QIDAQABAoIBAQCsT6hHc/tg9iIC H5pUiRI55Uj+R5JwVGKkXwl8Qdy8V1MpTOJivpuLsiMGf+sL51xO/CzRsiBOfdYz bgaTW9vZimR5w5NW3iTAV2Ps+y2zk9KfV/y3/0nzvUSG70OXgBGj+7GhaBQZwS5Z 5HZOsOYMAV1QSIv8Uu2FQAK1xuOA4seJ/NK42iXgVB1XvYe2AxCWNqCBJylk9F5N 8a213oJWw2mwQWCSfZhuvwYRO7w/V+mInKPkKlWvf3SLuMCWeDI8s0jLsJMQ0rbp jYXRzc2G+LF1aLxjatiGeLsqfVYerNohufGAajpNkSvcMciDXvD9aJhZqior+x2Q rCnMuNRNAoGBAPI6r32wIf8H9GmcvGrXk9OYLq0uJGqAtJDgGmJM5BSX4mlSz+Ni SYlQOfi24ykQDo3XbA59Lb6H0L64czi2a3OmpG8s6h4ymp+3cSd1k1AER1oZudwH 9UScGfSgT/nMgufBwEGlQkCMp5x4Sl20clCHZ49p9eNiXML3wxpCZPIjAoGBAM0T NKt/rjqMs0qOWAJKemSPk0zV+1RSjCoOdKC6jmHRGr/MIoKiJLIkywV2m53yv8Wu BF3gVUDlwojoOKcVR8588tek5L0j9RshGovKj4Uxz9uPPhzeNnlSA+5PS284VtKz LX8xZ/b+MNCyor9jT0qoWylqym0w+M4aFL2tUQSvAoGABJvnQO38B51AIk5QK3xE nM8VfEgXe0tNpEAPYHV0FYw6S6S+veXd3lX/dGMOeXaLwFkr/i6Vkz2EVEywLJEU BFRUZqUlI0P1OzrDVWvgTLJ4JRe+OJiSKycJO2VdgDRK/Vvra5RYaWADxG9pgtTv I+cfqlPq0NPLTg5m0PYYc58CgYBpGt/SygTNA1Hc82mN+wgRxDhVmBJRHGG0KGaD /jl9TsOr638AfwPZvdvD+A83+7NoKJEaYCCxu1BiBMsMb263GPkJpvyJKAW2mtfV L8MxG9+Rgy/tccJvmaZkHIXoAfMV2DmISBUl1Q/F1thsyQRZmkHmz1Hidsf+MgXR VSQCBwKBgQCxwJtGZGPdQbDXcZZtL0yJJIbdt5Q/TrW0es17IPAoze+E6zFg9mo7 ea9AuGxOGDQwO9n5DBn/3XcSjRnhvXaW60Taz6ZC60Zh/s6IilCmav+n9ewFHJ3o AglSJZRJ1Eer0m5m6s2FW5U0Yjthxwkm3WCWS61cOOTvb6xhQ5+WSw== -----END RSA PRIVATE KEY-----
Generieren Sie einen öffentlichen Schlüssel. Einen öffentlichen Schlüssel erstellen Sie mit diesem Befehl:
$ openssl rsa -pubout -in private_key -out public_key
Hiermit wird eine Datei public_key erzeugt, die so aussieht:
$ cat public_key -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwgsquN4IBNPqIUnu+h/5 Za1kujb2YRhX1vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPq nDIM2qiK36up3SKkYwFjff6F2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswV ZmX2X67naOvJXfY5v0hGPWqCADao+xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHw x1EZ/MSgsEki6tujcZfN+GUDRnmJGQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3 DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJbpSjM6sjo/aduAkZJl4FmOt0R 7QIDAQAB -----END PUBLIC KEY-----
Extrahieren Sie den Modulus und den Exponenten. Der öffentliche und der private Schlüssel bestehen jeweils aus einem Modulus und einem Exponenten. Extrahieren Sie den Modulus und den Exponenten aus dem öffentlichen Schlüssel:
$ openssl rsa -in public_key -pubin -text -noout Public-Key: (2048 bit) Modulus: 00:c2:0b:2a:b8:de:08:04:d3:ea:21:49:ee:fa:1f: f9:65:ad:64:ba:36:f6:61:18:57:d6:f0:90:55:00: 24:07:09:d6:8a:07:02:a8:e0:55:7d:16:b9:26:86: 5f:c7:a2:88:bc:45:e3:5a:a6:bb:ee:33:ef:96:cc: 4c:e1:63:ea:9c:32:0c:da:a8:8a:df:ab:a9:dd:22: a4:63:01:63:7d:fe:85:da:78:bf:af:2f:2f:af:05: c2:5f:7b:06:67:58:5b:20:79:4a:d0:ed:35:d8:7a: 40:dc:84:9e:12:cc:15:66:65:f6:5f:ae:e7:68:eb: c9:5d:f6:39:bf:48:46:3d:6a:82:00:36:a8:fb:15: 71:ae:6c:6c:64:3e:08:5a:72:a5:d5:46:99:cc:8e: 65:84:0c:eb:f1:fc:3a:ba:d1:f0:c7:51:19:fc:c4: a0:b0:49:22:ea:db:a3:71:97:cd:f8:65:03:46:79: 89:19:04:a7:3d:35:e6:b1:fe:d0:e0:32:ab:79:36: 64:e3:d7:2e:c8:1d:e9:ad:5f:75:4b:4c:77:0d:88: c2:52:94:97:ae:45:72:d4:76:b9:5e:27:06:0f:fa: be:ca:cb:6e:16:c2:67:ae:b8:5b:35:72:5b:a5:28: cc:ea:c8:e8:fd:a7:6e:02:46:49:97:81:66:3a:dd: 11:ed Exponent: 65537 (0x10001)
Codieren Sie den Modulus und den Exponenten. Sie müssen den Modulus und den Exponenten extrahieren und Base64-codieren. Entfernen Sie das führende Nullbyte, bevor Sie den Modulus codieren. Standardmäßig ist die Datei public_key bereits ein Base64-codierter String mit folgendem Aufbau:
- 32 Byte Header-Informationen
- 1 Byte mit der führenden Null des Modulus
- 256 Bytes Modulus
- 2 Bytes Exponenten-Header
- 3 Bytes Exponent
Modulus und Exponent müssen getrennt vom Rest des Dateiinhalts extrahiert und codiert werden. Extrahieren und codieren Sie Modulus und Exponent mit folgenden Befehlen:
$ cat public_key | grep -v -- ----- | base64 -d | dd bs=1 skip=33 count=256 2>/dev/null | base64 -w 0; echo wgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsx M4WPqnDIM2qiK36up3SKkYwFjff6F2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naO vJXfY5v0hGPWqCADao+xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDR nmJGQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJb pSjM6sjo/aduAkZJl4FmOt0R7Q==
$ cat public_key | grep -v -- ----- | base64 -d | dd bs=1 skip=291 count=3 2>/dev/null | base64 AQAB
Wenn Sie bei der Codierung des Modulus auf Probleme stoßen, sorgen Sie dafür, dass das führende Nullbyte aus dem Modulus entfernt wurde, bevor Sie versuchen, ihn zu codieren.
Erstellen Sie ein JSON-Objekt mit einem Nutzernamen und Informationen zum öffentlichen Schlüssel. Erstellen Sie ein JSON-Objekt mit folgenden Daten:
userName
: Der Nutzername für die Anmeldung bei der Instanz.modulus
: Der Base64-codierte Modulus des öffentlichen Schlüssels.exponent
: Der Base64-codierte Exponent des öffentlichen Schlüssels.email
: Die E-Mail-Adresse des Nutzers, der das Passwort anfordert. Dies sollte die E-Mail-Adresse des Google-Kontos sein, das bei der API authentifiziert ist.expireOn
: Ein RFC 3399-codierter Zeitstempel, der angibt, wann der Schlüssel ablaufen soll. Diese Zeit sollte in UTC angegeben sein und etwa fünf Minuten in der Zukunft liegen. Da diese Schlüssel nur zum Erzeugen des Nutzernamens und des Passworts verwendet werden, werden sie nach Erstellung des Passworts nicht mehr benötigt. Der Agent verwendet keine Schlüssel, die verfallen sind.
Beispiel:
{\"userName\": \"example-user\", \"modulus\": \"wgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1 vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPqnDIM2qiK36up3SKkYwFjff6F 2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naOvJXfY5v0hGPWqCADao+xVxrmx sZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDRnmJGQSnPTXmsf7Q4DKreT Zk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJbpSjM6sjo/aduAkZJl 4FmOt0R7Q==\", \"exponent\": \"AQAB\", \"email\": \"example.user@example.com\", \"expireOn\": \"2015-04-14T01:37:19Z\"}
Beachten Sie, dass im JSON-String keine Zeilenumbrüche vorkommen sollten.
Fügen Sie das JSON-Objekt zu den Metadaten der Instanz hinzu. Legen Sie die Instanz-Metadaten fest. Verwenden Sie dazu den Metadatenschlüssel
windows-keys
und das JSON-Objekt als Schlüsselwert.Um Instanzmetadaten in der API aktualisieren zu können, müssen Sie bei Ihrer Anfrage einen Fingerabdruck angeben. Holen Sie sich den aktuellen Fingerabdruck der Instanz mit einer GET-Anfrage an die Instanz:
GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/test-windows-auth [..snip..] "metadata": { "kind": "compute#metadata", "fingerprint": "5sFotm8Ee0I=", "items": [ { … } [..snip]..
Senden Sie nun eine
POST
-Anfrage an die MethodesetMetadata
. Geben Sie dabei den Fingerabdruck und das erstellte JSON-Objekt an:POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/test-windows-auth/setMetadata { "fingerprint": "5sFotm8Ee0I=", "items": [ { "value": "{\"userName\": \"example-user\", \"modulus\": \"wgsquN4IBNPqIUnu+h/5Za1kujb2YRhX1vCQVQAkBwnWigcCqOBVfRa5JoZfx6KIvEXjWqa77jPvlsxM4WPqnDIM2qiK36up3SKkYwFjff6F2ni/ry8vrwXCX3sGZ1hbIHlK0O012HpA3ISeEswVZmX2X67naOvJXfY5v0hGPWqCADao+xVxrmxsZD4IWnKl1UaZzI5lhAzr8fw6utHwx1EZ/MSgsEki6tujcZfN+GUDRnmJGQSnPTXmsf7Q4DKreTZk49cuyB3prV91S0x3DYjCUpSXrkVy1Ha5XicGD/q+ystuFsJnrrhbNXJbpSjM6sjo/aduAkZJl4FmOt0R7Q==\", \"exponent\": \"AQAB\", \"email\": \"user@example.com\", \"expireOn': '2015\"04-14T01:37:19Z\"}\n", "key": "windows-keys" } ] }
Der Name des Schlüssels muss
windows-keys
sein und der Wert muss auf einen oder mehrere JSON-Strings wie der oben genannte String gesetzt sein. Mehrere Strings werden durch Zeilenumbrüche getrennt. Wenn mehrere Einträge hinzugefügt werden, sorgen Sie dafür, dass der Metadatenwert nicht länger wird als 32 KB.Lesen Sie die Ausgabe am seriellen Port Nummer 4. Der Agent auf der Instanz nimmt automatisch den Wert von
windows-keys
und erstellt ein verschlüsseltes Passwort. Das verschlüsselte Passwort erhalten Sie durch Abfrage des seriellen Ports Nummer 4. Stellen Sie in der API eineGET
-Anfrage an die MethodegetSerialPortOutput
und übergeben Sie dabeiport=4
als Suchparameter:GET https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/instances/test-windows-auth/serialPort?port=4 { "kind": "compute#serialPortOutput", "selfLink": "https://www.googleapis.com/compute/v1/projects/myproject/zones/_/instances/test-api-auth/serialPort", "contents": "{\"ready\":true,\"version\":\"Microsoft Windows NT 6.1.7601 Service Pack 1\"}\n{\"encryptedPassword\":\"uiHDEhxyvj6lF5GalH h9TsMZb4bG6Y9qGmFb9S3XI29yvVsDCLdp4IbUg21MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5TxQo9hL0lBW7o3FRM\\/UIXCeRk39ObUl2A jDmQ0mcw1byJI5v9KVJnNMaHdRCy\\/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjSbvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXr fIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==\",\"exponent\":\"AQAB\",\"modulus\":\"0tiKdO2JmBHss26jnrSAwb583KG\\/ZIw5Jw wMPXrCVsFAPwY1OV3RlT1Hp4Xvpibr7rvJbOC+f\\/Gd0cBrK5pccQfccB+OHKpbBof473zEfRbdtFwPn10RfAFj\\/xikW0r\\/XxgG\\/c8tz9bmALBStGqmwOVOLRHxjwgtG u4poeuwmFfG6TuwgCadxpllW74mviFd4LZVSuCSni5YJnBM2HSJ8NP6g1fqI17KDXt2XO\\/7kSItubmMk+HGEXdH4qiugHYewaIf1o4XSQROC8xlRl7t\\/RaD4U58hKYkVwg0 Ir7WzYzAVpG2UR4Co\\/GDG9Hct7HOYekDqVQ+sSZbwzajnVunkw==\",\"passwordFound\":true,\"userName\":\"example-user\"}\n" }
In der Ausgabe des seriellen Ports können mehrere Antworten enthalten sein, die durch Zeilenumbrüche getrennt sind. Um die richtige Antwort zu finden, suchen Sie am Ausgang des seriellen Ports den von Ihnen übergebenen Modulus. Jede Antwort ist ein JSON-codierter String mit folgenden Feldern:
userName
: Der an die Instanz übergebene Nutzername.passwordFound
: Ein boolescher Wert, der angibt, ob die Passworterzeugung erfolgreich war.encryptedPassword
: Ein base64-codiertes, verschlüsseltes Passwort.modulus
: Der zuvor übergebene Modulus.exponent
: Der zuvor übergebene Exponent.
Informationen zur Aufbewahrung der Ausgabe des seriellen Ports finden Sie unter Ausgabe des seriellen Ports ansehen.
Entschlüsseln Sie das Passwort. Entschlüsseln Sie das verschlüsselte Passwort mit dem zuvor erstellten privaten Schlüssel, um das Passwort zu erhalten. Das Passwort muss mit Optimal Asymmetric Encryption Padding (OAEP) entschlüsselt werden. Für OpenSSL lautet der Befehl zur Entschlüsselung der Eingabedaten:
$ openssl rsautl -decrypt -inkey private_key -oaep
Geben Sie den
encryptedPassword
-Wert an, um das obige Passwort zu entschlüsseln. Denken Sie daran, zuvor die Escape-Zeichen\\
aus dem String zu entfernen, da die Entschlüsselung sonst fehlschlägt.$ echo 'uiHDEhxyvj6lF5GalHh9TsMZb4bG6Y9qGmFb9S3XI291MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5Tx Qo9hL0lBW7o3FRM/UIXCeRk39ObUl2AjDmQ0mcw1byJI5v9KVJnNMaHdRCy/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjS bvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXrfIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==' | base64 -d | openssl rsautl -decrypt -inkey private_key -oaep
Der Befehl gibt das entschlüsselte Passwort aus:
dDkJ_3]*QYS-#>X
Nutzername und Passwort für dieses Konto wären also:
username: example-user password: dDkJ_3]*QYS-#>X
Vernichten Sie die Schlüssel. Im Gegensatz zu SSH-Schlüsseln sind die Schlüssel für das Zurücksetzen bzw. Erzeugen von Windows-Passwörtern nur für kurzfristige Verwendung vorgesehen. Die Wiederverwendung öffentlicher bzw. privater Schlüssel ist nicht zu empfehlen und kann zu unerwarteten Resultaten führen. Falls der Schlüssel auf dem Laufwerk gespeichert worden ist, sollten die jeweiligen Dateien gelöscht werden, wenn der Vorgang abgeschlossen ist. Noch besser ist es, wenn möglich, den Schlüssel nur im Arbeitsspeicher zu behalten und nach Abschluss des Vorgangs zu verwerfen.
REST
Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
Weitere Informationen finden Sie unter Für die Verwendung von REST authentifizieren in der Dokumentation zur Google Cloud-Authentifizierung.
Passworterstellung automatisieren
Go
Python
Java
Anleitung für die manuelle Vorgehensweise
In der folgenden Anleitung für die manuelle Vorgehensweise wird für die kryptografischen Funktionen OpenSSL und für einige andere Funktionen werden die Bash-Shell bzw. Linux-Tools verwendet, es sind aber auch viele andere Implementierungen möglich.
Nächste Schritte
Sofern nicht anders angegeben, sind die Inhalte dieser Seite unter der Creative Commons Attribution 4.0 License und Codebeispiele unter der Apache 2.0 License lizenziert. Weitere Informationen finden Sie in den Websiterichtlinien von Google Developers. Java ist eine eingetragene Marke von Oracle und/oder seinen Partnern.
Zuletzt aktualisiert: 2024-10-14 (UTC).
-