Поделиться через


Руководство. Добавление условия назначения ролей для ограничения доступа к blob-объектам с помощью Azure PowerShell

В большинстве случаев назначение ролей предоставляет необходимые разрешения ресурсам Azure. Однако в некоторых случаях может потребоваться обеспечить более детализированный контроль доступа, добавив условие назначения роли.

В этом руководстве описано следующее:

  • Добавление условия для назначения роли
  • Ограничение доступа к BLOB-объектам на основе тега индекса большого двоичного объекта

Внимание

Управление доступом на основе атрибутов Azure (Azure ABAC) общедоступен для управления доступом к Хранилище BLOB-объектов Azure, Azure Data Lake Storage 2-го поколения и очередям Azure с помощью request, resourceenvironmentа principal также атрибутов в уровнях производительности учетной записи хранения уровня "Стандартный" и "Премиум". В настоящее время атрибут ресурса метаданных контейнера и большой двоичный объект списка включают атрибут запроса в предварительной версии. Полные сведения о состоянии функции ABAC для служба хранилища Azure см. в разделе "Состояние функций условий" в служба хранилища Azure.

Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.

Необходимые компоненты

Дополнительные сведения о предварительных требованиях для добавления и изменения условий назначения ролей см. в разделе Требования к условиям.

Condition

В этом учебнике описано, как ограничивать доступ к BLOB-объектам с помощью определенного тега. Например, можно добавить условие к назначению роли, чтобы Чандра мог только считывать файлы с тегом Project=Cascade.

Схема назначения роли с условием.

Если Chandra пытается считывать большой двоичный объект без тега Project=Cascade, доступ не допускается.

Схема, показывающая доступ на чтение к BLOB-объектам с помощью тега 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. Установка обязательных компонентов

  1. Откройте окно PowerShell.

  2. Используйте Get-InstalledModule для проверки версий установленных модулей.

    Get-InstalledModule -Name Az
    Get-InstalledModule -Name Az.Resources
    Get-InstalledModule -Name Az.Storage
    
  3. При необходимости используйте 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
    
  4. Закройте и снова откройте PowerShell, чтобы обновить сеанс.

Шаг 2. Вход в Azure

  1. Используйте команду Connect-AzAccount и следуйте инструкциям по входу в каталог в качестве администратора доступа пользователей или владельца.

    Connect-AzAccount
    
  2. Чтобы получить список всех подписок, используйте Get-AzSubscription.

    Get-AzSubscription
    
  3. Определите идентификатор подписки и инициализируйте переменную.

    $subscriptionId = "<subscriptionId>"
    
  4. Задайте подписку в качестве активной.

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

Шаг 3. Создание пользователя

  1. Используйте New-MgUser для создания пользователя или поиска существующего пользователя. В этом учебнике в качестве примера используется сотрудник с именем Чандра.

  2. Инициализируйте переменную для идентификатора объекта пользователя.

    $userObjectId = "<userObjectId>"
    

Шаг 4. Настройка хранилища

  1. Чтобы создать учетную запись хранения, совместимую с функцией индекса больших двоичных объектов, используйте команду New-AzStorageAccount. Дополнительные сведения см. в статье Управление данными BLOB-объектов Azure и их поиск с помощью тегов индекса BLOB-объектов.

  2. Используйте New-Az служба хранилища Container, чтобы создать новый контейнер BLOB-объектов в учетной записи хранения и задать для анонимного уровня доступа частный (без анонимного доступа).

  3. Используйте Set-AzStorageBlobContent, чтобы передать текстовый файл в контейнер.

  4. Добавьте следующий тег индекса BLOB-объекта в текстовый файл. Дополнительные сведения см. в статье Использование тегов индекса BLOB-объектов для поиска данных и управления ими в Хранилище BLOB-объектов Azure.

    Примечание.

    BLOB-объекты также поддерживают возможность хранения произвольных метаданных "ключ-значение", определяемых пользователем. Несмотря на то что метаданные похожи на теги индекса BLOB-объектов, необходимо использовать теги индекса BLOB-объектов с условиями.

    Ключ Значение
    Project Cascade
  5. Передайте второй текстовый файл в этот контейнер.

  6. Добавьте следующий тег индекса BLOB-объекта во второй текстовый файл.

    Ключ Значение
    Project Baker
  7. Инициализируйте следующие переменные с именами, которые вы использовали.

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

Шаг 5. Назначение роли с условием

  1. Инициализируйте переменные роли читателя данных BLOB-объекта хранилища.

    $roleDefinitionName = "Storage Blob Data Reader"
    $roleDefinitionId = "2a2b9908-6ea1-4ae2-8e65-a410df84e7d1"
    
  2. Инициализируйте область для группы ресурсов.

    $scope = "/subscriptions/$subscriptionId/resourceGroups/$resourceGroup"
    
  3. Инициализируйте условие.

    $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, если условие содержит знак доллара ($), может потребоваться добавить перед ним обратную галочку (`). Например, в этом условии для обозначения имени ключа тега используются знаки доллара.

  4. Инициализируйте версию условия и описание.

    $conditionVersion = "2.0"
    $description = "Read access to blobs with the tag Project=Cascade"
    
  5. Чтобы назначить роль читателя данных 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 (необязательно)

  1. На портале Azure откройте группу ресурсов.

  2. Выберите Управление доступом (IAM) .

  3. На вкладке "Назначения ролей" добавьте назначение роли.

  4. В столбце "Условие" нажмите кнопку "Вид"/ "Изменить ", чтобы просмотреть условие.

Снимок экрана: добавление условия назначения роли на портале Azure.

Шаг 7. Проверка условия

  1. Откройте новое окно PowerShell.

  2. Используйте Connect-AzAccount для входа от имени Чандры.

    Connect-AzAccount
    
  3. Инициализируйте следующие переменные с именами, которые вы использовали.

    $storageAccountName = "<storageAccountName>"
    $containerName = "<containerName>"
    $blobNameBaker = "<blobNameBaker>"
    $blobNameCascade = "<blobNameCascade>"
    
  4. Используйте New-AzStorageContext, чтобы создать конкретный контекст для более удобного доступа к учетной записи хранения.

    $bearerCtx = New-AzStorageContext -StorageAccountName $storageAccountName
    
  5. Используйте 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
    
  6. Считайте файл для проекта 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. Изменение условия (необязательно)

  1. В другом окне PowerShell используйте Get-AzRoleAssignment, чтобы получить добавленное назначение роли.

    $testRa = Get-AzRoleAssignment -Scope $scope -RoleDefinitionName $roleDefinitionName -ObjectId $userObjectId
    
  2. Измените условие.

    $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. Инициализируйте условие и описание.

    $testRa.Condition = $condition
    $testRa.Description = "Read access to blobs with the tag Project=Cascade or Project=Baker"
    
  4. Используйте 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. Очистка ресурсов

  1. Чтобы удалить назначенные роли и условия, используйте команду Remove-AzRoleAssignment.

    Remove-AzRoleAssignment -ObjectId $userObjectId -RoleDefinitionName $roleDefinitionName -ResourceGroupName $resourceGroup
    
  2. Удалите созданную учетную запись хранения.

  3. Удалите пользователя, которого вы создали.

Следующие шаги