Compute Engine プロジェクトへの書き込みアクセスを持つユーザーは、gcloud compute reset-windows-password
コマンドを使用して、安全に Windows インスタンスのアカウントのパスワードを取得できます。
これは、コマンドがユーザー名と RSA 公開鍵をインスタンスに送信することで行われます。インスタンス上で実行されているエージェントは、次のいずれかを行います。
- 送信されたユーザー名のアカウントをインスタンス上で作成し、ランダムなパスワードを生成します。
- アカウントがすでに存在する場合は、パスワードをランダムな値にリセットします。
インスタンスで実行されているエージェントは、受信した公開鍵でパスワードを暗号化し、クライアントに送り返します。パスワードは、対応する秘密鍵で復号されます。
このセクションでは、プロセスの仕組みと、これらのステップをプログラムにより複製するスクリプトの例を説明します。これらのステップを手動で行う場合は、手動での手順をご覧ください。
準備
- Windows インスタンスを作成します。
-
まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。
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.
2,048 ビットの RSA 鍵ペアを生成します。OpenSSL で、次を実行してこの鍵ペアを生成します。
$ openssl genrsa -out private_key 2048
これで、以下のような内容の private_key という名前の秘密鍵ファイルが作成されます。
$ 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-----
公開鍵を生成します。公開鍵を作成するには、以下を実行します。
$ openssl rsa -pubout -in private_key -out public_key
次のような public_key ファイルが作成されます。
$ 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-----
係数と指数を抽出します。係数と指数が、公開鍵と秘密鍵を構成します。公開鍵から、係数と指数を抽出します。
$ 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)
係数と指数をエンコードします。係数と指数を抽出し、Base64 エンコードする必要があります。係数をエンコードする前に、係数からリーディング ゼロバイトを削除します。デフォルトでは、public_key ファイルは以下の情報を含むバイトの Base64 エンコード文字列です。
- 32 バイトのヘッダー情報
- リーディング ゼロを含む 1 バイトの係数
- 256 バイトの係数
- 2 バイトの指数ヘッダー
- 3 バイトの指数
係数と指数は、他のファイル コンテンツとは別に抽出し、エンコードする必要があります。次のコマンドを使用して、係数と指数を抽出し、エンコードします。
$ 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
係数のエンコード中に問題が起きた場合、エンコード前に係数からリーディング ゼロバイトが削除されているか確認してください。
ユーザー名と公開鍵の情報を使用して、JSON オブジェクトを作成します。次のデータを使用して、JSON オブジェクトを作成してください。
userName
: インスタンスにログインする際のユーザー名。modulus
: Base64 エンコードされた、公開鍵の係数。exponent
: Base64 エンコードされた、公開鍵の指数。email
: パスワードをリクエストしているユーザーのメールアドレス。このメールアドレスは、API 認証済み Google アカウントのメールアドレスにする必要があります。expireOn
: 鍵の有効期限を示す RFC 3399 エンコードのタイムスタンプ。これは UTC 時刻に基づいて、約 5 分後に設定します。これらの鍵は、ユーザー名とパスワードの生成にのみ使用するため、パスワード作成後には必要なくなります。エージェントは、有効期限の切れた鍵は使用しません。
例:
{\"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\"}
JSON 文字列には改行がないよう注意してください。
JSON オブジェクトをインスタンス メタデータに追加します。メタデータの鍵
windows-keys
と JSON オブジェクトを鍵の値として使用し、インスタンス メタデータを設定します。API でインスタンス メタデータを更新するには、リクエスト時にフィンガープリントを入力する必要があります。インスタンスに GET リクエストを送り、最新のフィンガープリントを取得してください。
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]..
次に、
setMetadata
メソッドに対してPOST
リクエストを実行し、フィンガープリントと作成した JSON オブジェクトを渡します。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" } ] }
鍵の名前が
windows-keys
になっていて、値は上記のように 1 つまたは複数の JSON 文字列に設定されている必要があります。複数の文字列は改行で区切る必要があります。複数のエントリを追加する場合は、メタデータ値が 32 KB を超えないようにしてください。シリアルポート 4 番から、出力を読み取ります。インスタンスのエージェントは自動的に
windows-keys
の値を取得し、暗号化されたパスワードを作成します。シリアルポート 4 番にクエリを行い、暗号化されたパスワードを読み取ります。API で、getSerialPortOutput
メソッドに対してGET
リクエストを実行し、クエリ パラメータとしてport=4
を渡します。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" }
シリアルポートの出力には、改行で区切られた複数のレスポンスがある場合があります。正しいレスポンスを見つけるには、指定した係数とシリアルポートの出力を一致させます。各レスポンスは、JSON エンコードされた文字列で、次のフィールドがあります。
userName
: インスタンスに送られたユーザー名。passwordFound
: パスワードの生成が成功したかを示すブール値。encryptedPassword
: Base64 でエンコードされ、暗号化されたパスワード。modulus
: 以前に送られた係数。exponent
: 以前に送られた指数。
シリアルポート出力の保存については、シリアルポート出力の表示をご覧ください。
パスワードを復号します。パスワードを取得するには、前の手順で作成した秘密鍵を使用し、暗号化されたパスワードを復号します。パスワードは、Optimal Asymmetric Encryption Padding(OAEP)を使用して復号する必要があります。OpenSSL では、次のコマンドで入力データを復号します。
$ openssl rsautl -decrypt -inkey private_key -oaep
上記のパスワードを復号するには、
encryptedPassword
値を入力します。必ず文字列からエスケープ文字\\
を前もって削除しておかないと、復号に失敗します。$ echo 'uiHDEhxyvj6lF5GalHh9TsMZb4bG6Y9qGmFb9S3XI291MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5Tx Qo9hL0lBW7o3FRM/UIXCeRk39ObUl2AjDmQ0mcw1byJI5v9KVJnNMaHdRCy/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjS bvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXrfIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==' | base64 -d | openssl rsautl -decrypt -inkey private_key -oaep
コマンドにより、復号されたパスワードが出力されます。
dDkJ_3]*QYS-#>X
このアカウントのユーザー名とパスワードは、次のようになります。
username: example-user password: dDkJ_3]*QYS-#>X
鍵を削除します。SSH 認証鍵とは異なり、Windows パスワードの取得、リセットに使用する鍵は一時的なものです。公開鍵 / 秘密鍵の再利用は、想定どおりに機能しない可能性があるため、おすすめしません。鍵がディスクに保存されている場合は、プロセスの最後にファイルを消去する必要があります。可能ならば、鍵はメモリに保存し、プロセスが完了したら破棄してください。
REST
このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
詳細については、Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。
自動パスワード生成
Go
Python
Java
手動での手順
この手動設定ガイドの手順では、暗号機能に OpenSSL を、その他の機能に Bash shell ツールと Linux ツールを使用しますが、他の多くのツールを実装することも可能です。
次のステップ
特に記載のない限り、このページのコンテンツはクリエイティブ・コモンズの表示 4.0 ライセンスにより使用許諾されます。コードサンプルは Apache 2.0 ライセンスにより使用許諾されます。詳しくは、Google Developers サイトのポリシーをご覧ください。Java は Oracle および関連会社の登録商標です。
最終更新日 2024-11-19 UTC。
-