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, irá aprender a:
- Adicionar uma condição a uma atribuição de função
- Restringir o acesso a blobs com base em uma tag de índice de blob
Importante
O controle de acesso baseado em atributos do Azure (Azure ABAC) está geralmente disponível (GA) para controlar o acesso ao Armazenamento de Blobs do Azure, ao Azure Data Lake Storage Gen2 e às Filas do Azure usando request
, resource
, environment
e principal
atributos nas camadas de desempenho da conta de armazenamento padrão e premium. Atualmente, 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 VISUALIZAÇÃO. Para obter informações completas sobre o status do recurso do ABAC para Armazenamento do Azure, consulte Status dos recursos de condição no Armazenamento do Azure.
Veja Termos de Utilização Complementares da Pré-visualizações do Microsoft Azure para obter os termos legais que se aplicam às funcionalidades do Azure que estão na versão beta, na pré-visualização ou que ainda não foram lançadas para disponibilidade geral.
Pré-requisitos
Para obter informações sobre os pré-requisitos para adicionar ou editar condições de atribuição de função, consulte Pré-requisitos de 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 o Chandra só possa ler arquivos com a tag Project=Cascade.
Se o Chandra tentar ler um blob sem a tag Project=Cascade, o acesso não será permitido.
Veja como a condição se parece 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
Use o comando az login e siga as instruções que aparecem para entrar no seu diretório como Administrador de Acesso de Usuário ou Proprietário.
az login
Use az account show para obter o ID de suas assinaturas.
az account show
Determine o ID da assinatura e inicialize a variável.
subscriptionId="<subscriptionId>"
Etapa 2: Criar um usuário
Use az ad user create para criar um usuário ou encontrar um usuário existente. Este tutorial usa Chandra como exemplo.
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 Blob a partir da CLI do Azure com credenciais do Microsoft Entra ou usando a chave de acesso da conta de armazenamento. Este artigo mostra como autorizar operações de armazenamento de Blob usando o Microsoft Entra ID. Para obter mais informações, consulte Guia de início rápido: criar, baixar e listar blobs com a CLI do Azure
Use az storage account para criar uma conta de armazenamento compatível com o recurso de índice de blob. Para obter mais informações, consulte Gerenciar e localizar dados de Blob do Azure com marcas de índice de blob.
Use az storage container para criar um novo contêiner de blob dentro da conta de armazenamento e defina o nível de acesso anônimo como Private (sem acesso anônimo).
Use az storage blob upload para carregar um arquivo de texto para o contêiner.
Adicione a seguinte marca de índice de blob ao arquivo de texto. Para obter mais informações, consulte Usar marcas de índice de blob para gerenciar e localizar dados no Armazenamento de Blobs do Azure.
Nota
Os blobs também suportam a capacidade de armazenar metadados arbitrários de chave-valor definidos pelo usuário. Embora os metadados sejam semelhantes às tags de índice de blob, você deve usar tags de índice de blob com condições.
Key valor Project Cascade Carregue um segundo arquivo de texto para o contêiner.
Adicione a seguinte tag de índice de blob ao segundo arquivo de texto.
Key valor Project Padeiro 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
Inicialize as variáveis de função Leitor de Dados de Blob de Armazenamento .
roleDefinitionName="Storage Blob Data Reader" roleDefinitionId="2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
Inicialize o escopo para o grupo de recursos.
scope="/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
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 ativada, você poderá ver a mensagem
bash: !: event not found
devido ao ponto de exclamação (!). Nesse caso, você pode desativar a expansão do histórico com o comandoset +H
. Para reativar a expansão do histórico, useset -H
.Em Bash, um cifrão ($) tem um significado especial para expansão. Se a sua condição incluir um cifrão ($), talvez seja necessário prefixá-lo com uma barra invertida (\). Por exemplo, essa condição usa cifrões para delinear o nome da chave da tag. Para obter mais informações sobre regras para aspas no Bash, consulte Aspas duplas.
Inicialize a versão e a descrição da condição.
conditionVersion="2.0" description="Read access to blobs with the tag Project=Cascade"
Use az role assignment create para atribuir a função Storage Blob Data Reader com uma condição ao usuário em um escopo de grupo de recursos.
az role assignment create --assignee-object-id $userObjectId --scope $scope --role $roleDefinitionId --description "$description" --condition "$condition" --condition-version $conditionVersion
Eis um exemplo do resultado:
{ "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
No portal do Azure, abra o grupo de recursos.
Selecione Controlo de acesso (IAM) .
Na guia Atribuições de função, localize a atribuição de função.
Na coluna Condição, selecione Exibir/Editar para exibir a condição.
Etapa 6: Testar a condição
Abra uma nova janela de comando.
Use az login para entrar como Chandra.
az login
Inicialize as variáveis a seguir com os nomes usados.
storageAccountName="<storageAccountName>" containerName="<containerName>" blobNameBaker="<blobNameBaker>" blobNameCascade="<blobNameCascade>"
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
Aqui está 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.
Leia as propriedades do arquivo para o projeto Cascade.
az storage blob show --account-name $storageAccountName --container-name $containerName --name $blobNameCascade --auth-mode login
Aqui está um exemplo da saída. Observe que você pode ler as propriedades do arquivo porque ele tem a tag 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
Na outra janela de comando, use az role assignment list para obter a atribuição de função adicionada.
az role assignment list --assignee $userObjectId --resource-group $resourceGroup
O resultado é semelhante ao seguinte:
[ { "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" } ]
Crie um arquivo JSON com o seguinte formato e atualize as
condition
propriedades edescription
.{ "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" }
Use az role assignment update para atualizar a condição para a atribuição de função.
az role assignment update --role-assignment "./path/roleassignment.json"
Etapa 8: Limpar recursos
Use az role assignment delete para remover a atribuição de função e a condição adicionadas.
az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
Exclua a conta de armazenamento que você criou.
Exclua o usuário que você criou.