O comando gcloud compute reset-windows-password
permite que um utilizador com acesso de escrita ao projeto do Compute Engine obtenha de forma segura as palavras-passe de contas em instâncias do Windows.
O comando faz isto enviando um nome de utilizador e uma chave pública RSA para a instância. Em seguida, o agente em execução na instância faz uma das seguintes ações:
- Cria uma conta na instância para esse nome de utilizador e gera uma palavra-passe aleatória.
- Repõe a palavra-passe para um valor aleatório se a conta já existir.
O agente em execução na instância encripta a palavra-passe com a chave pública fornecida e envia-a novamente para o cliente para ser desencriptada pela chave privada correspondente.
Esta secção descreve como funciona este processo e apresenta alguns exemplos de scripts que replicam estes passos de forma programática. Se quiser seguir estes passos manualmente, leia a secção Instruções manuais.
Antes de começar
- Crie uma instância do Windows.
-
Se ainda não o tiver feito, configure a autenticação.
A autenticação valida a sua identidade para aceder a Trusted Cloud by S3NS serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:
Select the tab for how you plan to use the samples on this page:
Console
When you use the Trusted Cloud console to access Trusted Cloud by S3NS services and APIs, you don't need to set up authentication.
gcloud
-
Instale a CLI Google Cloud e, em seguida, inicie sessão na CLI gcloud com a sua identidade federada. Depois de iniciar sessão, inicialize a CLI gcloud executando o seguinte comando:
gcloud init
- Set a default region and zone.
REST
Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.
Instale a CLI Google Cloud e, em seguida, inicie sessão na CLI gcloud com a sua identidade federada. Depois de iniciar sessão, inicialize a CLI gcloud executando o seguinte comando:
gcloud init
Para mais informações, consulte o artigo Autenticar para usar REST na Trusted Cloud documentação de autenticação.
Automatize a geração de palavras-passe
Ir
Python
Java
Instruções manuais
Os passos neste guia manual usam o OpenSSL para as funções criptográficas e a shell Bash/ferramentas Linux para algumas outras funções, mas são possíveis muitas outras implementações.
Gere um par de chaves RSA de 2048 bits. No OpenSSL, execute o seguinte comando para gerar este par de chaves:
$ openssl genrsa -out private_key 2048
Isto cria um ficheiro de chave privada denominado private_key com conteúdos semelhantes aos seguintes:
$ 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-----
Gere uma chave pública. Para criar a chave pública, execute o seguinte comando:
$ openssl rsa -pubout -in private_key -out public_key
Isto cria um ficheiro public_key com o seguinte aspeto:
$ 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-----
Extraia o módulo e o expoente. Um módulo e um expoente compõem as chaves públicas e privadas. A partir da chave pública, extraia o módulo e o expoente:
$ 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)
Codifique o módulo e o expoente. Tem de extrair e codificar em base64 o módulo e o expoente. Antes de codificar o módulo, remova o byte zero inicial do módulo. Por predefinição, o ficheiro public_key já é uma string de bytes codificada em base64 que contém as seguintes informações:
- 32 bytes de informações de cabeçalho
- 1 byte com o zero à esquerda do módulo
- 256 bytes de módulo
- 2 bytes do cabeçalho do expoente
- 3 bytes de expoente
O módulo e o expoente têm de ser extraídos e codificados separadamente do resto do conteúdo do ficheiro. Extraia e codifique o módulo e o expoente usando os seguintes comandos:
$ 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
Se tiver problemas ao codificar o módulo, certifique-se de que removeu o byte zero inicial do módulo antes de tentar codificá-lo.
Crie um objeto JSON com um nome de utilizador e informações da chave pública. Crie um objeto JSON com os seguintes dados:
userName
: o nome de utilizador para iniciar sessão na instância.modulus
: o módulo codificado em base64 da chave pública.exponent
: O expoente da chave pública codificado em Base64email
: o endereço de email do utilizador que está a pedir a palavra-passe. Este deve ser o endereço de email da Conta Google autenticada na API.expireOn
: uma data/hora codificada no formato RFC 3399 que indica quando a chave deve expirar. Esta deve ser a hora UTC, definida aproximadamente cinco minutos no futuro. Uma vez que estas chaves só são usadas para gerar o nome de utilizador e a palavra-passe, deixam de ser necessárias depois de a palavra-passe ser criada. Se uma chave não tiver uma data de validade ou a data de validade já tiver passado, o agente não a usa e ignora-a completamente.
Por exemplo:
{\"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\"}
Tenha em atenção que não deve haver novas linhas na string JSON.
Adicione o objeto JSON aos metadados da instância. Defina os metadados da instância usando a chave de metadados
windows-keys
e o objeto JSON como o valor da chave.Para atualizar os metadados da instância na API, tem de fornecer uma impressão digital com o seu pedido. Obtenha a impressão digital atual da instância fazendo um pedido GET à instância:
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]..
Em seguida, faça um pedido
POST
ao métodosetMetadata
, fornecendo a impressão digital e o objeto JSON que criou: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" } ] }
O nome da chave deve ser
windows-keys
e o valor deve ser definido como uma ou mais strings JSON, como a acima. As várias strings devem ser separadas por novas linhas. Quando adicionar várias entradas, certifique-se de que o valor dos metadados não excede 32 KB.Ler a saída da porta série número quatro. O agente na instância assume automaticamente o valor de
windows-keys
e cria uma palavra-passe encriptada. Leia a palavra-passe encriptada consultando o número da porta série quatro. Na API, faça um pedidoGET
ao métodogetSerialPortOutput
, transmitindoport=4
como um parâmetro de consulta: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" }
A saída da porta série pode conter várias respostas, separadas por novas linhas. Para encontrar a resposta correta, faça corresponder o módulo que transmitiu à saída da porta série. Cada resposta é uma string codificada em JSON com os seguintes campos:
userName
: o nome de utilizador que foi transmitido à instância.passwordFound
: um valor booleano que indica se a geração de palavras-passe foi bem-sucedida.encryptedPassword
: uma palavra-passe encriptada com codificação base64.modulus
: o módulo que foi transmitido anteriormente.exponent
: o expoente que foi transmitido anteriormente.
Para ver informações sobre a retenção da saída da porta de série, consulte o artigo Ver saída da porta de série.
Desencripte a palavra-passe. Para obter a palavra-passe, use a chave privada criada anteriormente para desencriptar a palavra-passe encriptada. A palavra-passe tem de ser desencriptada com o preenchimento de encriptação assimétrica ideal (OAEP). Para o OpenSSL, o comando para desencriptar os dados de entrada é:
$ openssl rsautl -decrypt -inkey private_key -oaep
Para desencriptar a palavra-passe acima, indique o valor
encryptedPassword
. Lembre-se de remover os carateres de escape\\
da string antecipadamente ou a desencriptação falha:$ echo 'uiHDEhxyvj6lF5GalHh9TsMZb4bG6Y9qGmFb9S3XI291MncHcaxP0rFu0kyjxlEXDs8y4L1KOhy6iyB42Lh+vZ4XIMjmvU4rZrjsBZ5Tx Qo9hL0lBW7o3FRM/UIXCeRk39ObUl2AjDmQ0mcw1byJI5v9KVJnNMaHdRCy/kvN6bx3qqjIhIMu0JExp4UVkAX2Mxb9b+c4o2DiZF5pY6ZfbuEmjS bvGRJXyswkOJ4jTZl+7e6+SZfEal8HJyRfZKiqTjrz+DLjYSlXrfIRqlvKeAFGOJq6IRojNWiTOOh8Zorc0iHDTIkf+MY0scfbBUo5m30Bf4w==' | base64 -d | openssl rsautl -decrypt -inkey private_key -oaep
O comando imprime a palavra-passe descifrada:
dDkJ_3]*QYS-#>X
O nome de utilizador e a palavra-passe desta conta seriam:
username: example-user password: dDkJ_3]*QYS-#>X
Deitar as chaves fora. Ao contrário das chaves SSH, as chaves usadas para obter/repôr palavras-passe do Windows destinam-se a ser efémeras. A reutilização de pares de chaves públicas/privadas não é recomendada e pode não funcionar conforme esperado. Se a chave tiver sido guardada no disco, os ficheiros devem ser eliminados no final do processo. Melhor ainda, se possível, mantenha a chave na memória e elimine-a quando o processo estiver concluído.
O que se segue?
Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2025-10-02 UTC.
[[["Fácil de entender","easyToUnderstand","thumb-up"],["Meu problema foi resolvido","solvedMyProblem","thumb-up"],["Outro","otherUp","thumb-up"]],[["Não contém as informações de que eu preciso","missingTheInformationINeed","thumb-down"],["Muito complicado / etapas demais","tooComplicatedTooManySteps","thumb-down"],["Desatualizado","outOfDate","thumb-down"],["Problema na tradução","translationIssue","thumb-down"],["Problema com as amostras / o código","samplesCodeIssue","thumb-down"],["Outro","otherDown","thumb-down"]],["Última atualização 2025-10-02 UTC."],[],[],null,[]] -