Compartilhar via


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

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, talvez você queira 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 controle de acesso baseado em atributos (ABAC) do Azure está em disponibilidade geral (GA) 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. Atualmente, o atributo de solicitação de inclusão de blob de lista e atributo de solicitação de instantâneo para namespace hierárquico estão em VERSÃO PRÉVIA. Para saber mais sobre o status de recursos do ABAC para o Armazenamento do Azure, confira 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 das condições.

Condição

Neste tutorial, você restringe o acesso a blobs com uma tag específica. Por exemplo, você adiciona uma condição a uma atribuição de função para que Chandra 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 tag Project=Cascade, o acesso não é permitido.

Diagrama que mostra o acesso de leitura a blobs com a etiqueta 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: Entrar no Azure

  1. Use o comando az login e siga as instruções que aparecem para entrar no seu diretório como Administrador de Acesso do Usuário ou Proprietário.

    az login
    
  2. Use az account show para obter a ID de suas assinaturas.

    az account show
    
  3. Determine a ID da assinatura e inicialize a variável.

    subscriptionId="<subscriptionId>"
    

Etapa 2: Criar um usuário

  1. Use az ad user create para criar um usuário ou encontrar um usuário existente. Este tutorial usa Chandra como exemplo.

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

    userObjectId="<userObjectId>"
    

Etapa 3: Configurar o armazenamento

Você pode autorizar o acesso ao Armazenamento de Blobs a partir da CLI do Azure, seja com as credenciais do Microsoft Entra ou usando a chave de acesso da conta de armazenamento. Este artigo mostra como autorizar operações de Armazenamento de Blobs usando a ID do Microsoft Entra. Para obter mais informações, consulte Início Rápido: Criar, baixar e listar blobs com a CLI do Azure

  1. Use az storage account 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 um contêiner de armazenamento az 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 az storage blob upload para enviar um arquivo de texto para o contêiner.

  4. Adicione a seguinte tag de índice de blob 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 valor-chave 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
    Projeto 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
    Projeto Baker
  7. Inicialize as variáveis a seguir com os nomes usados.

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

Etapa 4: 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 Bash, se a expansão do histórico estiver habilitada, você poderá ver a mensagem bash: !: event not found devido ao ponto de exclamação (!). Nesse caso, você pode desabilitar a expansão do histórico com o comando set +H. Para habilitar novamente a expansão do histórico, use set -H.

    Em Bash, um sinal de dólar ($) tem um significado especial para a expansão. Se sua condição incluir um sinal de dólar ($), talvez seja necessário prefixá-lo com uma barra invertida (\). Por exemplo, essa condição usa sinais de dólar para delimitar o nome da chave da etiqueta. Para obter mais informações sobre regras para aspas no Bash, consulte Aspas Duplas.

  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 az role assignment create 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.

    az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
    

    Veja um exemplo da saída:

    {
      "canDelegate": null,
      "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'))",
      "conditionVersion": "2.0",
      "description": "Read access to blobs with the tag Project=Cascade",
      "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
      "name": "{roleAssignmentId}",
      "principalId": "{userObjectId}",
      "principalType": "User",
      "resourceGroup": "{resourceGroup}",
      "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
      "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
      "type": "Microsoft.Authorization/roleAssignments"
    }
    

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

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

  2. Selecione Controle de acesso (IAM) .

  3. Na guia Atribuições de função, localize 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 6: Testar a condição

  1. Abra uma nova janela de comando.

  2. Use az login para entrar como Chandra.

    az login
    
  3. Inicialize as variáveis a seguir com os nomes usados.

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Use az storage blob show para tentar ler as propriedades do arquivo para o projeto Baker.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameBaker --auth-mode login
    

    Veja um exemplo da saída. Observe que você não pode ler o arquivo devido à condição adicionada.

    You do not have the required permissions needed to perform this operation.
    Depending on your operation, you may need to be assigned one of the following roles:
        "Storage Blob Data Contributor"
        "Storage Blob Data Reader"
        "Storage Queue Data Contributor"
        "Storage Queue Data Reader"
    
    If you want to use the old authentication method and allow querying for the right account key, please use the "--auth-mode" parameter and "key" value.
    
  5. Consulte as propriedades do arquivo do projeto Cascade.

    az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login 
    

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

    {
      "container": "<containerName>",
      "content": "",
      "deleted": false,
      "encryptedMetadata": null,
      "encryptionKeySha256": null,
      "encryptionScope": null,
      "isAppendBlobSealed": null,
      "isCurrentVersion": null,
      "lastAccessedOn": null,
      "metadata": {},
      "name": "<blobNameCascade>",
      "objectReplicationDestinationPolicy": null,
      "objectReplicationSourceProperties": [],
      "properties": {
        "appendBlobCommittedBlockCount": null,
        "blobTier": "Hot",
        "blobTierChangeTime": null,
        "blobTierInferred": true,
        "blobType": "BlockBlob",
        "contentLength": 7,
        "contentRange": null,
    
      ...
    
    }
    

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

  1. Na outra janela de comando, use az role assignment list para obter a atribuição de função que você adicionou.

    az role assignment list --assignee $userObjectId --resource-group $resourceGroup
    

    A saída deverá ser semelhante a esta:

    [
      {
        "canDelegate": null,
        "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'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
      }
    ]
    
  2. Crie um arquivo JSON com o seguinte formato e atualize as propriedades condition e description.

    {
        "canDelegate": null,
        "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'))",
        "conditionVersion": "2.0",
        "description": "Read access to blobs with the tag Project=Cascade or Project=Baker",
        "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Authorization/roleAssignments/{roleAssignmentId}",
        "name": "{roleAssignmentId}",
        "principalId": "{userObjectId}",
        "principalName": "chandra@contoso.com",
        "principalType": "User",
        "resourceGroup": "{resourceGroup}",
        "roleDefinitionId": "/subscriptions/{subscriptionId}/providers/Microsoft.Authorization/roleDefinitions/2a2b9908-6ea1-4ae2-8e65-a410df84e7d1",
        "roleDefinitionName": "Storage Blob Data Reader",
        "scope": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}",
        "type": "Microsoft.Authorization/roleAssignments"
    }
    
  3. Use az role assignment update para atualizar a condição da atribuição de função.

    az role assignment update --role-assignment "./path/roleassignment.json"
    

Etapa 8: Limpar recursos

  1. Use az role assignment delete para remover a atribuição de função e a condição que você adicionou.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Exclua a conta de armazenamento que você criou.

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

Próximas etapas