Azure Instance Metadata Service
Aplica-se a: ✔️ VMs do Windows VMs ✔️ do Linux Conjuntos ✔️ de dimensionamento flexíveis
O Azure Instance Metadata Service (IMDS) disponibiliza informações sobre as instâncias de máquinas virtuais atualmente em execução. Pode utilizá-lo para gerir e configurar as suas máquinas virtuais. Estas informações incluem o SKU, o armazenamento, as configurações de rede e os eventos de manutenção futuros. Para obter uma lista completa dos dados disponíveis, veja o Resumo das Categorias de Pontos Finais.
O IMDS está disponível para executar instâncias de máquinas virtuais (VMs) e instâncias de conjuntos de dimensionamento. Todos os pontos finais suportam VMs criadas e geridas com o Azure Resource Manager. Apenas a categoria Atestado e a parte de Rede da categoria Instância suportam VMs criadas com o modelo de implementação clássica. O ponto final Atestado só o faz numa extensão limitada.
O IMDS é uma API REST que está disponível num endereço IP bem conhecido e não encaminhável (169.254.169.254
). Só é possível aceder ao mesmo a partir da VM. A comunicação entre a VM e o IMDS nunca sai do anfitrião.
Peça aos clientes HTTP que ignorem os proxies Web na VM ao consultar o IMDS e tratem 169.254.169.254
o mesmo que 168.63.129.16
.
Utilização
Aceder ao Serviço de Metadados do Azure Instance
Para aceder ao IMDS, crie uma VM a partir do Azure Resource Manager ou do portal do Azure e utilize os exemplos seguintes. Para obter mais exemplos, veja Exemplos de Metadados da Instância do Azure.
Eis o código de exemplo para obter todos os metadados de uma instância. Para aceder a uma origem de dados específica, veja Categorias de Ponto Final para obter uma descrição geral de todas as funcionalidades disponíveis.
Pedir
Importante
Este exemplo ignora os proxies. Tem de ignorar proxies ao consultar o IMDS. Veja Proxies para obter informações adicionais.
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance?api-version=2021-02-01" | ConvertTo-Json -Depth 64
-NoProxy
requer o PowerShell V6 ou superior. Veja o nosso repositório de exemplos para obter exemplos com versões mais antigas do PowerShell.
Response
Nota
A resposta é uma cadeia JSON. A seguinte resposta de exemplo é bastante impressa para legibilidade.
{
"compute": {
"azEnvironment": "AZUREPUBLICCLOUD",
"additionalCapabilities": {
"hibernationEnabled": "true"
},
"hostGroup": {
"id": "testHostGroupId"
},
"extendedLocation": {
"type": "edgeZone",
"name": "microsoftlosangeles"
},
"evictionPolicy": "",
"isHostCompatibilityLayerVm": "true",
"licenseType": "Windows_Client",
"location": "westus",
"name": "examplevmname",
"offer": "WindowsServer",
"osProfile": {
"adminUsername": "admin",
"computerName": "examplevmname",
"disablePasswordAuthentication": "true"
},
"osType": "Windows",
"placementGroupId": "f67c14ab-e92c-408c-ae2d-da15866ec79a",
"plan": {
"name": "planName",
"product": "planProduct",
"publisher": "planPublisher"
},
"platformFaultDomain": "36",
"platformSubFaultDomain": "",
"platformUpdateDomain": "42",
"priority": "Regular",
"publicKeys": [{
"keyData": "ssh-rsa 0",
"path": "/home/user/.ssh/authorized_keys0"
},
{
"keyData": "ssh-rsa 1",
"path": "/home/user/.ssh/authorized_keys1"
}
],
"publisher": "RDFE-Test-Microsoft-Windows-Server-Group",
"resourceGroupName": "macikgo-test-may-23",
"resourceId": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/virtualMachines/examplevmname",
"securityProfile": {
"secureBootEnabled": "true",
"virtualTpmEnabled": "false",
"encryptionAtHost": "true",
"securityType": "TrustedLaunch"
},
"sku": "2019-Datacenter",
"storageProfile": {
"dataDisks": [{
"bytesPerSecondThrottle": "979202048",
"caching": "None",
"createOption": "Empty",
"diskCapacityBytes": "274877906944",
"diskSizeGB": "1024",
"image": {
"uri": ""
},
"isSharedDisk": "false",
"isUltraDisk": "true",
"lun": "0",
"managedDisk": {
"id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampledatadiskname",
"storageAccountType": "StandardSSD_LRS"
},
"name": "exampledatadiskname",
"opsPerSecondThrottle": "65280",
"vhd": {
"uri": ""
},
"writeAcceleratorEnabled": "false"
}],
"imageReference": {
"id": "",
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2019-Datacenter",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": "30",
"diffDiskSettings": {
"option": "Local"
},
"encryptionSettings": {
"enabled": "false",
"diskEncryptionKey": {
"sourceVault": {
"id": "/subscriptions/test-source-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
},
"secretUrl": "https://test-disk.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
},
"keyEncryptionKey": {
"sourceVault": {
"id": "/subscriptions/test-key-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
},
"keyUrl": "https://test-key.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
}
},
"image": {
"uri": ""
},
"managedDisk": {
"id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampleosdiskname",
"storageAccountType": "StandardSSD_LRS"
},
"name": "exampleosdiskname",
"osType": "Windows",
"vhd": {
"uri": ""
},
"writeAcceleratorEnabled": "false"
},
"resourceDisk": {
"size": "4096"
}
},
"subscriptionId": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
"tags": "baz:bash;foo:bar",
"userData": "Zm9vYmFy",
"version": "15.05.22",
"virtualMachineScaleSet": {
"id": "/subscriptions/xxxxxxxx-xxxxx-xxx-xxx-xxxx/resourceGroups/resource-group-name/providers/Microsoft.Compute/virtualMachineScaleSets/virtual-machine-scale-set-name"
},
"vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6",
"vmScaleSetName": "crpteste9vflji9",
"vmSize": "Standard_A3",
"zone": ""
},
"network": {
"interface": [{
"ipv4": {
"ipAddress": [{
"privateIpAddress": "10.144.133.132",
"publicIpAddress": ""
}],
"subnet": [{
"address": "10.144.133.128",
"prefix": "26"
}]
},
"ipv6": {
"ipAddress": [
]
},
"macAddress": "0011AAFFBB22"
}]
}
}
Segurança e autenticação
O Serviço de Metadados de Instância só está acessível a partir de uma instância de máquina virtual em execução num endereço IP não encaminhável. As VMs só podem interagir com os seus próprios metadados/funcionalidades. A API é apenas HTTP e nunca sai do anfitrião.
Para garantir que os pedidos se destinam diretamente ao IMDS e impedir o redirecionamento indesejado ou indesejado de pedidos, os pedidos:
- Tem de conter o cabeçalho
Metadata: true
- Não pode conter um
X-Forwarded-For
cabeçalho
Qualquer pedido que não cumpra ambos os requisitos é rejeitado pelo serviço.
Importante
O IMDS não é um canal para dados confidenciais. A API não está autenticada e está aberta a todos os processos na VM. As informações expostas através deste serviço devem ser consideradas informações partilhadas para todas as aplicações em execução dentro da VM.
Se não for necessário que todos os processos na VM acedam ao ponto final do IMDS, pode definir regras de firewall locais para limitar o acesso. Por exemplo, se apenas um serviço de sistema conhecido precisar de aceder ao serviço de metadados de instâncias, pode definir uma regra de firewall no ponto final IMDS, permitindo apenas o acesso a processos específicos ou a negação de acesso para o resto dos processos.
Proxies
O IMDS não se destina a ser utilizado por trás de um proxy e fazê-lo não é suportado. A maioria dos clientes HTTP fornece uma opção para desativar proxies nos seus pedidos e esta funcionalidade tem de ser utilizada ao comunicar com o IMDS. Consulte a documentação do cliente para obter detalhes.
Importante
Mesmo que não saiba de nenhuma configuração de proxy no seu ambiente, ainda tem de substituir quaisquer definições de proxy de cliente predefinidas. As configurações de proxy podem ser detetadas automaticamente e não ignorar essas configurações expõe-no a riscos de indisponibilidade caso a configuração da máquina seja alterada no futuro.
Rate limiting (Limitação de taxa)
Em geral, os pedidos ao IMDS estão limitados a 5 pedidos por segundo (por VM). Os pedidos que excedam este limiar serão rejeitados com respostas 429. Os pedidos para a categoria Identidade Gerida estão limitados a 20 pedidos por segundo e 5 pedidos simultâneos (por VM).
Verbos HTTP
Os seguintes verbos HTTP são atualmente suportados:
Verbo | Description |
---|---|
GET |
Obter o recurso pedido |
Parâmetros
Os pontos finais podem suportar os parâmetros obrigatórios e/ou opcionais. Veja Esquema e a documentação do ponto final específico em questão para obter detalhes.
Parâmetros de consulta
Os pontos finais IMDS suportam parâmetros de cadeia de consulta HTTP. Por exemplo:
http://169.254.169.254/metadata/instance/compute?api-version=2021-01-01&format=json
Especifica os parâmetros:
Name | Valor |
---|---|
api-version |
2021-01-01 |
format |
json |
Os pedidos com nomes de parâmetros de consulta duplicados serão rejeitados.
Parâmetros de rota
Para alguns pontos finais que devolvem blobs json maiores, suportamos parâmetros de rota de acréscimo para o ponto final do pedido para filtrar para um subconjunto da resposta:
http://169.254.169.254/metadata/<endpoint>/[<filter parameter>/...]?<query parameters>
Os parâmetros correspondem aos índices/chaves que seriam utilizados para descer o objeto json se estivesse a interagir com uma representação analisada.
Por exemplo, /metadata/instance
devolve o objeto json:
{
"compute": { ... },
"network": {
"interface": [
{
"ipv4": {
"ipAddress": [{
"privateIpAddress": "10.144.133.132",
"publicIpAddress": ""
}],
"subnet": [{
"address": "10.144.133.128",
"prefix": "26"
}]
},
"ipv6": {
"ipAddress": [
]
},
"macAddress": "0011AAFFBB22"
},
...
]
}
}
Se quisermos filtrar a resposta apenas para a propriedade de computação, enviaríamos o pedido:
http://169.254.169.254/metadata/instance/compute?api-version=<version>
Da mesma forma, se quisermos filtrar para uma propriedade aninhada ou um elemento de matriz específico, continuamos a acrescentar chaves:
http://169.254.169.254/metadata/instance/network/interface/0?api-version=<version>
filtraria para o primeiro elemento a Network.interface
partir da propriedade e devolveria:
{
"ipv4": {
"ipAddress": [{
"privateIpAddress": "10.144.133.132",
"publicIpAddress": ""
}],
"subnet": [{
"address": "10.144.133.128",
"prefix": "26"
}]
},
"ipv6": {
"ipAddress": [
]
},
"macAddress": "0011AAFFBB22"
}
Nota
Ao filtrar para um nó de folha, format=json
não funciona. Para estas consultas format=text
tem de ser especificada explicitamente, uma vez que o formato predefinido é json.
Esquema
Formato de dados
Por predefinição, o IMDS devolve dados no formato JSON (Content-Type: application/json
). No entanto, os pontos finais que suportam a filtragem de respostas (veja Parâmetros de Rota) também suportam o formato text
.
Para aceder a um formato de resposta não predefinido, especifique o formato pedido como um parâmetro de cadeia de consulta no pedido. Por exemplo:
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance?api-version=2017-08-01&format=text"
Nas respostas json, todos os primitivos serão do tipo string
e os valores em falta ou inaplicáveis são sempre incluídos, mas serão definidos como uma cadeia vazia.
Controlo de versões
O IMDS tem uma versão e a especificação da versão da API no pedido HTTP é obrigatória. A única exceção a este requisito é o ponto final de versões , que pode ser utilizado para obter dinamicamente as versões de API disponíveis.
À medida que as versões mais recentes são adicionadas, as versões mais antigas ainda podem ser acedidas para compatibilidade se os scripts tiverem dependências em formatos de dados específicos.
Quando não especifica uma versão, obtém um erro com uma lista das versões suportadas mais recentes:
{
"error": "Bad request. api-version was not specified in the request. For more information refer to aka.ms/azureimds",
"newest-versions": [
"2020-10-01",
"2020-09-01",
"2020-07-15"
]
}
Versões de API suportadas
- 2021-12-13
- 2021-11-15
- 2021-11-01
- 2021-10-01
- 2021-08-01
- 2021-05-01
- 2021-03-01
- 2021-02-01
- 2021-01-01
- 2020-12-01
- 2020-10-01
- 2020-09-01
- 2020-07-15
- 2020-06-01
- 2019-11-01
- 2019-08-15
- 2019-08-01
- 2019-06-04
- 2019-06-01
- 2019-04-30
- 2019-03-11
- 2019-02-01
- 2018-10-01
- 2018-04-02
- 2018-02-01
- 2017-12-01
- 2017-10-01
- 2017-08-01
- 2017-04-02
- 2017-03-01
Swagger
Está disponível uma definição completa do Swagger para IMDS em: https://github.com/Azure/azure-rest-api-specs/blob/main/specification/imds/data-plane/readme.md
Disponibilidade regional
O serviço está geralmente disponível em todas as clouds do Azure.
Ponto final de raiz
O ponto final de raiz é http://169.254.169.254/metadata
.
Categorias de pontos finais
A API IMDS contém várias categorias de pontos finais que representam diferentes origens de dados, cada uma das quais contém um ou mais pontos finais. Veja cada categoria para obter detalhes.
Raiz da categoria | Description | Versão introduzida |
---|---|---|
/metadata/attested |
Ver Dados Atestados | 2018-10-01 |
/metadata/identity |
Veja Identidade Gerida através do IMDS | 2018-02-01 |
/metadata/instance |
Veja Metadados de Instância | 2017-04-02 |
/metadata/loadbalancer |
Veja Obter metadados de Balanceador de Carga através do IMDS | 2020-10-01 |
/metadata/scheduledevents |
Ver Eventos Agendados através do IMDS | 2017-08-01 |
/metadata/versions |
Ver Versões | N/D |
Versões
Nota
Esta funcionalidade foi lançada juntamente com a versão 2020-10-01, que está atualmente a ser implementada e pode ainda não estar disponível em todas as regiões.
Listar versões da API
Devolve o conjunto de versões de API suportadas.
GET /metadata/versions
Parâmetros
Nenhum (este ponto final não estáversionado).
Resposta
{
"apiVersions": [
"2017-03-01",
"2017-04-02",
...
]
}
Metadados de instância
Obter metadados de VM
Expõe os metadados importantes para a instância da VM, incluindo computação, rede e armazenamento.
GET /metadata/instance
Parâmetros
Name | Obrigatório/Opcional | Descrição |
---|---|---|
api-version |
Obrigatório | A versão utilizada para atender o pedido. |
format |
Opcional* | O formato (json ou text ) da resposta. *Nota: pode ser necessário ao utilizar parâmetros de pedido |
Este ponto final suporta a filtragem de respostas através de parâmetros de rota.
Resposta
{
"compute": {
"azEnvironment": "AZUREPUBLICCLOUD",
"additionalCapabilities": {
"hibernationEnabled": "true"
},
"hostGroup": {
"id": "testHostGroupId"
},
"extendedLocation": {
"type": "edgeZone",
"name": "microsoftlosangeles"
},
"evictionPolicy": "",
"isHostCompatibilityLayerVm": "true",
"licenseType": "Windows_Client",
"location": "westus",
"name": "examplevmname",
"offer": "WindowsServer",
"osProfile": {
"adminUsername": "admin",
"computerName": "examplevmname",
"disablePasswordAuthentication": "true"
},
"osType": "Windows",
"placementGroupId": "f67c14ab-e92c-408c-ae2d-da15866ec79a",
"plan": {
"name": "planName",
"product": "planProduct",
"publisher": "planPublisher"
},
"platformFaultDomain": "36",
"platformSubFaultDomain": "",
"platformUpdateDomain": "42",
"priority": "Regular",
"publicKeys": [{
"keyData": "ssh-rsa 0",
"path": "/home/user/.ssh/authorized_keys0"
},
{
"keyData": "ssh-rsa 1",
"path": "/home/user/.ssh/authorized_keys1"
}
],
"publisher": "RDFE-Test-Microsoft-Windows-Server-Group",
"resourceGroupName": "macikgo-test-may-23",
"resourceId": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/virtualMachines/examplevmname",
"securityProfile": {
"secureBootEnabled": "true",
"virtualTpmEnabled": "false",
"encryptionAtHost": "true",
"securityType": "TrustedLaunch"
},
"sku": "2019-Datacenter",
"storageProfile": {
"dataDisks": [{
"bytesPerSecondThrottle": "979202048",
"caching": "None",
"createOption": "Empty",
"diskCapacityBytes": "274877906944",
"diskSizeGB": "1024",
"image": {
"uri": ""
},
"isSharedDisk": "false",
"isUltraDisk": "true",
"lun": "0",
"managedDisk": {
"id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampledatadiskname",
"storageAccountType": "StandardSSD_LRS"
},
"name": "exampledatadiskname",
"opsPerSecondThrottle": "65280",
"vhd": {
"uri": ""
},
"writeAcceleratorEnabled": "false"
}],
"imageReference": {
"id": "",
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2019-Datacenter",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": "30",
"diffDiskSettings": {
"option": "Local"
},
"encryptionSettings": {
"enabled": "false",
"diskEncryptionKey": {
"sourceVault": {
"id": "/subscriptions/test-source-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
},
"secretUrl": "https://test-disk.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
},
"keyEncryptionKey": {
"sourceVault": {
"id": "/subscriptions/test-key-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
},
"keyUrl": "https://test-key.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
}
},
"image": {
"uri": ""
},
"managedDisk": {
"id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampleosdiskname",
"storageAccountType": "StandardSSD_LRS"
},
"name": "exampleosdiskname",
"osType": "Windows",
"vhd": {
"uri": ""
},
"writeAcceleratorEnabled": "false"
},
"resourceDisk": {
"size": "4096"
}
},
"subscriptionId": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
"tags": "baz:bash;foo:bar",
"userData": "Zm9vYmFy",
"version": "15.05.22",
"virtualMachineScaleSet": {
"id": "/subscriptions/xxxxxxxx-xxxxx-xxx-xxx-xxxx/resourceGroups/resource-group-name/providers/Microsoft.Compute/virtualMachineScaleSets/virtual-machine-scale-set-name"
},
"vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6",
"vmScaleSetName": "crpteste9vflji9",
"vmSize": "Standard_A3",
"zone": ""
},
"network": {
"interface": [{
"ipv4": {
"ipAddress": [{
"privateIpAddress": "10.144.133.132",
"publicIpAddress": ""
}],
"subnet": [{
"address": "10.144.133.128",
"prefix": "26"
}]
},
"ipv6": {
"ipAddress": [
]
},
"macAddress": "0011AAFFBB22"
}]
}
}
Discriminação do esquema:
Computação
Dados | Description | Versão introduzida |
---|---|---|
azEnvironment |
Ambiente do Azure onde a VM está em execução | 2018-10-01 |
additionalCapabilities.hibernationEnabled |
Identifica se a hibernação está ativada na VM | 2021-11-01 |
customData |
Esta funcionalidade foi preterida e desativada no IMDS. Foi substituído por userData |
2019-02-01 |
evictionPolicy |
Define como uma VM spot será expulsa. | 2020-12-01 |
extendedLocation.type |
Tipo da localização expandida da VM. | 2021-03-01 |
extendedLocation.name |
Nome da localização expandida da VM | 2021-03-01 |
host.id |
Nome do anfitrião da VM. Tenha em atenção que uma VM terá um anfitrião ou um hostGroup, mas não ambos. | 2021-11-15 |
hostGroup.id |
Nome do hostGroup da VM. Tenha em atenção que uma VM terá um anfitrião ou um hostGroup, mas não ambos. | 2021-11-15 |
isHostCompatibilityLayerVm |
Identifica se a VM é executada na Camada de Compatibilidade do Anfitrião | 2020-06-01 |
licenseType |
Tipo de licença para Benefício Híbrido do Azure. Isto só está presente para VMs ativadas para AHB | 2020-09-01 |
location |
Região do Azure em que a VM está em execução | 2017-04-02 |
name |
Nome da VM | 2017-04-02 |
offer |
Disponibilizar informações para a imagem da VM e só está presente para imagens implementadas a partir da galeria de imagens do Azure | 2017-04-02 |
osProfile.adminUsername |
Especifica o nome da conta de administrador | 2020-07-15 |
osProfile.computerName |
Especifica o nome do computador | 2020-07-15 |
osProfile.disablePasswordAuthentication |
Especifica se a autenticação por palavra-passe está desativada. Isto só está presente para VMs do Linux | 2020-10-01 |
osType |
Linux ou Windows | 2017-04-02 |
placementGroupId |
Grupo de Colocação do conjunto de dimensionamento | 2017-08-01 |
plan |
Plano que contém o nome, o produto e o publicador de uma VM se for uma Imagem de Azure Marketplace | 2018-04-02 |
platformUpdateDomain |
Atualizar o domínio em que a VM está a ser executada | 2017-04-02 |
platformFaultDomain |
Domínio de falha no qual a VM está em execução | 2017-04-02 |
platformSubFaultDomain |
Sub domínio de falha em que a VM está em execução, se aplicável. | 2021-10-01 |
priority |
Prioridade da VM. Veja VMs spot para obter mais informações | 2020-12-01 |
provider |
Fornecedor da VM | 2018-10-01 |
publicKeys |
Coleção de Chaves Públicas atribuída à VM e caminhos | 2018-04-02 |
publisher |
Publicador da imagem da VM | 2017-04-02 |
resourceGroupName |
Grupo de recursos para a máquina virtual | 2017-08-01 |
resourceId |
O ID completamente qualificado do recurso | 2019-03-11 |
sku |
SKU específico para a imagem da VM | 2017-04-02 |
securityProfile.secureBootEnabled |
Identifica se o arranque seguro UEFI está ativado na VM | 2020-06-01 |
securityProfile.virtualTpmEnabled |
Identifica se o Virtual Trusted Platform Module (TPM) está ativado na VM | 2020-06-01 |
securityProfile.encryptionAtHost |
Identifica se a Encriptação no Anfitrião está ativada na VM | 2021-11-01 |
securityProfile.securityType |
Identifica se a VM é uma VM Fidedigna ou uma VM Confidencial | 2021-12-13 |
storageProfile |
Veja o Perfil de Armazenamento abaixo | 2019-06-01 |
subscriptionId |
Subscrição do Azure para a Máquina Virtual | 2017-08-01 |
tags |
Etiquetas para a máquina virtual | 2017-08-01 |
tagsList |
Etiquetas formatadas como uma matriz JSON para análise programática mais fácil | 2019-06-04 |
userData |
O conjunto de dados especificado quando a VM foi criada para utilização durante ou após o aprovisionamento (codificado em Base64) | 2021-01-01 |
version |
Versão da imagem da VM | 2017-04-02 |
virtualMachineScaleSet.id |
ID do Conjunto de Dimensionamento de Máquinas Virtuais criado com orquestração flexível em que a Máquina Virtual faz parte. Este campo não está disponível para Conjuntos de Dimensionamento de Máquinas Virtuais criados com orquestração uniforme. | 2021-03-01 |
vmId |
Identificador exclusivo da VM. O blogue referenciava apenas fatos para VMs com SMBIOS < 2.6. Para VMs que têm SMBIOS >= 2.6, o UUID da DMI é apresentado em formato pouco endiano, pelo que não é necessário mudar de bytes. | 2017-04-02 |
vmScaleSetName |
Nome do Conjunto de Dimensionamento de Máquinas Virtuais do conjunto de dimensionamento | 2017-12-01 |
vmSize |
Tamanho da VM | 2017-04-02 |
zone |
Zona de Disponibilidade da máquina virtual | 2017-12-01 |
† Esta versão ainda não está totalmente disponível e poderá não ser suportada em todas as regiões.
Perfil de armazenamento
O perfil de armazenamento de uma VM está dividido em três categorias: referência de imagem, disco do SO e discos de dados, além de um objeto adicional para o disco temporário local.
O objeto de referência de imagem contém as seguintes informações sobre a imagem do SO:
Dados | Description |
---|---|
id |
ID do Recurso |
offer |
Oferta da imagem da plataforma ou do marketplace |
publisher |
Publicador de imagens |
sku |
SKU da imagem |
version |
Versão da imagem da plataforma ou do marketplace |
O objeto de disco do SO contém as seguintes informações sobre o disco do SO utilizado pela VM:
Dados | Description |
---|---|
caching |
Requisitos de colocação em cache |
createOption |
Informações sobre como a VM foi criada |
diffDiskSettings |
Definições de disco efémero |
diskSizeGB |
Tamanho do disco em GB |
image |
Disco rígido virtual da imagem do utilizador de origem |
managedDisk |
Parâmetros de disco gerido |
name |
Nome do disco |
vhd |
Disco rígido virtual |
writeAcceleratorEnabled |
Se writeAccelerator está ou não ativado no disco |
A matriz de discos de dados contém uma lista de discos de dados anexados à VM. Cada objeto de disco de dados contém as seguintes informações:
Dados | Description | Versão introduzida |
---|---|---|
bytesPerSecondThrottle * |
Quota de leitura/escrita do disco em bytes | 2021-05-01 |
caching |
Requisitos de colocação em cache | 2019-06-01 |
createOption |
Informações sobre como a VM foi criada | 2019-06-01 |
diffDiskSettings |
Definições de disco efémero | 2019-06-01 |
diskCapacityBytes * |
Tamanho do disco em bytes | 2021-05-01 |
diskSizeGB |
Tamanho do disco em GB | 2019-06-01 |
encryptionSettings |
Definições de encriptação para o disco | 2019-06-01 |
image |
Disco rígido virtual da imagem do utilizador de origem | 2019-06-01 |
isSharedDisk †† |
Identifica se o disco é partilhado entre recursos | 2021-05-01 |
isUltraDisk |
Identifica se o disco de dados é um Disco Ultra | 2021-05-01 |
lun |
Número de unidade lógica do disco | 2019-06-01 |
managedDisk |
Parâmetros de disco gerido | 2019-06-01 |
name |
Nome do disco | 2019-06-01 |
opsPerSecondThrottle * |
Quota de leitura/escrita do disco em IOPS | 2021-05-01 |
osType |
Tipo de SO incluído no disco | 2019-06-01 |
vhd |
Disco rígido virtual | 2019-06-01 |
writeAcceleratorEnabled |
Se writeAccelerator está ou não ativado no disco | 2019-06-01 |
†† Estes campos só são preenchidos para Discos Ultra; são cadeias vazias de discos não Ultra.
O blob de definições de encriptação contém dados sobre como o disco é encriptado (se estiver encriptado):
Dados | Description | Versão introduzida |
---|---|---|
diskEncryptionKey.sourceVault.id |
A localização da chave de encriptação do disco | 2021-11-01 |
diskEncryptionKey.secretUrl |
A localização do segredo | 2021-11-01 |
keyEncryptionKey.sourceVault.id |
A localização da chave de encriptação da chave | 2021-11-01 |
keyEncryptionKey.keyUrl |
A localização da chave | 2021-11-01 |
O objeto de disco de recurso contém o tamanho do Disco Temporário Local anexado à VM, se tiver um, em quilobytes. Se não existir nenhum disco temporário local para a VM, este valor é 0.
Dados | Description | Versão introduzida |
---|---|---|
resourceDisk.size |
Tamanho do disco temporário local para a VM (em kB) | 2021-02-01 |
Rede
Dados | Description | Versão introduzida |
---|---|---|
ipv4.privateIpAddress |
Endereço IPv4 local da VM | 2017-04-02 |
ipv4.publicIpAddress |
Endereço IPv4 público da VM | 2017-04-02 |
subnet.address |
Endereço da sub-rede da VM | 2017-04-02 |
subnet.prefix |
Prefixo de sub-rede, exemplo 24 | 2017-04-02 |
ipv6.ipAddress |
Endereço IPv6 local da VM | 2017-04-02 |
macAddress |
Endereço mac da VM | 2017-04-02 |
Nota
As nics devolvidas pela chamada de rede não estão garantidas por ordem.
Obter dados de utilizador
Ao criar uma nova VM, pode especificar um conjunto de dados a utilizar durante ou após o aprovisionamento da VM e obtê-lo através do IMDS. Veja a experiência de dados do utilizador ponto a ponto aqui.
Para configurar os dados do utilizador, utilize o modelo de início rápido aqui. O exemplo abaixo mostra como obter estes dados através do IMDS. Esta funcionalidade é lançada com versão e versão 2021-01-01
superior.
Nota
Aviso de segurança: o IMDS está aberto a todas as aplicações na VM. Os dados confidenciais não devem ser colocados nos dados do utilizador.
$userData = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/userData?api-version=2021-01-01&format=text"
[System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($userData))
Exemplo 1: Controlar a VM em execução no Azure
Enquanto fornecedor de serviços, poderá ter de controlar o número de VMs que executam o software ou ter agentes que precisam de controlar a exclusividade da VM. Para obter um ID exclusivo para uma VM, utilize o campo do vmId
Instance Metadata Service.
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/vmId?api-version=2017-08-01&format=text"
Response
5c08b38e-4d57-4c23-ac45-aca61037f084
Exemplo 2: Colocação de réplicas de dados diferentes
Para determinados cenários, a colocação de réplicas de dados diferentes é de importância privilegiada. Por exemplo, a colocação de réplicas do HDFS ou o posicionamento do contentor através de um orquestrador poderá exigir que saiba o platformFaultDomain
e platformUpdateDomain
a VM está em execução.
Também pode utilizar Zonas de Disponibilidade para as instâncias tomarem estas decisões.
Pode consultar estes dados diretamente através do IMDS.
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/platformFaultDomain?api-version=2017-08-01&format=text"
Response
0
Exemplo 3: Obter etiquetas de VM
As etiquetas de VM estão incluídas na API de instância no ponto final de instância/computação/etiquetas. As etiquetas podem ter sido aplicadas à sua VM do Azure para organizá-las logicamente numa taxonomia. As etiquetas atribuídas a uma VM podem ser obtidas com o pedido abaixo.
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/tags?api-version=2017-08-01&format=text"
Response
Department:IT;ReferenceNumber:123456;TestStatus:Pending
O tags
campo é uma cadeia com as etiquetas delimitadas por ponto e vírgula. Este resultado pode ser um problema se forem utilizados pontos e vírgulas nas próprias etiquetas. Se um analisador for escrito para extrair programaticamente as etiquetas, deve confiar no tagsList
campo . O tagsList
campo é uma matriz JSON sem delimitadores e, consequentemente, mais fácil de analisar. A tagsList atribuída a uma VM pode ser obtida com o pedido abaixo.
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/tagsList?api-version=2019-06-04" | ConvertTo-Json -Depth 64
Response
{
"value": [
{
"name": "Department",
"value": "IT"
},
{
"name": "ReferenceNumber",
"value": "123456"
},
{
"name": "TestStatus",
"value": "Pending"
}
],
"Count": 3
}
Exemplo 4: Obter mais informações sobre a VM durante o pedido de suporte
Enquanto fornecedor de serviços, poderá receber uma chamada de suporte onde gostaria de saber mais informações sobre a VM. Pedir ao cliente para partilhar os metadados de computação pode fornecer informações básicas para o profissional de suporte saber sobre o tipo de VM no Azure.
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute?api-version=2020-09-01" | ConvertTo-Json -Depth 64
Response
Nota
A resposta é uma cadeia JSON. A seguinte resposta de exemplo é bastante impressa para legibilidade.
{
"azEnvironment": "AZUREPUBLICCLOUD",
"extendedLocation": {
"type": "edgeZone",
"name": "microsoftlosangeles"
},
"evictionPolicy": "",
"additionalCapabilities": {
"hibernationEnabled": "false"
},
"hostGroup": {
"id": "testHostGroupId"
},
"isHostCompatibilityLayerVm": "true",
"licenseType": "Windows_Client",
"location": "westus",
"name": "examplevmname",
"offer": "WindowsServer",
"osProfile": {
"adminUsername": "admin",
"computerName": "examplevmname",
"disablePasswordAuthentication": "true"
},
"osType": "Windows",
"placementGroupId": "f67c14ab-e92c-408c-ae2d-da15866ec79a",
"plan": {
"name": "planName",
"product": "planProduct",
"publisher": "planPublisher"
},
"platformFaultDomain": "36",
"platformUpdateDomain": "42",
"priority": "Regular",
"publicKeys": [{
"keyData": "ssh-rsa 0",
"path": "/home/user/.ssh/authorized_keys0"
},
{
"keyData": "ssh-rsa 1",
"path": "/home/user/.ssh/authorized_keys1"
}
],
"publisher": "RDFE-Test-Microsoft-Windows-Server-Group",
"resourceGroupName": "macikgo-test-may-23",
"resourceId": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/virtualMachines/examplevmname",
"securityProfile": {
"secureBootEnabled": "true",
"virtualTpmEnabled": "false",
"encryptionAtHost": "true",
"securityType": "TrustedLaunch"
},
"sku": "2019-Datacenter",
"storageProfile": {
"dataDisks": [{
"bytesPerSecondThrottle": "979202048",
"caching": "None",
"createOption": "Empty",
"diskCapacityBytes": "274877906944",
"diskSizeGB": "1024",
"image": {
"uri": ""
},
"isSharedDisk": "false",
"isUltraDisk": "true",
"lun": "0",
"managedDisk": {
"id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/MicrosoftCompute/disks/exampledatadiskname",
"storageAccountType": "StandardSSD_LRS"
},
"name": "exampledatadiskname",
"opsPerSecondThrottle": "65280",
"vhd": {
"uri": ""
},
"writeAcceleratorEnabled": "false"
}],
"imageReference": {
"id": "",
"offer": "WindowsServer",
"publisher": "MicrosoftWindowsServer",
"sku": "2019-Datacenter",
"version": "latest"
},
"osDisk": {
"caching": "ReadWrite",
"createOption": "FromImage",
"diskSizeGB": "30",
"diffDiskSettings": {
"option": "Local"
},
"encryptionSettings": {
"enabled": "false",
"diskEncryptionKey": {
"sourceVault": {
"id": "/subscriptions/test-source-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
},
"secretUrl": "https://test-disk.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
},
"keyEncryptionKey": {
"sourceVault": {
"id": "/subscriptions/test-key-guid/resourceGroups/testrg/providers/Microsoft.KeyVault/vaults/test-kv"
},
"keyUrl": "https://test-key.vault.azure.net/secrets/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
}
},
"image": {
"uri": ""
},
"managedDisk": {
"id": "/subscriptions/xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx/resourceGroups/macikgo-test-may-23/providers/Microsoft.Compute/disks/exampleosdiskname",
"storageAccountType": "StandardSSD_LRS"
},
"name": "exampleosdiskname",
"osType": "Windows",
"vhd": {
"uri": ""
},
"writeAcceleratorEnabled": "false"
},
"resourceDisk": {
"size": "4096"
}
},
"subscriptionId": "xxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx",
"tags": "baz:bash;foo:bar",
"version": "15.05.22",
"virtualMachineScaleSet": {
"id": "/subscriptions/xxxxxxxx-xxxxx-xxx-xxx-xxxx/resourceGroups/resource-group-name/providers/Microsoft.Compute/virtualMachineScaleSets/virtual-machine-scale-set-name"
},
"vmId": "02aab8a4-74ef-476e-8182-f6d2ba4166a6",
"vmScaleSetName": "crpteste9vflji9",
"vmSize": "Standard_A3",
"zone": ""
}
Exemplo 5: Obter o Ambiente do Azure onde a VM está em execução
O Azure tem várias clouds soberanas, como Azure Government. Por vezes, precisa do Ambiente do Azure para tomar algumas decisões de runtime. O exemplo seguinte mostra-lhe como pode alcançar este comportamento.
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/compute/azEnvironment?api-version=2018-10-01&format=text"
Response
AzurePublicCloud
A cloud e os valores do ambiente do Azure estão listados aqui.
Cloud | Ambiente do Azure |
---|---|
Todas as regiões globais do Azure disponíveis geralmente | AzurePublicCloud |
Azure Government | AzureUSGovernmentCloud |
Azure China 21Vianet | AzureChinaCloud |
Azure Alemanha | AzureGermanCloud |
Exemplo 6: Obter informações de rede
Pedir
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/network?api-version=2017-08-01" | ConvertTo-Json -Depth 64
Response
{
"interface": [
{
"ipv4": {
"ipAddress": [
{
"privateIpAddress": "10.1.0.4",
"publicIpAddress": "X.X.X.X"
}
],
"subnet": [
{
"address": "10.1.0.0",
"prefix": "24"
}
]
},
"ipv6": {
"ipAddress": []
},
"macAddress": "000D3AF806EC"
}
]
}
Exemplo 7: Obter o endereço IP público
Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri "http://169.254.169.254/metadata/instance/network/interface/0/ipv4/ipAddress/0/publicIpAddress?api-version=2017-08-01&format=text"
Nota
- Se quiser obter informações do IMDS para o endereço IP Público do SKU Standard, veja Balanceador de Carga API de Metadados para obter mais informações.
Dados atestados
Obter dados atestados
O IMDS ajuda a fornecer garantias de que os dados fornecidos provêm do Azure. A Microsoft assina parte destas informações, pelo que pode confirmar que uma imagem no Azure Marketplace é a que está a executar no Azure.
GET /metadata/attested/document
Parâmetros
Name | Obrigatório/Opcional | Descrição |
---|---|---|
api-version |
Obrigatório | A versão utilizada para atender o pedido. |
nonce |
Opcional | Uma cadeia de 10 dígitos que serve como um nonce criptográfico. Se não for fornecido nenhum valor, o IMDS utiliza o carimbo de data/hora UTC atual. |
Resposta
{
"encoding":"pkcs7",
"signature":"MIIEEgYJKoZIhvcNAQcCoIIEAzCCA/8CAQExDzANBgkqhkiG9w0BAQsFADCBugYJKoZIhvcNAQcBoIGsBIGpeyJub25jZSI6IjEyMzQ1NjY3NjYiLCJwbGFuIjp7Im5hbWUiOiIiLCJwcm9kdWN0IjoiIiwicHVibGlzaGVyIjoiIn0sInRpbWVTdGFtcCI6eyJjcmVhdGVkT24iOiIxMS8yMC8xOCAyMjowNzozOSAtMDAwMCIsImV4cGlyZXNPbiI6IjExLzIwLzE4IDIyOjA4OjI0IC0wMDAwIn0sInZtSWQiOiIifaCCAj8wggI7MIIBpKADAgECAhBnxW5Kh8dslEBA0E2mIBJ0MA0GCSqGSIb3DQEBBAUAMCsxKTAnBgNVBAMTIHRlc3RzdWJkb21haW4ubWV0YWRhdGEuYXp1cmUuY29tMB4XDTE4MTEyMDIxNTc1N1oXDTE4MTIyMDIxNTc1NlowKzEpMCcGA1UEAxMgdGVzdHN1YmRvbWFpbi5tZXRhZGF0YS5henVyZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAML/tBo86ENWPzmXZ0kPkX5dY5QZ150mA8lommszE71x2sCLonzv4/UWk4H+jMMWRRwIea2CuQ5RhdWAHvKq6if4okKNt66fxm+YTVz9z0CTfCLmLT+nsdfOAsG1xZppEapC0Cd9vD6NCKyE8aYI1pliaeOnFjG0WvMY04uWz2MdAgMBAAGjYDBeMFwGA1UdAQRVMFOAENnYkHLa04Ut4Mpt7TkJFfyhLTArMSkwJwYDVQQDEyB0ZXN0c3ViZG9tYWluLm1ldGFkYXRhLmF6dXJlLmNvbYIQZ8VuSofHbJRAQNBNpiASdDANBgkqhkiG9w0BAQQFAAOBgQCLSM6aX5Bs1KHCJp4VQtxZPzXF71rVKCocHy3N9PTJQ9Fpnd+bYw2vSpQHg/AiG82WuDFpPReJvr7Pa938mZqW9HUOGjQKK2FYDTg6fXD8pkPdyghlX5boGWAMMrf7bFkup+lsT+n2tRw2wbNknO1tQ0wICtqy2VqzWwLi45RBwTGB6DCB5QIBATA/MCsxKTAnBgNVBAMTIHRlc3RzdWJkb21haW4ubWV0YWRhdGEuYXp1cmUuY29tAhBnxW5Kh8dslEBA0E2mIBJ0MA0GCSqGSIb3DQEBCwUAMA0GCSqGSIb3DQEBAQUABIGAld1BM/yYIqqv8SDE4kjQo3Ul/IKAVR8ETKcve5BAdGSNkTUooUGVniTXeuvDj5NkmazOaKZp9fEtByqqPOyw/nlXaZgOO44HDGiPUJ90xVYmfeK6p9RpJBu6kiKhnnYTelUk5u75phe5ZbMZfBhuPhXmYAdjc7Nmw97nx8NnprQ="
}
O blob de assinaturas é uma versão do documento assinada por pkcs7. Contém o certificado utilizado para assinar juntamente com determinados detalhes específicos da VM.
Para VMs criadas com o Azure Resource Manager, o documento inclui vmId
, sku
, nonce
, , subscriptionId
para timeStamp
criação e expiração do documento e as informações do plano sobre a imagem. As informações do plano só são preenchidas para Azure Marketplace imagens.
Para VMs criadas com o modelo de implementação clássica, apenas as vmId
e subscriptionId
têm a garantia de ser preenchidas. Pode extrair o certificado da resposta e utilizá-lo para confirmar que a resposta é válida e vem do Azure.
O documento descodificado contém os seguintes campos:
Dados | Description | Versão introduzida |
---|---|---|
licenseType |
Tipo de licença para Benefício Híbrido do Azure. Isto só está presente para VMs ativadas por AHB. | 2020-09-01 |
nonce |
Uma cadeia que pode ser fornecida opcionalmente com o pedido. Se não nonce tiver sido fornecido, é utilizado o carimbo de data/hora da Hora Universal Coordenada atual. |
2018-10-01 |
plan |
O plano imagem do Azure Marketplace. Contém o ID do plano (nome), a imagem ou oferta do produto (produto) e o ID do publicador (publicador). | 2018-10-01 |
timestamp.createdOn |
O carimbo de data/hora UTC para quando o documento assinado foi criado | 2018-20-01 |
timestamp.expiresOn |
O carimbo de data/hora UTC para quando o documento assinado expirar | 2018-10-01 |
vmId |
Identificador exclusivo da VM | 2018-10-01 |
subscriptionId |
Subscrição do Azure para a Máquina Virtual | 2019-04-30 |
sku |
SKU específico para a imagem da VM (correlaciona com a compute/sku propriedade do ponto final de Metadados de Instância [/metadata/instance ]) |
2019-11-01 |
Nota
Para VMs Clássicas (não Azure Resource Manager), apenas o vmId é garantido para ser preenchido.
Documento de exemplo:
{
"nonce":"20201130-211924",
"plan":{
"name":"planName",
"product":"planProduct",
"publisher":"planPublisher"
},
"sku":"Windows-Server-2012-R2-Datacenter",
"subscriptionId":"8d10da13-8125-4ba9-a717-bf7490507b3d",
"timeStamp":{
"createdOn":"11/30/20 21:19:19 -0000",
"expiresOn":"11/30/20 21:19:24 -0000"
},
"vmId":"02aab8a4-74ef-476e-8182-f6d2ba4166a6"
}
Exemplo 1: Validar que a VM está em execução no Azure
Os fornecedores no Azure Marketplace querem garantir que o software está licenciado para ser executado apenas no Azure. Se alguém copiar o VHD para um ambiente no local, o fornecedor tem de conseguir detetá-lo. Através do IMDS, estes fornecedores podem obter dados assinados que garantem apenas a resposta do Azure.
Nota
Este exemplo requer que o utilitário jq seja instalado.
Validação
# Get the signature
$attestedDoc = Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -NoProxy -Uri http://169.254.169.254/metadata/attested/document?api-version=2020-09-01
# Decode the signature
$signature = [System.Convert]::FromBase64String($attestedDoc.signature)
Verifique se a assinatura é do Microsoft Azure e verifica se existem erros na cadeia de certificados.
# Get certificate chain
$cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]($signature)
$chain = New-Object -TypeName System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($cert)
# Print the Subject of each certificate in the chain
foreach($element in $chain.ChainElements)
{
Write-Host $element.Certificate.Subject
}
# Get the content of the signed document
Add-Type -AssemblyName System.Security
$signedCms = New-Object -TypeName System.Security.Cryptography.Pkcs.SignedCms
$signedCms.Decode($signature);
$content = [System.Text.Encoding]::UTF8.GetString($signedCms.ContentInfo.Content)
Write-Host "Attested data: " $content
$json = $content | ConvertFrom-Json
# Do additional validation here
O nonce
no documento assinado pode ser comparado se tiver fornecido um nonce
parâmetro no pedido inicial.
Nota
O certificado para a cloud pública e cada cloud soberana será diferente.
Cloud | Certificado |
---|---|
Todas as regiões globais do Azure disponíveis geralmente | *.metadata.azure.com |
Azure Government | *.metadata.azure.us |
Azure China 21Vianet | *.metadata.azure.cn |
Azure Alemanha | *.metadata.microsoftazure.de |
Nota
Os certificados podem não ter uma correspondência exata de metadata.azure.com
para a cloud pública. Por este motivo, a validação da certificação deve permitir um nome comum a partir de qualquer .metadata.azure.com
subdomínio.
Nos casos em que não é possível transferir o certificado intermédio devido a restrições de rede durante a validação, pode afixar o certificado intermédio. O Azure implementa os certificados, o que é uma prática PKI padrão. Tem de atualizar os certificados afixados quando ocorre o rollover. Sempre que estiver planeada uma alteração para atualizar o certificado intermédio, o blogue do Azure é atualizado e os clientes do Azure são notificados.
Pode encontrar os certificados intermédios nesta página. Os certificados intermédios para cada uma das regiões podem ser diferentes.
Nota
O certificado intermédio para o Azure China 21Vianet será da DigiCert Global Root CA, em vez de Baltimore. Se afixou os certificados intermédios para o Azure China como parte de uma alteração da autoridade de cadeia de raiz, os certificados intermédios têm de ser atualizados.
Nota
A partir de fevereiro de 2022, os nossos certificados de Dados Atestados serão afetados por uma alteração do TLS. Devido a isso, a AC de raiz mudará de Baltimore CyberTrust para DigiCert Global G2 apenas para clouds públicas e do Governo dos EUA. Se tiver o certificado Baltimore CyberTrust ou outros certificados intermédios listados nesta mensagem afixados, siga as instruções indicadas imediatamente para evitar quaisquer interrupções da utilização do ponto final Dados Atestados.
Identidade gerida
Uma identidade gerida, atribuída pelo sistema, pode ser ativada na VM. Também pode atribuir uma ou mais identidades geridas atribuídas pelo utilizador à VM. Em seguida, pode pedir tokens para identidades geridas do IMDS. Utilize estes tokens para se autenticar com outros serviços do Azure, como o Azure Key Vault.
Para obter passos detalhados para ativar esta funcionalidade, veja Adquirir um token de acesso.
Metadados do Balanceador de Carga
Quando coloca instâncias de máquina virtual ou de conjunto de máquinas virtuais atrás de um Balanceador de Carga Standard do Azure, pode utilizar o IMDS para obter metadados relacionados com o balanceador de carga e as instâncias. Para obter mais informações, veja Obter informações do balanceador de carga.
Eventos agendados
Pode obter o estado dos eventos agendados com o IMDS. Em seguida, o utilizador pode especificar um conjunto de ações a executar nestes eventos. Para obter mais informações, veja Scheduled events for Linux or Scheduled events for Windows (Eventos agendados para o Linux ou Eventos agendados para o Windows).
Código de exemplo em idiomas diferentes
A tabela seguinte lista exemplos de IMDS de chamada através de idiomas diferentes dentro da VM:
Erros e depuração
Se não for encontrado um elemento de dados ou um pedido com formato incorreto, o Instance Metadata Service devolve erros HTTP padrão. Por exemplo:
Código de estado de HTTP | Razão |
---|---|
200 OK |
O pedido foi efetuado com êxito. |
400 Bad Request |
Cabeçalho em falta Metadata: true ou parâmetro format=json em falta ao consultar um nó de folha |
404 Not Found |
O elemento pedido não existe |
405 Method Not Allowed |
O método HTTP (verbo) não é suportado no ponto final. |
410 Gone |
Repetir após algum tempo durante um máximo de 70 segundos |
429 Too Many Requests |
Os Limites da Taxa de API foram excedidos |
500 Service Error |
Tentar novamente após algum tempo |
Perguntas mais frequentes
Estou a receber o erro
400 Bad Request, Required metadata header not specified
. O que é que isto quer dizer?- O IMDS requer que o cabeçalho
Metadata: true
seja transmitido no pedido. Transmitir este cabeçalho na chamada REST permite o acesso ao IMDS.
- O IMDS requer que o cabeçalho
Por que motivo não estou a obter informações de computação para a minha VM?
- Atualmente, o IMDS só suporta instâncias criadas com o Azure Resource Manager.
Criei a minha VM através do Azure Resource Manager há algum tempo. Por que motivo não estou a ver informações de metadados de computação?
- Se tiver criado a VM depois de setembro de 2016, adicione uma etiqueta para começar a ver metadados de computação. Se tiver criado a VM antes de setembro de 2016, adicione ou remova extensões ou discos de dados à instância da VM para atualizar metadados.
Os dados de utilizador são os mesmos que os dados personalizados?
- Os dados de utilizador oferecem uma funcionalidade semelhante aos dados personalizados, permitindo-lhe transmitir os seus próprios metadados para a instância da VM. A diferença é que os dados do utilizador são obtidos através do IMDS e são persistentes ao longo da duração da instância da VM. A funcionalidade de dados personalizados existente continuará a funcionar conforme descrito neste artigo. No entanto, só pode obter dados personalizados através da pasta do sistema local, não através do IMDS.
Por que motivo não vejo todos os dados preenchidos para uma nova versão?
- Se tiver criado a VM depois de setembro de 2016, adicione uma etiqueta para começar a ver metadados de computação. Se tiver criado a VM antes de setembro de 2016, adicione ou remova extensões ou discos de dados à instância da VM para atualizar metadados.
Por que motivo estou a receber o erro
500 Internal Server Error
ou410 Resource Gone
?- Repita o pedido. Para obter mais informações, veja Processamento de falhas transitórias. Se o problema persistir, crie um problema de suporte no portal do Azure para a VM.
Isto funcionaria para instâncias de conjuntos de dimensionamento?
- Sim, o IMDS está disponível para instâncias de conjuntos de dimensionamento.
Atualizei as minhas etiquetas nos meus conjuntos de dimensionamento, mas não aparecem nas instâncias (ao contrário das VMs de instância única). Estou a fazer algo de errado?
- Atualmente, as etiquetas para conjuntos de dimensionamento só são apresentadas à VM numa alteração de reinício, imagem ou disco para a instância.
Por que motivo não estou a ver as informações do SKU da minha VM em
instance/compute
detalhes?- Para imagens personalizadas criadas a partir de Azure Marketplace, a plataforma do Azure não retém as informações de SKU da imagem personalizada e os detalhes de quaisquer VMs criadas a partir da imagem personalizada. Isto é por predefinição e, portanto, não é apresentado nos detalhes da VM
instance/compute
.
- Para imagens personalizadas criadas a partir de Azure Marketplace, a plataforma do Azure não retém as informações de SKU da imagem personalizada e os detalhes de quaisquer VMs criadas a partir da imagem personalizada. Isto é por predefinição e, portanto, não é apresentado nos detalhes da VM
Porque é que o meu pedido excedeu o limite de tempo para a minha chamada para o serviço?
As chamadas de metadados têm de ser efetuadas a partir do endereço IP primário atribuído à placa de rede principal da VM. Além disso, se tiver alterado as rotas, tem de existir uma rota para o endereço 169.254.169.254/32 na tabela de encaminhamento local da VM.
- Despeje a tabela de encaminhamento local e procure a entrada IMDS. Por exemplo:
> route print IPv4 Route Table =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 172.16.69.1 172.16.69.7 10 127.0.0.0 255.0.0.0 On-link 127.0.0.1 331 127.0.0.1 255.255.255.255 On-link 127.0.0.1 331 127.255.255.255 255.255.255.255 On-link 127.0.0.1 331 168.63.129.16 255.255.255.255 172.16.69.1 172.16.69.7 11 169.254.169.254 255.255.255.255 172.16.69.1 172.16.69.7 11 ... (continues) ...
- Verifique se existe uma rota para
169.254.169.254
e anote a interface de rede correspondente (por exemplo,172.16.69.7
). - Despeje a configuração da interface e localize a interface que corresponde à referenciada na tabela de encaminhamento, observando o endereço MAC (físico).
> ipconfig /all ... (continues) ... Ethernet adapter Ethernet: Connection-specific DNS Suffix . : xic3mnxjiefupcwr1mcs1rjiqa.cx.internal.cloudapp.net Description . . . . . . . . . . . : Microsoft Hyper-V Network Adapter Physical Address. . . . . . . . . : 00-0D-3A-E5-1C-C0 DHCP Enabled. . . . . . . . . . . : Yes Autoconfiguration Enabled . . . . : Yes Link-local IPv6 Address . . . . . : fe80::3166:ce5a:2bd5:a6d1%3(Preferred) IPv4 Address. . . . . . . . . . . : 172.16.69.7(Preferred) Subnet Mask . . . . . . . . . . . : 255.255.255.0 ... (continues) ...
- Confirme que a interface corresponde ao NIC primário e ao IP primário da VM. Pode encontrar o NIC e o IP primários ao observar a configuração de rede no portal do Azure ou ao procurá-lo com a CLI do Azure. Tenha em atenção os IPs privados (e o endereço MAC, se estiver a utilizar a CLI). Eis um exemplo da CLI do PowerShell:
$ResourceGroup = '<Resource_Group>' $VmName = '<VM_Name>' $NicNames = az vm nic list --resource-group $ResourceGroup --vm-name $VmName | ConvertFrom-Json | Foreach-Object { $_.id.Split('/')[-1] } foreach($NicName in $NicNames) { $Nic = az vm nic show --resource-group $ResourceGroup --vm-name $VmName --nic $NicName | ConvertFrom-Json Write-Host $NicName, $Nic.primary, $Nic.macAddress } # Output: wintest767 True 00-0D-3A-E5-1C-C0
- Se não corresponderem, atualize a tabela de encaminhamento para que o NIC e o IP primários sejam visados.
- Despeje a tabela de encaminhamento local e procure a entrada IMDS. Por exemplo:
Ativação pós-falha do clustering no Windows Server
Ao consultar o IMDS com o clustering de ativação pós-falha, por vezes é necessário adicionar uma rota à tabela de encaminhamento. Eis como:
Abra uma linha de comandos com privilégios de administrador.
Execute o seguinte comando e anote o endereço da Interface para Destino de Rede (
0.0.0.0
) na Tabela de Rotas IPv4.
route print
Nota
O seguinte exemplo de saída é de uma VM do Windows Server com o cluster de ativação pós-falha ativado. Para simplificar, a saída contém apenas a Tabela de Rotas IPv4.
IPv4 Route Table =========================================================================== Active Routes: Network Destination Netmask Gateway Interface Metric 0.0.0.0 0.0.0.0 10.0.1.1 10.0.1.10 266 10.0.1.0 255.255.255.192 On-link 10.0.1.10 266 10.0.1.10 255.255.255.255 On-link 10.0.1.10 266 10.0.1.15 255.255.255.255 On-link 10.0.1.10 266 10.0.1.63 255.255.255.255 On-link 10.0.1.10 266 127.0.0.0 255.0.0.0 On-link 127.0.0.1 331 127.0.0.1 255.255.255.255 On-link 127.0.0.1 331 127.255.255.255 255.255.255.255 On-link 127.0.0.1 331 169.254.0.0 255.255.0.0 On-link 169.254.1.156 271 169.254.1.156 255.255.255.255 On-link 169.254.1.156 271 169.254.255.255 255.255.255.255 On-link 169.254.1.156 271 224.0.0.0 240.0.0.0 On-link 127.0.0.1 331 224.0.0.0 240.0.0.0 On-link 169.254.1.156 271 255.255.255.255 255.255.255.255 On-link 127.0.0.1 331 255.255.255.255 255.255.255.255 On-link 169.254.1.156 271 255.255.255.255 255.255.255.255 On-link 10.0.1.10 266
Execute o seguinte comando e utilize o endereço da Interface para Destino de Rede (
0.0.0.0
), que é (10.0.1.10
) neste exemplo.route add 169.254.169.254/32 10.0.1.10 metric 1 -p
Suporte
Se não conseguir obter uma resposta de metadados após várias tentativas, pode criar um problema de suporte no portal do Azure.
Comentários sobre o produto
Pode fornecer comentários e ideias de produtos ao nosso canal de comentários dos utilizadores em Máquinas Virtuais > Instance Metadata Service aqui