Tutorial: Use uma identidade gerenciada atribuída pelo sistema VM do Windows para acessar o Armazenamento do Microsoft Azure por meio de uma credencial SAS

Identidades gerenciadas para recursos do Azure é um recurso do Microsoft Entra ID. Cada um dos serviços do Azure que dão suporte a identidades gerenciadas para recursos do Azure está sujeito à própria linha do tempo. Não deixe de examinar o status de disponibilidade das identidades gerenciadas do seu recurso e os problemas conhecidos antes de começar.

Este tutorial mostra como usar uma identidade atribuída pelo sistema para uma máquina virtual do Windows (VM) para obter uma credencial SAS (Storage Access Signature) de armazenamento. Especificamente, uma credencial SAS de serviço.

Uma SAS de Serviço permite conceder acesso limitado a objetos em uma conta de armazenamento por tempo limitado e para um serviço específico (em nosso caso, o serviço blob) sem expor uma chave de acesso de conta. Você pode usar a credencial SAS normalmente ao realizar operações de armazenamento, por exemplo, ao usar o SDK de Armazenamento. Para este tutorial, vamos demonstrar o upload e o download de um blob usando o PowerShell do Armazenamento do Azure. Você saberá como:

  • Criar uma conta de armazenamento
  • Conceda à sua VM acesso a SAS de conta de armazenamento no Resource Manager
  • Obter um token de acesso usando a identidade da VM e usá-lo para recuperar SAS do Resource Manager

Pré-requisitos

Observação

Recomendamos que você use o módulo Az PowerShell do Azure para interagir com o Azure. Confira Instalar o Azure PowerShell para começar. Para saber como migrar para o módulo Az PowerShell, confira Migrar o Azure PowerShell do AzureRM para o Az.

Criar uma conta de armazenamento

Se você ainda não tiver uma, agora você criará uma conta de armazenamento. Você também pode pular esta etapa e conceder acesso de identidade gerenciada atribuído pelo sistema da VM à credencial SAS de uma conta de armazenamento existente.

  1. Selecione o botão +/Criar novo serviço localizado no canto superior esquerdo do portal do Azure.

  2. Selecione Armazenamento, em seguida, Conta de armazenamento, e um novo painel "Criar conta de armazenamento" será exibido.

  3. Insira um nome para a conta de armazenamento que você está usando neste tutorial.

  4. Modelo de implantação e Tipo de conta devem ser definidos como "Resource Manager" e "Uso geral", respectivamente.

  5. Verifique se a Assinatura e o Grupo de Recursos correspondem ao que você especificou quando criou sua VM na etapa anterior.

  6. Selecione Criar.

    Captura de tela mostrando como criar uma conta de armazenamento.

Criar um contêiner de blobs na conta de armazenamento

Mais tarde vamos carregar e baixar um arquivo para a nova conta de armazenamento. Como arquivos exigem armazenamento de blobs, é preciso criar um contêiner de blobs para armazenar o arquivo.

  1. Navegue de volta para sua conta de armazenamento criado recentemente.

  2. Selecione o link Contêineres no painel esquerdo, em "serviço Blob."

  3. Selecione + Contêiner na parte superior da página e um painel "Novo contêiner" desliza para fora.

  4. Dê um nome ao contêiner, selecione um nível de acesso e escolha OK. O nome especificado será usado posteriormente no tutorial.

    Captura de tela mostrando como criar um contêiner de armazenamento.

Conceder à identidade gerenciada atribuída pelo sistema da VM acesso para usar um SAS de armazenamento

O Armazenamento do Azure não dá suporte nativo à autenticação do Microsoft Entra. No entanto, você pode usar uma identidade gerenciada para recuperar um SAS de armazenamento do Resource Manager e usar o SAS para acessar o armazenamento. Nesta etapa, você concede o acesso à identidade gerenciada atribuída pelo sistema da VM à sua conta de armazenamento SAS.

  1. Navegue de volta para sua conta de armazenamento criado recentemente.  

  2. Selecione IAM (Controle de acesso) .

  3. Selecione Adicionar>Adicionar atribuição de função para abrir a página Adicionar atribuição de função.

  4. Atribua a função a seguir. Para ver as etapas detalhadas, confira Atribuir funções do Azure usando o portal do Azure.

    Configuração Valor
    Função Colaborador da Conta de Armazenamento
    Atribuir acesso a Identidade gerenciada
    Atribuída pelo sistema Máquina Virtual
    Selecionar <sua máquina virtual do Windows>

    Captura de tela que mostra a página para adicionar uma atribuição de função.

Obter um token de acesso usando a identidade da máquina virtual e usá-la para chamar o Azure Resource Manager

Para o restante do tutorial, trabalharemos na sua VM.

Você precisará usar os cmdlets do PowerShell do Azure Resource Manager nesta parte. Se ele não estiver instalado, baixe a versão mais recente antes de continuar.

  1. No portal do Azure, navegue até Máquinas Virtuais, acesse sua máquina virtual do Windows e, na página Visão geral, selecione Conectar na parte superior.

  2. Insira o seu Nome de usuário e Senha que você adicionou quando criou a VM do Windows.

  3. Agora você criou uma Conexão de Área de Trabalho Remota com a máquina virtual.

  4. Abra o PowerShell na sessão remota e use Invoke-WebRequest para obter um token do Azure Resource Manager da identidade gerenciada local para o ponto de extremidade de recursos do Azure.

       $response = Invoke-WebRequest -Uri 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F' -Method GET -Headers @{Metadata="true"}
    

    Observação

    O valor do parâmetro “resource” precisa ser uma correspondência exata do que é esperado pela ID do Microsoft Entra. Ao usar a ID de recurso do Azure Resource Manager, você deve incluir a barra à direita no URI.

    Em seguida, extraia o elemento “Conteúdo”, que está armazenado como uma cadeia de caracteres formatada em JSON (JavaScript Object Notation) no objeto $response.

    $content = $response.Content | ConvertFrom-Json
    

    Em seguida, extraia o token de acesso da resposta.

    $ArmToken = $content.access_token
    

Obter uma credencial SAS do Azure Resource Manager para fazer chamadas de armazenamento

Agora use o PowerShell para chamar o Resource Manager usando o token de acesso recuperado da seção anterior para criar uma credencial SAS de armazenamento. Quando tivermos a credencial SAS, poderemos chamar as operações de armazenamento.

Para esta solicitação, usaremos os seguintes parâmetros de solicitação HTTP para criar a credencial SAS:

{
    "canonicalizedResource":"/blob/<STORAGE ACCOUNT NAME>/<CONTAINER NAME>",
    "signedResource":"c",              // The kind of resource accessible with the SAS, in this case a container (c).
    "signedPermission":"rcw",          // Permissions for this SAS, in this case (r)ead, (c)reate, and (w)rite. Order is important.
    "signedProtocol":"https",          // Require the SAS be used on https protocol.
    "signedExpiry":"<EXPIRATION TIME>" // UTC expiration time for SAS in ISO 8601 format, for example 2017-09-22T00:06:00Z.
}

Esses parâmetros são incluídos no corpo da POSTAGEM da solicitação para a credencial SAS. Para obter mais informações sobre os parâmetros para a criação de uma credencial SAS, consulte Referência REST de SAS do Serviço de Lista.

Primeiro, converta os parâmetros em JSON e, em seguida, chame o ponto de extremidade listServiceSas de armazenamento para criar a credencial SAS:

$params = @{canonicalizedResource="/blob/<STORAGE-ACCOUNT-NAME>/<CONTAINER-NAME>";signedResource="c";signedPermission="rcw";signedProtocol="https";signedExpiry="2017-09-23T00:00:00Z"}
$jsonParams = $params | ConvertTo-Json
$sasResponse = Invoke-WebRequest -Uri https://management.azure.com/subscriptions/<SUBSCRIPTION-ID>/resourceGroups/<RESOURCE-GROUP>/providers/Microsoft.Storage/storageAccounts/<STORAGE-ACCOUNT-NAME>/listServiceSas/?api-version=2017-06-01 -Method POST -Body $jsonParams -Headers @{Authorization="Bearer $ArmToken"}

Observação

A URL diferencia maiúsculas de minúsculas, portanto, certifique-se de usar letras maiúsculas e minúsculas exatamente da mesma forma que você usou anteriormente ao nomear o Grupo de Recursos, incluindo a letra maiúscula "G" em "resourceGroups".

Agora podemos pode extrair a credencial SAS da resposta:

$sasContent = $sasResponse.Content | ConvertFrom-Json
$sasCred = $sasContent.serviceSasToken

Se você inspecionar as credenciais SAS, verá algo assim:

PS C:\> $sasCred
sv=2015-04-05&sr=c&spr=https&se=2017-09-23T00%3A00%3A00Z&sp=rcw&sig=JVhIWG48nmxqhTIuN0uiFBppdzhwHdehdYan1W%2F4O0E%3D

Em seguida, criamos um arquivo chamado "test.txt". Em seguida, use a credencial SAS para autenticar-se com o cmdlet New-AzStorageContent, carregar o arquivo para nosso contêiner de blob e então baixar o arquivo.

echo "This is a test text file." > test.txt

Certifique-se instalar os cmdlets do Armazenamento do Azure primeiro, usando Install-Module Azure.Storage. Então carregue o blob recém-criado usando o cmdlet do PowerShell Set-AzStorageBlobContent:

$ctx = New-AzStorageContext -StorageAccountName <STORAGE-ACCOUNT-NAME> -SasToken $sasCred
Set-AzStorageBlobContent -File test.txt -Container <CONTAINER-NAME> -Blob testblob -Context $ctx

Resposta:

ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
BlobType          : BlockBlob
Length            : 56
ContentType       : application/octet-stream
LastModified      : 9/21/2017 6:14:25 PM +00:00
SnapshotTime      :
ContinuationToken :
Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
Name              : testblob

Você também pode baixar o blob que carregou, usando o cmdlet do PowerShell Get-AzStorageBlobContent:

Get-AzStorageBlobContent -Blob testblob -Container <CONTAINER-NAME> -Destination test2.txt -Context $ctx

Resposta:

ICloudBlob        : Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob
BlobType          : BlockBlob
Length            : 56
ContentType       : application/octet-stream
LastModified      : 9/21/2017 6:14:25 PM +00:00
SnapshotTime      :
ContinuationToken :
Context           : Microsoft.WindowsAzure.Commands.Storage.AzureStorageContext
Name              : testblob

Próximas etapas

Neste tutorial, você aprendeu a usar a identidade gerenciada atribuída pelo sistema de uma VM do Windows para acessar o Armazenamento do Azure usando uma credencial SAS. Para saber mais sobre SAS de Armazenamento do Azure, confira: