Dengan perintah gcloud compute reset-windows-password
, pengguna yang memiliki akses tulis ke project Compute Engine dapat mengambil sandi dengan aman untuk akun di instance Windows.
Perintah tersebut melakukannya dengan mengirimkan nama pengguna dan kunci publik RSA ke instance. Agen yang berjalan pada instance kemudian melakukan salah satu hal berikut:
- Membuat akun pada instance untuk nama pengguna tersebut dan menghasilkan sandi acak.
- Mereset sandi ke nilai acak jika akun sudah ada.
Agen yang berjalan pada instance mengenkripsi sandi dengan kunci publik yang diberikan dan mengirimkannya kembali ke klien untuk didekripsi oleh kunci pribadi yang terkait.
Bagian ini menjelaskan cara kerja proses tersebut dan memberi Anda beberapa contoh skrip yang mereplikasi langkah-langkah ini secara terprogram. Jika Anda ingin mengikuti langkah-langkah ini secara manual, baca bagian Petunjuk manual.
Sebelum memulai
- Buat instance Windows.
-
Siapkan autentikasi, jika Anda belum melakukannya.
Autentikasi adalah proses verifikasi identitas Anda untuk akses ke layanan dan API Google Cloud.
Untuk menjalankan kode atau contoh dari lingkungan pengembangan lokal, Anda dapat melakukan autentikasi ke Compute Engine sebagai berikut.
Pilih tab untuk melihat bagaimana Anda berencana menggunakan contoh di halaman ini:
Konsol
Saat menggunakan Konsol Google Cloud untuk mengakses API dan layanan Google Cloud, Anda tidak perlu menyiapkan autentikasi.
gcloud
-
Instal Google Cloud CLI, lalu initialize dengan menjalankan perintah berikut:
gcloud init
- Menetapkan region dan zona default.
REST
Untuk menggunakan contoh REST API di halaman ini dalam lingkungan pengembangan lokal, gunakan kredensial yang Anda berikan ke gcloud CLI.
Instal Google Cloud CLI, lalu initialize dengan menjalankan perintah berikut:
gcloud init
-
Mengotomatiskan pembuatan sandi
Go
Python
Java
Petunjuk manual
Langkah-langkah dalam panduan manual ini menggunakan OpenSSL untuk fungsi kriptografi dan alat Linux/shell Bash untuk beberapa fungsi lainnya, tetapi banyak implementasi lainnya yang dapat dilakukan.
Buat pasangan kunci RSA 2048-bit. Di OpenSSL, buat pasangan kunci ini dengan menjalankan:
$ openssl genrsa -out private_key 2048
Tindakan ini akan membuat file kunci pribadi bernama private_key dengan isi yang terlihat seperti berikut:
$ 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-----
Buat kunci publik. Untuk membuat kunci publik, jalankan:
$ openssl rsa -pubout -in private_key -out public_key
Tindakan ini akan membuat file public_key yang terlihat seperti ini:
$ 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-----
Ekstrak modulus dan eksponennya. Modulus dan eksponen membentuk kunci publik dan pribadi. Dari kunci publik, ekstrak modulus dan eksponennya:
$ 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)
Enkode modulus dan eksponennya. Anda harus mengekstrak dan mengenkode modulus dan eksponen dengan base64. Sebelum mengenkode modulus, hapus byte nol di awal dari modulus. Secara default, file public_key sudah berupa string byte berenkode base64 yang berisi informasi berikut:
- 32 byte informasi header
- 1 byte dengan angka nol di awal modulus
- 256 byte modulus
- 2 byte header eksponen
- 3 byte eksponen
Modulus dan eksponen harus diekstrak dan dienkode secara terpisah dari konten file lainnya. Ekstrak dan enkode modulus beserta eksponen menggunakan perintah berikut:
$ 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
Jika Anda mengalami masalah saat mengenkode modulus, pastikan Anda telah menghapus byte nol di awal dari modulus sebelum mencoba mengenkodenya.
Buat objek JSON dengan nama pengguna dan informasi kunci publik. Buat objek JSON dengan data berikut:
userName
: Nama pengguna untuk login ke instance.modulus
: Modulus kunci publik yang berenkode base64.exponent
: Eksponen kunci publik yang berenkode base64email
: Alamat email pengguna yang meminta sandi. Alamat ini harus berupa alamat email Akun Google yang diautentikasi ke API.expireOn
: Stempel waktu berenkode RFC 3399 saat masa berlaku kunci akan berakhir. Stempel waktu ini harus dalam waktu UTC, tetapkan sekitar lima menit ke depan. Karena kunci ini hanya digunakan untuk membuat nama pengguna dan sandi, kunci tersebut tidak lagi diperlukan setelah sandi dibuat. Agen tidak menggunakan kunci yang telah habis masa berlakunya.
Contoh:
{\"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\"}
Perhatikan bahwa tidak boleh ada newline di string JSON.
Tambahkan objek JSON ke metadata instance. Tetapkan metadata instance menggunakan kunci metadata
windows-keys
dan objek JSON sebagai nilai kunci.Untuk memperbarui metadata instance di API, Anda harus memberikan sidik jari pada permintaan Anda. Dapatkan sidik jari instance saat ini dengan membuat permintaan GET ke instance:
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]..
Selanjutnya, buat permintaan
POST
ke metodesetMetadata
, dengan memberikan sidik jari dan objek JSON yang Anda buat: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" } ] }
Nama kunci harus
windows-keys
dan nilainya harus ditetapkan ke satu atau beberapa string JSON seperti di atas. Beberapa string harus dipisahkan oleh newline. Saat menambahkan beberapa entri, pastikan nilai metadata tidak melebihi 32 KB.Baca output dari port serial nomor empat. Agen di instance akan otomatis mengambil nilai
windows-keys
dan membuat sandi yang dienkripsi. Baca sandi yang dienkripsi dengan membuat kueri port serial nomor empat. Di API, buat permintaanGET
ke metodegetSerialPortOutput
, dengan meneruskanport=4
sebagai parameter kueri: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" }
Output port serial dapat berisi beberapa respons, yang dipisahkan oleh newline. Untuk menemukan respons yang benar, cocokkan modulus yang Anda teruskan ke output port serial. Setiap respons adalah string berenkode JSON dengan kolom berikut:
userName
: Nama pengguna yang diteruskan ke instance.passwordFound
: Nilai Boolean yang menunjukkan apakah pembuatan sandi berhasil.encryptedPassword
: Sandi yang dienkripsi dan berenkode base64.modulus
: Modulus yang sebelumnya diteruskan.exponent
: Eksponen yang sebelumnya diteruskan.
Untuk informasi tentang retensi output port serial, lihat Melihat output port serial.
Dekripsi sandi. Untuk mendapatkan sandi, gunakan kunci pribadi yang dibuat sebelumnya untuk mendekripsi sandi yang dienkripsi. Sandi harus didekripsi dengan Optimal Asymmetric Encryption Padding (OAEP). Untuk OpenSSL, perintah untuk mendekripsi data input adalah:
$ openssl rsautl -decrypt -inkey private_key -oaep
Untuk mendekripsi sandi di atas, berikan nilai
encryptedPassword
. Jangan lupa untuk menghapus karakter escape\\
dari string terlebih dahulu. Jika tidak, dekripsi akan gagal:$ echo 'uiHDEhxyvj6lF5GalHh9TsMZb4bG6Y9qGmFb9S3XI291MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5Tx Qo9hL0lBW7o3FRM/UIXCeRk39ObUl2AjDmQ0mcw1byJI5v9KVJnNMaHdRCy/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjS bvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXrfIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==' | base64 -d | openssl rsautl -decrypt -inkey private_key -oaep
Perintah ini akan mencetak sandi yang didekripsi:
dDkJ_3]*QYS-#>X
Nama pengguna dan sandi untuk akun ini adalah:
username: example-user password: dDkJ_3]*QYS-#>X
Hapus semua kunci. Tidak seperti Kunci SSH, kunci yang digunakan untuk mengambil/mereset sandi Windows dimaksudkan untuk bersifat sementara. Menggunakan kembali pasangan kunci publik/pribadi tidak direkomendasikan dan mungkin tidak akan berfungsi seperti yang diharapkan. Jika kunci telah disimpan ke disk, file tersebut harus dihapus pada akhir proses. Lebih baik lagi, jika memungkinkan, simpan kunci tersebut di memori dan hapus setelah proses selesai.