Руководство. Добавление условия назначения ролей для ограничения доступа к blob-объектам с помощью Azure PowerShell
В большинстве случаев назначение ролей предоставляет необходимые разрешения ресурсам Azure. Однако в некоторых случаях может потребоваться обеспечить более детализированный контроль доступа, добавив условие назначения роли.
В этом руководстве описано следующее:
- Добавление условия для назначения роли
- Ограничение доступа к BLOB-объектам на основе тега индекса большого двоичного объекта
Внимание
Управление доступом на основе атрибутов Azure (Azure ABAC) общедоступен для управления доступом к Хранилище BLOB-объектов Azure, Azure Data Lake Storage 2-го поколения и очередям Azure с помощью request
, resource
environment
а principal
также атрибутов в уровнях производительности учетной записи хранения уровня "Стандартный" и "Премиум". В настоящее время атрибут ресурса метаданных контейнера и большой двоичный объект списка включают атрибут запроса в предварительной версии. Полные сведения о состоянии функции ABAC для служба хранилища Azure см. в разделе "Состояние функций условий" в служба хранилища Azure.
Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.
Необходимые компоненты
Дополнительные сведения о предварительных требованиях для добавления и изменения условий назначения ролей см. в разделе Требования к условиям.
Condition
В этом учебнике описано, как ограничивать доступ к BLOB-объектам с помощью определенного тега. Например, можно добавить условие к назначению роли, чтобы Чандра мог только считывать файлы с тегом Project=Cascade.
Если Chandra пытается считывать большой двоичный объект без тега Project=Cascade, доступ не допускается.
Вот как выглядит условие в коде:
(
(
!(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'
)
)
Шаг 1. Установка обязательных компонентов
Откройте окно PowerShell.
Используйте Get-InstalledModule для проверки версий установленных модулей.
Get-InstalledModule -Name Az Get-InstalledModule -Name Az.Resources Get-InstalledModule -Name Az.Storage
При необходимости используйте Install-Module, чтобы установить необходимые версии модулей Az, Az.Resources и 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
Закройте и снова откройте PowerShell, чтобы обновить сеанс.
Шаг 2. Вход в Azure
Используйте команду Connect-AzAccount и следуйте инструкциям по входу в каталог в качестве администратора доступа пользователей или владельца.
Connect-AzAccount
Чтобы получить список всех подписок, используйте Get-AzSubscription.
Get-AzSubscription
Определите идентификатор подписки и инициализируйте переменную.
$subscriptionId = "<subscriptionId>"
Задайте подписку в качестве активной.
$context = Get-AzSubscription -SubscriptionId $subscriptionId Set-AzContext $context
Шаг 3. Создание пользователя
Используйте New-MgUser для создания пользователя или поиска существующего пользователя. В этом учебнике в качестве примера используется сотрудник с именем Чандра.
Инициализируйте переменную для идентификатора объекта пользователя.
$userObjectId = "<userObjectId>"
Шаг 4. Настройка хранилища
Чтобы создать учетную запись хранения, совместимую с функцией индекса больших двоичных объектов, используйте команду New-AzStorageAccount. Дополнительные сведения см. в статье Управление данными BLOB-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.
Используйте New-Az служба хранилища Container, чтобы создать новый контейнер BLOB-объектов в учетной записи хранения и задать для анонимного уровня доступа частный (без анонимного доступа).
Используйте Set-AzStorageBlobContent, чтобы передать текстовый файл в контейнер.
Добавьте следующий тег индекса BLOB-объекта в текстовый файл. Дополнительные сведения см. в статье Использование тегов индекса BLOB-объектов для поиска данных и управления ими в Хранилище BLOB-объектов Azure.
Примечание.
BLOB-объекты также поддерживают возможность хранения произвольных метаданных "ключ-значение", определяемых пользователем. Несмотря на то что метаданные похожи на теги индекса BLOB-объектов, необходимо использовать теги индекса BLOB-объектов с условиями.
Ключ Значение Project Cascade Передайте второй текстовый файл в этот контейнер.
Добавьте следующий тег индекса BLOB-объекта во второй текстовый файл.
Ключ Значение Project Baker Инициализируйте следующие переменные с именами, которые вы использовали.
$resourceGroup = "<resourceGroup>" $storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameCascade = "<blobNameCascade>" $blobNameBaker = "<blobNameBaker>"
Шаг 5. Назначение роли с условием
Инициализируйте переменные роли читателя данных BLOB-объекта хранилища.
$roleDefinitionName = "Storage Blob Data Reader" $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
Инициализируйте область для группы ресурсов.
$scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
Инициализируйте условие.
$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'))"
В PowerShell, если условие содержит знак доллара ($), может потребоваться добавить перед ним обратную галочку (`). Например, в этом условии для обозначения имени ключа тега используются знаки доллара.
Инициализируйте версию условия и описание.
$conditionVersion = "2.0" $description = "Read access to blobs with the tag Project=Cascade"
Чтобы назначить роль читателя данных BLOB-объекта хранилища с условием для пользователя в области группы ресурсов, используйте команду New-AzRoleAssignment.
New-AzRoleAssignment -ObjectId $userObjectId -Scope $scope -RoleDefinitionId $roleDefinitionId -Description $description -Condition $condition -ConditionVersion $conditionVersion
Ниже приведен пример выхода.
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'))
Шаг 6. Просмотр условия в портал Azure (необязательно)
На портале Azure откройте группу ресурсов.
Выберите Управление доступом (IAM) .
На вкладке "Назначения ролей" добавьте назначение роли.
В столбце "Условие" нажмите кнопку "Вид"/ "Изменить ", чтобы просмотреть условие.
Шаг 7. Проверка условия
Откройте новое окно PowerShell.
Используйте Connect-AzAccount для входа от имени Чандры.
Connect-AzAccount
Инициализируйте следующие переменные с именами, которые вы использовали.
$storageAccountName = "<storageAccountName>" $containerName = "<containerName>" $blobNameBaker = "<blobNameBaker>" $blobNameCascade = "<blobNameCascade>"
Используйте New-AzStorageContext, чтобы создать конкретный контекст для более удобного доступа к учетной записи хранения.
$bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
Используйте Get-AzStorageBlob, чтобы попытаться прочитать файл для проекта Baker.
Get-AzStorageBlob -Container $containerName -Blob $blobNameBaker -Context $bearerCtx
Ниже приведен пример выходных данных. Обратите внимание, что вы не можете прочитать файл из-за добавленного условия.
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
Считайте файл для проекта Cascade.
Get-AzStorageBlob -Container $containerName -Blob $blobNameCascade -Context $bearerCtx
Ниже приведен пример выходных данных. Обратите внимание, что вы можете прочитать файл, так как он содержит тег 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
Шаг 8. Изменение условия (необязательно)
В другом окне PowerShell используйте Get-AzRoleAssignment, чтобы получить добавленное назначение роли.
$testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
Измените условие.
$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'))"
Инициализируйте условие и описание.
$testRa.Condition = $condition $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
Используйте Set-AzRoleAssignment, чтобы обновить условие для назначения роли.
Set-AzRoleAssignment -InputObject $testRa -PassThru
Ниже приведен пример выхода.
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'))
Шаг 9. Очистка ресурсов
Чтобы удалить назначенные роли и условия, используйте команду Remove-AzRoleAssignment.
Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
Удалите созданную учетную запись хранения.
Удалите пользователя, которого вы создали.