Compartilhar via


Tutorial: Adicionar uma condição de atribuição de função para restringir o acesso a blobs usando o Azure PowerShell

Na maioria dos casos, uma atribuição de função concede as permissões necessárias aos recursos do Azure. No entanto, em alguns casos, o ideal é fornecer um controle de acesso mais granular adicionando uma condição de atribuição de função.

Neste tutorial, você aprenderá como:

  • Adicionar uma condição a uma atribuição de função
  • Restringir o acesso a blobs com base em uma marca de índice de blob

Importante

O ABAC (controle de acesso baseado em atributos) do Azure tem GA (disponibilidade geral) para controlar o acesso ao Armazenamento de Blobs do Azure, ao Azure Data Lake Storage Gen2 e às Filas do Azure usando os atributos request, resource, environment e principal nas camadas de desempenho das contas de armazenamento Standard e Premium. No momento, o atributo de recurso de metadados de contêiner e o atributo de solicitação de inclusão de blob de lista estão em VERSÃO PRÉVIA. Para obter informações completas sobre o status do recurso do ABAC para o Armazenamento do Azure, consulte Status dos recursos de condição no Armazenamento do Azure.

Veja os Termos de Uso Complementares para Versões Prévias do Microsoft Azure para obter termos legais que se aplicam aos recursos do Azure que estão em versão beta, versão prévia ou que, de outra forma, ainda não foram lançados em disponibilidade geral.

Pré-requisitos

Para obter informações sobre os pré-requisitos para adicionar ou editar condições de atribuição de função, confira Pré-requisitos de condições.

Condição

Neste tutorial, você restringirá o acesso a blobs com uma marca específica. Por exemplo, você adicionará uma condição a uma atribuição de função para que Carlos só possa ler arquivos com a marca Project=Cascade.

Diagrama da atribuição de função com uma condição.

Se Chandra tentar ler um blob sem a marca Project=Cascade, o acesso não será permitido.

Diagrama que mostra o acesso de leitura aos blobs com a marca Project=Cascade.

Veja a aparência da condição no código:

(
    (
        !(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'}
        AND NOT
        SubOperationMatches{'Blob.List'})
    )
    OR
    (
        @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'
    )
)

Etapa 1: Pré-requisitos de instalação

  1. Abra uma janela do PowerShell.

  2. Use Get-InstalledModule para verificar as versões dos módulos instalados.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. Se necessário, use Install-Module para instalar as versões necessárias para os módulos Az, Az.Resources e Az.Storage.

    Install-Module -Name Az -RequiredVersion 5.5.0
    Install-Module -Name Az.Resources -RequiredVersion 3.2.1
    Install-Module -Name Az.Storage -RequiredVersion 2.5.2-preview -AllowPrerelease
    
  4. Feche e reabra o PowerShell para atualizar a sessão.

Etapa 2: Entrar no Azure

  1. Use o comando Connect-AzAccount e siga as instruções exibidas para entrar no seu diretório como Administrador de Acesso do Usuário ou Proprietário.

    Connect-AzAccount
    
  2. Use Get-AzSubscription para listar todas as suas assinaturas.

    Get-AzSubscription
    
  3. Determine a ID da assinatura e inicialize a variável.

    $subscriptionId = "<subscriptionId>"
    
  4. Defina a assinatura como a assinatura ativa.

    $context = Get-AzSubscription -SubscriptionId $subscriptionId
    Set-AzContext $context
    

Etapa 3: Criar um usuário

  1. Use o New-MgUser para criar um usuário ou encontrar um usuário existente. Este tutorial usa Carlos como o exemplo.

  2. Inicialize a variável para a ID de objeto do usuário.

    $userObjectId = "<userObjectId>"
    

Etapa 4: Configurar o armazenamento

  1. Use New-AzStorageAccount para criar uma conta de armazenamento compatível com o recurso de índice de blob. Para obter mais informações, confira Gerenciar e localizar dados de blob do Azure com marcas de índice de blob.

  2. Use New-AzStorageContainer para criar um novo contêiner de blob dentro da conta de armazenamento e defina o nível de acesso anônimo como Privado (sem acesso anônimo).

  3. Use Set-AzStorageBlobContent para carregar um arquivo de texto no contêiner.

  4. Adicione a marca de índice de blob a seguir ao arquivo de texto. Para obter mais informações, confira Usar marcas de índice de blob para gerenciar e localizar dados no Armazenamento de Blobs do Azure.

    Observação

    Os blobs também dão suporte à capacidade de armazenar metadados de chave-valor arbitrários definidos pelo usuário. Embora os metadados sejam semelhantes às marcas de índice de blob, você precisa usar marcas de índice de blob com as condições.

    Chave Valor
    Project Cascade
  5. Carregue um segundo arquivo de texto no contêiner.

  6. Adicione a marca de índice de blob a seguir ao segundo arquivo de texto.

    Chave Valor
    Project Baker
  7. Inicialize as variáveis a seguir com os nomes que você usou.

    $resourceGroup = "<resourceGroup>"
    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameCascade = "<blobNameCascade>"
    $blobNameBaker = "<blobNameBaker>"
    

Etapa 5: Atribuir uma função com uma condição

  1. Inicialize as variáveis da função Leitor de Dados do Blob de Armazenamento.

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Inicialize o escopo do grupo de recursos.

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Inicialize a condição.

    $condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade'))"
    

    No PowerShell, se a condição incluir um cifrão ($), você precisará prefixá-lo com um símbolo de acento grave (`). Por exemplo, essa condição usa cifrões para delinear o nome da chave de marca.

  4. Inicialize a versão da condição e a descrição.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. Use New-AzRoleAssignment para atribuir a função Leitor de Dados do Blob de Armazenamento com uma condição para o usuário em um escopo do grupo de recursos.

    New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
    

    Veja um exemplo da saída:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade'))
    

Etapa 6: (Opcional) Exibir a condição no portal do Azure

  1. No portal do Azure, abra o grupo de recursos.

  2. Selecione IAM (Controle de acesso) .

  3. Na guia Atribuição de função, encontre a atribuição de função.

  4. Na coluna Condição, selecione Exibir/Editar para exibir a condição.

Captura de tela de Adicionar condição de atribuição de função no portal do Azure.

Etapa 7: Testar a condição

  1. Abra uma nova janela do PowerShell.

  2. Use Connect-AzAccount para entrar como Carlos.

    Connect-AzAccount
    
  3. Inicialize as variáveis a seguir com os nomes que você usou.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Use New-AzStorageContext para criar um contexto específico para acessar sua conta de armazenamento com mais facilidade.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Use Get-AzStorageBlob para tentar ler o arquivo do projeto Baker.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx 
    

    Veja um exemplo da saída. Observe que não é possível ler o arquivo devido à condição adicionada.

    Get-AzStorageBlob : This request is not authorized to perform this operation using this permission. HTTP Status Code:
    403 - HTTP Error Message: This request is not authorized to perform this operation using this permission.
    ErrorCode: AuthorizationPermissionMismatch
    ErrorMessage: This request is not authorized to perform this operation using this permission.
    RequestId: <requestId>
    Time: Sat, 24 Apr 2021 13:26:25 GMT
    At line:1 char:1
    + Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Con ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        + CategoryInfo          : CloseError: (:) [Get-AzStorageBlob], StorageException
        + FullyQualifiedErrorId : StorageException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.GetAzureStorageBlob
       Command
    
  6. Leia o arquivo do projeto Cascade.

    Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx 
    

    Veja um exemplo da saída. Observe que você pode ler o arquivo porque ele tem a marca Project=Cascade.

       AccountName: <storageAccountName>, ContainerName: <containerName>
    
    Name                 BlobType  Length          ContentType                    LastModified         AccessTier SnapshotT
                                                                                                                  ime
    ----                 --------  ------          -----------                    ------------         ---------- ---------
    CascadeFile.txt      BlockBlob 7               text/plain                     2021-04-24 05:35:24Z Hot
    

Etapa 8: (Opcional) Editar a condição

  1. Na outra janela do PowerShell, use Get-AzRoleAssignment para obter a atribuição de função que você adicionou.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Edite a condição.

    $condition = "((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT SubOperationMatches{'Blob.List'})) OR (@Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Cascade' OR @Resource[Microsoft.Storage/storageAccounts/blobServices/containers/blobs/tags:Project<`$key_case_sensitive`$>] StringEquals 'Baker'))"
    
  3. Inicialize a condição e a descrição.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. Use Set-AzRoleAssignment para atualizar a condição da atribuição de função.

    Set-AzRoleAssignment -InputObject $testRa -PassThru
    

    Veja um exemplo da saída:

    RoleAssignmentId   : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>/providers/Microso
                         ft.Authorization/roleAssignments/<roleAssignmentId>
    Scope              : /subscriptions/<subscriptionId>/resourceGroups/<resourceGroup>
    DisplayName        : Chandra
    SignInName         : chandra@contoso.com
    RoleDefinitionName : Storage Blob Data Reader
    RoleDefinitionId   : 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1
    ObjectId           : <userObjectId>
    ObjectType         : User
    CanDelegate        : False
    Description        : Read access to blobs with the tag Project=Cascade or Project=Baker
    ConditionVersion   : 2.0
    Condition          : ((!(ActionMatches{'Microsoft.Storage/storageAccounts/blobServices/containers/blobs/read'} AND NOT
                         SubOperationMatches{'Blob.List'})) OR
                         (@Resource[Microsoft.Storage/storageAccounts/blobServices/co
                         ntainers/blobs/tags:Project<$key_case_sensitive$>] StringEquals 'Cascade' OR @Resource[Microsoft.S
                         torage/storageAccounts/blobServices/containers/blobs/tags:Project<$key_case_sensitive$>]
                         StringEquals 'Baker'))
    

Etapa 9: Limpar os recursos

  1. Use Remove-AzRoleAssignment para remover a atribuição de função e a condição que você adicionou.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Exclua a conta de armazenamento que você criou.

  3. Exclua o usuário que você criou.

Próximas etapas