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


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

В большинстве случаев назначение ролей предоставляет необходимые разрешения ресурсам 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. Вход в Azure

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

    az login
    
  2. Команда az account show позволяет узнать идентификаторы подписок.

    az account show
    
  3. Определите идентификатор подписки и инициализируйте переменную.

    subscriptionId="<subscriptionId>"
    

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

  1. Чтобы создать или найти существующего пользователя, используйте команду az ad user create. В этом учебнике в качестве примера используется сотрудник с именем Чандра.

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

    userObjectId="<userObjectId>"
    

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

Вы можете авторизовать доступ к хранилищу BLOB-объектов из Azure CLI с помощью учетных данных Microsoft Entra или с помощью ключа доступа к учетной записи хранения. В этой статье показано, как авторизовать операции хранения BLOB-объектов с помощью идентификатора Microsoft Entra. Дополнительные сведения см. в статье Руководство. Создание, скачивание и составление списка больших двоичных объектов с помощью Azure CLI

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

  2. Используйте az storage container для создания нового контейнера BLOB-объектов в учетной записи хранения и задания уровня анонимного доступа для частного (без анонимного доступа).

  3. Чтобы передать текстовый файл в контейнер, используйте команду az storage blob upload.

  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>"
    

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

  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'))"
    

    В Bash при включенном расширении журнала может появиться сообщение bash: !: event not found из-за восклицательного знака (!). В этом случае можно отключить расширение журнала с помощью команды set +H. Чтобы повторно включить расширение журнала, используйте set -H.

    В Bash знак доллара ($) имеет специальное значение для расширения. Если условие содержит знак доллара ($), может потребоваться добавить к нему обратную косую черту (\). Например, в этом условии для обозначения имени ключа тега используются знаки доллара. Дополнительные сведения о правилах для кавычек в Bash см. в разделе Двойные кавычки.

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

    conditionVersion="2.0"
    description="Read access to blobs with the tag Project=Cascade"
    
  5. Чтобы назначить роль читателя данных BLOB-объекта хранилища с условием для пользователя в области группы ресурсов, используйте команду az role assignment create.

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

    Ниже приведен пример выхода.

    {
      "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"
    }
    

Шаг 5. Просмотр условия в портал Azure (необязательно)

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

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

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

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

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

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

  1. Откройте новое командное окно.

  2. Выполните команду az login для входа от имени Чандры.

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

    storageAccountName="<storageAccountName>"
    containerName="<containerName>"
    blobNameBaker="<blobNameBaker>"
    blobNameCascade="<blobNameCascade>"
    
  4. Используйте az storage blob show, чтобы попытаться прочитать свойства файла для проекта Baker.

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

    Ниже приведен пример выходных данных. Обратите внимание, что вы не можете прочитать файл из-за добавленного условия.

    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. Прочтите свойства файла для проекта Cascade.

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

    Ниже приведен пример выходных данных. Обратите внимание, что вы можете прочитать свойства файла, так как он содержит тег 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,
    
      ...
    
    }
    

Шаг 7. Изменение условия (необязательно)

  1. В другом окне командной строки используйте команду az role assignment list, чтобы получить добавленное назначение роли.

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

    Выход аналогичен приведенному ниже:

    [
      {
        "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. Создайте JSON-файл в следующем формате и обновите свойства condition и 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. Используйте az role assignment update, чтобы обновить условие для назначения роли.

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

Шаг 8. Очистка ресурсов

  1. Чтобы удалить назначенные роли и условия, используйте команду az role assignment delete.

    az role assignment delete --assignee $userObjectId --role "$roleDefinitionName" --resource-group $resourceGroup
    
  2. Удалите созданную учетную запись хранения.

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

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