Criar uma SAS de delegação de usuário para um contêiner ou blob com o PowerShell

Uma assinatura de acesso compartilhado (SAS) permite que você conceda acesso limitado a contêineres e blobs em sua conta de armazenamento. Ao criar uma SAS, você especifica suas restrições, incluindo quais recursos do Armazenamento do Azure um cliente tem permissão para acessar, quais permissões eles têm nesses recursos e por quanto tempo a SAS é válida.

Cada SAS é assinado com uma chave. Você pode assinar uma SAS de duas maneiras:

  • Com uma chave criada usando credenciais do Microsoft Entra. Uma SAS assinada com credenciais do Microsoft Entra é uma SAS de delegação de usuário. Um cliente que cria uma SAS de delegação de usuário deve receber uma função RBAC do Azure que inclua a ação Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. Para saber mais, consulte Criar uma SAS de delegação de usuário.
  • Com a chave da conta de armazenamento. Tanto uma SAS de serviço quanto uma SAS de conta são assinadas com a chave da conta de armazenamento. O cliente que cria uma SAS de serviço deve ter acesso direto à chave da conta ou receber a permissão Microsoft.Storage/storageAccounts/listkeys/action . Para saber mais, consulte Criar uma SAS de serviço ou Criar uma SAS de conta.

Nota

Uma SAS de delegação de usuário oferece segurança superior a uma SAS assinada com a chave da conta de armazenamento. A Microsoft recomenda o uso de uma SAS de delegação de usuário quando possível. Para obter mais informações, consulte Conceder acesso limitado a dados com assinaturas de acesso compartilhado (SAS).

Este artigo mostra como usar as credenciais do Microsoft Entra para criar uma SAS de delegação de usuário para um contêiner ou blob com o Azure PowerShell.

Sobre a delegação de usuários SAS

Um token SAS para acesso a um contêiner ou blob pode ser protegido usando credenciais do Microsoft Entra ou uma chave de conta. Uma SAS protegida com credenciais do Microsoft Entra é chamada de SAS de delegação de usuário, porque o token OAuth 2.0 usado para assinar a SAS é solicitado em nome do usuário.

A Microsoft recomenda que você use as credenciais do Microsoft Entra quando possível como uma prática recomendada de segurança, em vez de usar a chave da conta, que pode ser comprometida mais facilmente. Quando o design do aplicativo exigir assinaturas de acesso compartilhado, use as credenciais do Microsoft Entra para criar uma SAS de delegação de usuário para segurança superior. Para obter mais informações sobre a SAS de delegação de usuário, consulte Criar uma SAS de delegação de usuário.

Atenção

Qualquer cliente que possua uma SAS válida pode aceder aos dados na sua conta de armazenamento conforme permitido por essa SAS. É importante proteger uma SAS contra uso mal-intencionado ou não intencional. Use discrição na distribuição de um SAS e tenha um plano para revogar um SAS comprometido.

Para obter mais informações sobre assinaturas de acesso compartilhado, consulte Conceder acesso limitado aos recursos do Armazenamento do Azure usando assinaturas de acesso compartilhado (SAS).

Instalar o módulo do PowerShell

Para criar uma SAS de delegação de usuário com o PowerShell, instale a versão 1.10.0 ou posterior do módulo Az.Storage. Siga estes passos para instalar a versão mais recente do módulo:

  1. Desinstale todas as instalações anteriores do Azure PowerShell:

    • Remova todas as instalações anteriores do Azure PowerShell do Windows usando a configuração de recursos Apps & em Configurações.
    • Remova todos os módulos do Azure do %Program Files%\WindowsPowerShell\Modules.
  2. Verifique se você tem a versão mais recente do PowerShellGet instalada. Abra uma janela do Windows PowerShell e execute o seguinte comando para instalar a versão mais recente:

    Install-Module PowerShellGet -Repository PSGallery -Force
    
  3. Feche e reabra a janela do PowerShell depois de instalar o PowerShellGet.

  4. Instale a versão mais recente do Azure PowerShell:

    Install-Module Az -Repository PSGallery -AllowClobber
    
  5. Certifique-se de ter instalado o Azure PowerShell versão 3.2.0 ou posterior. Execute o seguinte comando para instalar a versão mais recente do módulo PowerShell de Armazenamento do Azure:

    Install-Module -Name Az.Storage -Repository PSGallery -Force
    
  6. Feche e reabra a janela do PowerShell.

Para verificar qual versão do módulo Az.Storage está instalada, execute o seguinte comando:

Get-Module -ListAvailable -Name Az.Storage -Refresh

Para obter mais informações sobre como instalar o Azure PowerShell, consulte Instalar o Azure PowerShell com PowerShellGet.

Entrar no Azure PowerShell com o Microsoft Entra ID

Chame o comando Connect-AzAccount para entrar com sua conta do Microsoft Entra:

Connect-AzAccount

Para obter mais informações sobre como entrar com o PowerShell, consulte Entrar com o Azure PowerShell.

Atribuir permissões com o Azure RBAC

Para criar uma SAS de delegação de usuário a partir do Azure PowerShell, a conta do Microsoft Entra usada para entrar no PowerShell deve receber uma função que inclua a ação Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. Essa permissão permite que a conta do Microsoft Entra solicite a chave de delegação do usuário. A chave de delegação do usuário é usada para assinar a SAS de delegação do usuário. A função que fornece a ação Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey deve ser atribuída no nível da conta de armazenamento, do grupo de recursos ou da assinatura. Para obter mais informações sobre as permissões do Azure RBAC para criar uma SAS de delegação de usuário, consulte a seção Atribuir permissões com o RBAC do Azure em Criar uma SAS de delegação de usuário.

Se você não tiver permissões suficientes para atribuir funções do Azure a uma entidade de segurança do Microsoft Entra, talvez seja necessário solicitar ao proprietário ou administrador da conta para atribuir as permissões necessárias.

O exemplo a seguir atribui a função de Colaborador de Dados de Blob de Armazenamento, que inclui a ação Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey. A função tem o escopo no nível da conta de armazenamento.

Lembre-se de substituir os valores de espaço reservado entre colchetes angulares pelos seus próprios valores:

New-AzRoleAssignment -SignInName <email> `
    -RoleDefinitionName "Storage Blob Data Contributor" `
    -Scope  "/subscriptions/<subscription>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account>"

Para obter mais informações sobre as funções internas que incluem a ação Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey , consulte Funções internas do Azure.

Usar credenciais do Microsoft Entra para proteger uma SAS

Quando você cria uma SAS de delegação de usuário com o Azure PowerShell, a chave de delegação de usuário usada para assinar a SAS é criada para você implicitamente. A hora de início e a hora de expiração especificadas para a SAS também são usadas como a hora de início e a hora de expiração para a chave de delegação do usuário.

Como o intervalo máximo durante o qual a chave de delegação do usuário é válida é de 7 dias a partir da data de início, você deve especificar um tempo de expiração para o SAS que esteja dentro de 7 dias da hora de início. A SAS é inválida depois que a chave de delegação do usuário expira, portanto, uma SAS com um tempo de expiração superior a 7 dias ainda será válida apenas por 7 dias.

Para criar uma SAS de delegação de usuário para um contêiner ou blob com o Azure PowerShell, primeiro crie um novo objeto de contexto do Armazenamento do Azure, especificando o -UseConnectedAccount parâmetro. O -UseConnectedAccount parâmetro especifica que o comando cria o objeto de contexto na conta do Microsoft Entra com a qual você entrou.

Lembre-se de substituir os valores de espaço reservado entre colchetes angulares pelos seus próprios valores:

$ctx = New-AzStorageContext -StorageAccountName <storage-account> -UseConnectedAccount

Criar uma SAS de delegação de usuário para um contêiner

Para retornar um token SAS de delegação de usuário para um contêiner, chame o comando New-AzStorageContainerSASToken, passando o objeto de contexto do Armazenamento do Azure que você criou anteriormente.

O exemplo a seguir retorna um token SAS de delegação de usuário para um contêiner. Lembre-se de substituir os valores de espaço reservado entre colchetes pelos seus próprios valores:

New-AzStorageContainerSASToken -Context $ctx `
    -Name <container> `
    -Permission racwdl `
    -ExpiryTime <date-time>

O token SAS de delegação de usuário retornado será semelhante a:

?sv=2018-11-09&sr=c&sig=<sig>&skoid=<skoid>&sktid=<sktid>&skt=2019-08-05T22%3A24%3A36Z&ske=2019-08-07T07%3A
00%3A00Z&sks=b&skv=2018-11-09&se=2019-08-07T07%3A00%3A00Z&sp=rwdl

Criar uma SAS de delegação de usuário para um blob

Para retornar um token SAS de delegação de usuário para um blob, chame o comando New-AzStorageBlobSASToken, passando o objeto de contexto do Armazenamento do Azure que você criou anteriormente.

A sintaxe a seguir retorna uma SAS de delegação de usuário para um blob. O exemplo especifica o parâmetro, que retorna o URI de blob com o -FullUri token SAS acrescentado. Lembre-se de substituir os valores de espaço reservado entre colchetes pelos seus próprios valores:

New-AzStorageBlobSASToken -Context $ctx `
    -Container <container> `
    -Blob <blob> `
    -Permission racwd `
    -ExpiryTime <date-time>
    -FullUri

O URI SAS de delegação de usuário retornado será semelhante a:

https://storagesamples.blob.core.windows.net/sample-container/blob1.txt?sv=2018-11-09&sr=b&sig=<sig>&skoid=<skoid>&sktid=<sktid>&skt=2019-08-06T21%3A16%3A54Z&ske=2019-08-07T07%3A00%3A00Z&sks=b&skv=2018-11-09&se=2019-08-07T07%3A00%3A00Z&sp=racwd

Nota

Uma SAS de delegação de usuário não oferece suporte à definição de permissões com uma política de acesso armazenado.

Revogar uma SAS de delegação de usuário

Para revogar uma SAS de delegação de usuário do Azure PowerShell, chame o comando Revoke-AzStorageAccountUserDelegationKeys . Este comando revoga todas as chaves de delegação do usuário associadas à conta de armazenamento especificada. Todas as assinaturas de acesso compartilhado associadas a essas chaves são invalidadas.

Lembre-se de substituir os valores de espaço reservado entre colchetes angulares pelos seus próprios valores:

Revoke-AzStorageAccountUserDelegationKeys -ResourceGroupName <resource-group> `
    -StorageAccountName <storage-account>

Importante

Tanto a chave de delegação de usuário quanto as atribuições de função do Azure são armazenadas em cache pelo Armazenamento do Azure, portanto, pode haver um atraso entre quando você inicia o processo de revogação e quando uma SAS de delegação de usuário existente se torna inválida.

Próximos passos