Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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, aprenderás como:
- Adicionar uma condição a uma atribuição de função
- Restringir o acesso a blobs com base numa etiqueta de índice de blob
Importante
O controlo de acesso baseado em atributos do Azure (Azure ABAC) está geralmente disponível (GA) para controlar o acesso ao Azure Blob Storage, ao Azure Data Lake Storage Gen2 e às Filas do Azure, usando os atributos request, resource, environment e principal nas camadas de desempenho da conta de armazenamento padrão e premium. Atualmente, o blob de lista inclui o atributo request e o atributo snapshot request para namespace hierárquico estão em PREVIEW. Para obter informações completas sobre o status do recurso ABAC para Armazenamento Azure, consulte Status das funcionalidades condicionais no Armazenamento Azure.
Consulte os Termos de Utilização Complementares das Visualizações Prévias do Microsoft Azure para obter os termos legais que se aplicam às funcionalidades do Azure que estão em beta, em 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: Instalar pré-requisitos
Abra uma janela do PowerShell.
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.StorageSe 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 -AllowPrereleaseFeche e reabra o PowerShell para atualizar a sessão.
Etapa 2: Entrar no Azure
Use o comando Connect-AzAccount e siga as instruções que aparecem para entrar no seu diretório como Administrador de Acesso de Usuário ou Proprietário.
Connect-AzAccountUse Get-AzSubscription para listar todas as suas assinaturas.
Get-AzSubscriptionDetermine o ID da assinatura e inicialize a variável.
$subscriptionId = "<subscriptionId>"Defina a assinatura como a assinatura ativa.
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
Etapa 3: Criar um usuário
Use New-MgUser 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 4: configurar o armazenamento
Use New-AzStorageAccount 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 New-AzStorageContainer para criar um novo contêiner de blob na conta de armazenamento e defina o nível de acesso anônimo como Private (sem acesso anônimo).
Use Set-AzStorageBlobContent para carregar um arquivo de texto no contêiner.
Adicione a seguinte marca de índice de blob ao ficheiro de texto. Para obter mais informações, consulte Usar tags de índice de blob para gerir e localizar dados no Armazenamento de Blobs do Azure.
Observação
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.
Chave Valor Projeto Cascata Carregue um segundo arquivo de texto para o contêiner.
Adicione a seguinte tag de índice de blob ao segundo ficheiro de texto.
Chave Valor Projeto Padeiro Inicialize as variáveis a seguir com os nomes usados.
$resourceGroup = "<resourceGroup>" $storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameCascade = "<blobNameCascade>" $blobNameBaker = "<blobNameBaker>"
Etapa 5: 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 PowerShell, se a sua condição incluir um cifrão ($), deve prefixá-lo com um acento grave (`). Por exemplo, essa condição usa sinais de dólar para delimitar o nome da chave da etiqueta.
Inicialize a versão da condição e a respetiva descrição.
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"Use New-AzRoleAssignment para atribuir a função de Leitor de Dados Blob de Armazenamento com uma condição ao utilizador num âmbito de grupo de recursos.
New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersionEis um exemplo do resultado:
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
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 7: Testar a condição
Abra uma nova janela do PowerShell.
Use Connect-AzAccount para entrar como Chandra.
Connect-AzAccountInicialize as variáveis a seguir com os nomes usados.
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"Use New-AzStorageContext para criar um contexto específico para acessar sua conta de armazenamento mais facilmente.
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountNameUse Get-AzStorageBlob para tentar ler o ficheiro do projeto Baker.
Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtxAqui está um exemplo da saída. Observe que você não pode 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 CommandLeia o ficheiro para o projeto Cascade.
Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtxAqui está um exemplo da saída. Observe que você pode ler o arquivo porque ele tem a tag 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
Na outra janela do PowerShell, use Get-AzRoleAssignment para obter a atribuição de função adicionada.
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectIdEdite 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'))"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"Use Set-AzRoleAssignment para atualizar a condição para a atribuição de função.
Set-AzRoleAssignment -InputObject $testRa -PassThruEis um exemplo do resultado:
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 recursos
Use Remove-AzRoleAssignment para remover a atribuição de função e a condição adicionadas.
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroupExclua a conta de armazenamento que você criou.
Exclua o usuário que você criou.