그만큼 gcloud compute reset-windows-password
명령어를 사용하면 Compute Engine 프로젝트에 대한 쓰기 액세스 권한이 있어 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.
2048비트 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로 인코딩해야 합니다. 계수를 인코딩하기 전에 계수에서 선행 0바이트를 제거합니다. 기본적으로 public_key 파일은 이미 base64로 인코딩된 바이트 문자열이며 다음 정보를 포함합니다.
- 32바이트 헤더 정보
- 1바이트(계수의 선행 0 포함)
- 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
계수를 인코딩하는 데 문제가 발생하는 경우에는 인코딩을 시도하기 전에 계수에서 선행 0바이트를 제거했는지 확인합니다.
사용자 이름과 공개 키 정보로 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
이며, 값은 하나 이상의 위와 같은 JSON 문자열로 지정되어야 합니다. 여러 문자열은 줄바꿈으로 구분해야 합니다. 여러 항목을 추가할 때는 메타데이터 값이 32KB를 넘지 않게 해야 합니다.직렬 포트 번호 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
: 이전에 전달된 지수입니다.
직렬 포트 출력 보관에 대한 자세한 내용은 직렬 포트 출력 보기를 참조하세요.
비밀번호를 복호화합니다. 비밀번호를 가져오려면 이전에 생성된 비공개 키를 사용하여 암호화된 비밀번호를 복호화합니다. OAEP(Optimal Asymmetric Encryption Padding)로 비밀번호를 복호화해야 합니다. 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
키를 폐기합니다. Windows 비밀번호를 검색/재설정하는 데 사용하는 키는 SSH 키와 달리 임시 용도입니다. 공개/비공개 키 쌍을 재사용하는 것은 권장되지 않으며 예상대로 작동하지 않을 수 있습니다. 키를 저장한 위치가 디스크인 경우에는 프로세스 종료 시 해당 파일을 삭제해야 합니다. 가능하다면 키를 메모리에 보관하고 프로세스가 완료되었을 때 삭제하면 더 좋습니다.
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
자바
수동 작업 안내
이 수동 가이드의 단계에서는 암호화 기능에 OpenSSL을 사용하고 일부 다른 기능에는 Bash 셸/Linux 도구를 사용하지만, 다른 기능도 다양하게 구현할 수 있습니다.
다음 단계
달리 명시되지 않는 한 이 페이지의 콘텐츠에는 Creative Commons Attribution 4.0 라이선스에 따라 라이선스가 부여되며, 코드 샘플에는 Apache 2.0 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 Google Developers 사이트 정책을 참조하세요. 자바는 Oracle 및/또는 Oracle 계열사의 등록 상표입니다.
최종 업데이트: 2024-11-21(UTC)
-