Блокировка ресурсов для защиты инфраструктуры

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

Вы можете задать блокировки, которые препятствуют удалению или изменению. На портале эти блокировки называются Delete и Read-only. В командной строке эти блокировки называются CanNotDelete и ReadOnly.

  • CanNotDelete означает, что авторизованные пользователи могут читать и изменять ресурс, но не могут удалить его.
  • ReadOnly означает, что авторизованные пользователи смогут читать ресурс, но не смогут удалить или обновить его. Применение этой блокировки похоже на ограничение авторизованных пользователей, когда у них остаются только разрешения, предоставляемые ролью Читатель.

В отличие от управления доступом на основе ролей блокировки управления используются для применения ограничения для всех пользователей и ролей. Сведения о настройке разрешений для пользователей и ролей см. в статье Azure RBAC.

Наследование блокировки

При применении блокировки к родительской области все ресурсы в этой области наследуют ту же блокировку. Даже ресурсы, добавляемые позже, наследуют ту же родительскую блокировку. Приоритет имеет наиболее строгая блокировка.

Ресурсы расширения наследуют блокировки от ресурса, к которому они применяются. Например, Microsoft.Insights/diagnosticSettings — это тип ресурса расширения. Если вы примените параметр диагностики к BLOB-объекту хранилища и заблокируете учетную запись хранения, вы не сможете удалить параметр диагностики. Это наследование имеет смысл, так как полный идентификатор ресурса диагностического параметра:

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}/blobServices/default/providers/microsoft.insights/diagnosticSettings/{setting-name}"

Что соответствует области идентификатора ресурса заблокированного ресурса:

/subscriptions/{sub-id}/resourceGroups/{rg-name}/providers/Microsoft.Storage/storageAccounts/{storage-name}

Если к ресурсу применена блокировка Delete, то при попытке удалить группу ресурсов эта функция заблокирует всю операцию удаления. Удаление не будет выполнено, даже если группа ресурсов или другие ресурсы в группе ресурсов не заблокированы. Операция удаления не выполняется частично.

При отмене подписки Azure:

  • Блокировка ресурса не запрещает отмену подписки.
  • Azure сохраняет ресурсы, деактивируя их вместо немедленного удаления.
  • Безвозвратное удаление ресурсов выполняется только после истечения времени ожидания.

Общие сведения об области блокировок

Примечание.

Блокировки применяются только к операциям Azure уровня управления, а не к операциям плоскости данных.

Операции уровня управления Azure направляются в раздел https://management.azure.com. Операции плоскости данных Azure направляются экземпляру службы, например, https://myaccount.blob.core.windows.net/. См. раздел Уровень управления и плоскость данных Azure. Чтобы узнать, какие операции используют URL-адрес уровня управления, см. статью REST API Azure.

Различие означает, что блокировка защищает ресурс от изменений, но не ограничивает то, как ресурс выполняет свои функции. Например, блокировка ReadOnly на логическом сервере Базы данных SQL защищает этот сервер от удаления и изменения. Она разрешает создавать, обновлять и удалять данные в базе данных сервера. Операции плоскости данных разрешают транзакции данных. Эти запросы не направляются в раздел https://management.azure.com.

Моменты, которые следует учесть перед применением блокировок

Применение блокировок может привести к непредвиденным результатам. Для некоторых операций, которые, на первый взгляд, не изменяют ресурс, требуются действия, запрещаемые блокировкой. Блокировки не позволяют методу POST отправлять данные в API Azure Resource Manager (ARM). Ниже приведены некоторые распространенные примеры заблокированных операций:

  • Блокировка "только для чтения" учетной записи хранения запрещает пользователям получать списки ключей учетных записей. Запрос POST обрабатывает операцию отображения списка ключей службы хранилища Azure для защиты доступа к ключам учетной записи. Ключи учетной записи обеспечивают полный доступ к данным в учетной записи хранения. Если блокировка только для чтения настроена для учетной записи хранения, пользователи, у которых нет ключей учетной записи, должны использовать учетные данные Microsoft Entra для доступа к данным BLOB-объектов или очередей. Блокировка "только для чтения" также запрещает назначать роли RBAC Azure, областью действия которых является учетная запись хранения или контейнер данных (контейнер BLOB-объектов или очередь).

  • Блокировка "только для чтения" учетной записи хранения защищает назначения управления доступом на основе ролей (RBAC) Azure, областью действия которых является учетная запись хранения или контейнер данных (контейнер BLOB-объектов или очередь).

  • Блокировка только для чтения в учетной записи хранения предотвращает создание контейнера BLOB-объектов.

  • Блокировка только для чтения или блокировка не удается удалить в учетной записи хранения, не предотвращает удаление или изменение данных. Кроме того, он не защищает данные в большом двоичном объекте, очереди, таблице или файле.

  • API учетной записи служба хранилища предоставляет операции плоскости данных и плоскости управления. Если запрос использует операции плоскости данных, блокировка учетной записи хранения не защищает содержащиеся в ней данные BLOB-объектов, очередей, таблиц и файлов. Однако если запрос использует операции уровня управления, блокировка защищает соответствующие ресурсы.

    Например, если запрос использует общие папки — удаление, которое является операцией плоскости управления, удаление завершается ошибкой. а если он использует операцию плоскости данных Удаление общего ресурса, удаление выполнится успешно. Рекомендуется использовать операции уровня управления.

  • Блокировка только для чтения в группе безопасности сети (NSG) предотвращает создание соответствующего журнала потока NSG. Блокировка не удаляемой группы безопасности сети (NSG) не предотвращает создание или изменение соответствующего журнала потоков NSG.

  • Кроме того, применение блокировки "только для чтения" к ресурсу службы приложений не позволит обозревателю сервера Visual Studio отображать файлы для ресурса, так как для их взаимодействия требуется доступ на запись.

  • Блокировка "только для чтения" группы ресурсов, которая содержит план службы приложений, запрещает увеличивать масштаб плана горизонтально или вертикально.

  • Блокировка "только для чтения" группы ресурсов, которая содержит виртуальную машину, не позволяет пользователям запускать или перезапускать виртуальную машину. Для этих операций требуется запрос, использующий метод POST.

  • Блокировка только для чтения в группе ресурсов предотвращает перемещение существующих ресурсов в группу ресурсов или из нее.

  • Блокировка только для чтения в группе ресурсов, которая содержит учетную запись автоматизации, предотвращает запуск любых runbook. Для этих операций требуется запрос, использующий метод POST.

  • Блокировка не удаляемого ресурса или группы ресурсов предотвращает удаление назначений Azure RBAC.

  • Блокировка "не удается удалить" группы ресурсов запрещает Azure Resource Manager автоматически удалять развертывания в журнале. При достижении 800 развертываний в журнале ваши развертывания начнут завершаться сбоем.

  • Блокировка "не удается удалить" в группе ресурсов, созданной службой Azure Backup, приводит к сбою резервного копирования. Служба поддерживает не более 18 точек восстановления. При наличии блокировки служба резервного копирования не может удалять точки восстановления. Более подробные сведения см. в разделе Часто задаваемые вопросы о резервном копировании виртуальных машин Azure.

  • Блокировка удаления для группы ресурсов, содержащей рабочие области Машинного обучения Azure, нарушает правильную работу автомасштабирования вычислительных кластеров Машинного обучения Azure. При блокировке автомасштабирование не может удалить неиспользуемые узлы. Решение потребляет больше ресурсов, чем требуется для рабочей нагрузки.

  • Блокировка только для чтения в рабочей области Log Analytics не позволяет включить аналитику поведения пользователей и сущностей (UEBA).

  • Блокировка не удаляемой в рабочей области Log Analytics не предотвращает операции очистки данных. Вместо этого удалите роль очистки данных от пользователя.

  • Блокировка "только для чтения" в подписке не позволяет Azure Advisor работать корректно. Advisor не удается сохранять результаты запросов.

  • Блокировка "только для чтения" шлюза приложений не позволяет получить сведения о работоспособности серверной части шлюза приложений. Эта операция использует метод POST, который запрещается блокировкой "только для чтения".

  • Блокировка "только для чтения" в кластере Azure Kubernetes Service (AKS) ограничивает доступ к ресурсам кластера через портал. Блокировка "только для чтения" не позволяет использовать раздел "Ресурсы Kubernetes" кластера AKS на портале Azure для выбора ресурса кластера. Для выполнения этих операций требуется запрос проверки подлинности, использующий метод POST.

  • Блокировка с запретом на удаление виртуальной машины, защищенной Site Recovery, не позволяет правильно удалить определенные ссылки на ресурсы, связанные с Site Recovery, при удалении защиты или отключении репликации. Если вы планируете снова защитить виртуальную машину позже, необходимо удалить блокировку перед отключением защиты. Если блокировка не удалена, необходимо выполнить определенные действия, чтобы очистить устаревшие ссылки, прежде чем защитить виртуальную машину. Дополнительные сведения можно найти в статье Устранение неполадок репликации виртуальных машин Azure.

Кто может создавать или удалять блокировки

Для создания или удаления блокировок управления необходим доступ к действию Microsoft.Authorization/* или Microsoft.Authorization/locks/*. Пользователи, назначенные владельцу и ролям доступа пользователей Администратор istrator, имеют необходимый доступ. Некоторые специализированные встроенные роли также предоставляют этому доступу. Вы также можете создать настраиваемую роль с необходимыми разрешениями.

Управляемые приложения и блокировки

Некоторые службы Azure, например Azure Databricks, используют для реализации этой службы управляемые приложения. В этом случае служба создает две группы ресурсов. Одна из них — это разблокированная группа ресурсов, содержащая общие сведения о службе. Другая — заблокированная группа ресурсов, содержащая инфраструктуру службы.

При попытке удалить инфраструктурную группу ресурсов отображается ошибка с уведомлением о том, что группа ресурсов заблокирована. Если попытаться удалить блокировку инфраструктурной группы ресурсов, отображается ошибка с уведомлением о том, что удалить блокировку невозможно, так как она принадлежит системному приложению.

Вместо этого необходимо удалить службу, в результате чего будет удалена и инфраструктурная группа ресурсов.

В случае с управляемыми приложениями выбирайте развернутую вами службу.

Screenshot of the Azure portal with an instance of Azure Databricks selected.

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

Screenshot displaying the Managed Resource Group link in the Azure portal.

Чтобы удалить все данные для службы, включая заблокированную инфраструктурную группу ресурсов, выберите Удалить для этой службы.

Screenshot of the Azure portal with the Delete option for the selected service.

Настройка блокировок

Портал

На панели навигации слева находятся функция блокировки подписки (Блокировки ресурсов) и функция блокировки группы ресурсов (Блокировки).

  1. В колонке параметров для ресурса, группы ресурсов или подписки, которые необходимо заблокировать, выберите Блокировки.

    Select lock.

  2. Чтобы добавить блокировку, выберите Добавить. Если вы хотите создать блокировку на родительском уровне, выберите родительский ресурс. Выбранный ресурс наследует блокировку от родительского ресурса. Например, можно заблокировать группу ресурсов, чтобы применить блокировку ко всем ее ресурсам.

    Add lock.

  3. Присвойте блокировке имя и уровень блокировки. При необходимости можно добавить примечания, описывающие блокировку.

    Set lock.

  4. Нажмите кнопку Удалить, чтобы удалить выбранную блокировку.

    Delete lock.

Template

При использовании шаблона ARM или файла Bicep для развертывания блокировки необходимо понимать, как область развертывания и область блокировки взаимодействуют друг с другом. Чтобы применить блокировку в области развертывания, например, чтобы заблокировать группу ресурсов или подписку, не устанавливайте свойство области действия. При блокировке ресурса в области развертывания установите свойство области действия для блокировки.

Следующий шаблон применяет блокировку к группе ресурсов. Обратите внимание, что в ресурсе блокировки нет свойства области действия, так как область блокировки соответствует области развертывания. Разверните этот шаблон на уровне группы ресурсов.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "resources": [
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "rgLock",
      "properties": {
        "level": "CanNotDelete",
        "notes": "Resource group should not be deleted."
      }
    }
  ]
}

Чтобы создать группу ресурсов и заблокировать ее, разверните следующий шаблон на уровне подписки.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2021-04-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "name": "lockDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2016-09-01",
              "name": "rgLock",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Resource group and its resources should not be deleted."
              }
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

При применении блокировки к ресурсу в группе ресурсов добавьте свойство "Scope". Введите имя ресурса в качестве области блокировки.

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

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "hostingPlanName": {
      "type": "string"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "variables": {
    "siteName": "[concat('ExampleSite', uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2020-12-01",
      "name": "[parameters('hostingPlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "tier": "Free",
        "name": "f1",
        "capacity": 0
      },
      "properties": {
        "targetWorkerCount": 1
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2020-12-01",
      "name": "[variables('siteName')]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]"
      ],
      "properties": {
        "serverFarmId": "[parameters('hostingPlanName')]"
      }
    },
    {
      "type": "Microsoft.Authorization/locks",
      "apiVersion": "2016-09-01",
      "name": "siteLock",
      "scope": "[concat('Microsoft.Web/sites/', variables('siteName'))]",
      "dependsOn": [
        "[resourceId('Microsoft.Web/sites', variables('siteName'))]"
      ],
      "properties": {
        "level": "CanNotDelete",
        "notes": "Site should not be deleted."
      }
    }
  ]
}

Azure PowerShell

Вы можете заблокировать развернутые ресурсы с помощью Azure PowerShell, выполнив команду New-AzResourceLock.

Чтобы заблокировать ресурс, укажите имя и тип ресурса, а также имя группы ресурсов.

New-AzResourceLock -LockLevel CanNotDelete -LockName LockSite -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

Чтобы заблокировать группу ресурсов, укажите ее имя.

New-AzResourceLock -LockName LockGroup -LockLevel CanNotDelete -ResourceGroupName exampleresourcegroup

Для получения информации о блокировке используйте команду Get-AzResourceLock. Чтобы получить все блокировки в подписке, выполните следующую команду:

Get-AzResourceLock

Чтобы получить все блокировки для ресурса, выполните следующую команду:

Get-AzResourceLock -ResourceName examplesite -ResourceType Microsoft.Web/sites -ResourceGroupName exampleresourcegroup

Чтобы получить все блокировки для группы ресурсов, выполните следующую команду:

Get-AzResourceLock -ResourceGroupName exampleresourcegroup

Чтобы удалить блокировку для ресурса, используйте:

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup -ResourceName examplesite -ResourceType Microsoft.Web/sites).LockId
Remove-AzResourceLock -LockId $lockId

Чтобы удалить блокировку для группы ресурсов, используйте:

$lockId = (Get-AzResourceLock -ResourceGroupName exampleresourcegroup).LockId
Remove-AzResourceLock -LockId $lockId

Azure CLI

Вы можете заблокировать развернутые ресурсы с помощью Azure CLI, выполнив команду az lock create.

Чтобы заблокировать ресурс, укажите имя и тип ресурса, а также имя группы ресурсов.

az lock create --name LockSite --lock-type CanNotDelete --resource-group exampleresourcegroup --resource-name examplesite --resource-type Microsoft.Web/sites

Чтобы заблокировать группу ресурсов, укажите ее имя.

az lock create --name LockGroup --lock-type CanNotDelete --resource-group exampleresourcegroup

Чтобы получить сведения о блокировке, выполните команду az lock list. Чтобы получить все блокировки в подписке, выполните следующую команду:

az lock list

Чтобы получить все блокировки для ресурса, выполните следующую команду:

az lock list --resource-group exampleresourcegroup --resource-name examplesite --namespace Microsoft.Web --resource-type sites --parent ""

Чтобы получить все блокировки для группы ресурсов, выполните следующую команду:

az lock list --resource-group exampleresourcegroup

Чтобы удалить блокировку для ресурса, используйте:

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup --resource-type Microsoft.Web/sites --resource-name examplesite --output tsv --query id)
az lock delete --ids $lockid

Чтобы удалить блокировку для группы ресурсов, используйте:

lockid=$(az lock show --name LockSite --resource-group exampleresourcegroup  --output tsv --query id)
az lock delete --ids $lockid

Python

Вы блокируете развернутые ресурсы с помощью Python с помощью команды ManagementLockClient.management_locks.create_or_update_at_resource_group_level .

Чтобы заблокировать ресурс, укажите имя и тип ресурса, а также имя группы ресурсов.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.create_or_update_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite",
    {
        "level": "CanNotDelete"
    }
)

Чтобы заблокировать группу ресурсов, укажите ее имя.

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.create_or_update_at_resource_group_level(
    "exampleGroup",
    "lockGroup",
    {
        "level": "CanNotDelete"
    }
)

Чтобы получить сведения обо всех блокировках в подписке, используйте ManagementLockClient.management_locks.get. Чтобы получить все блокировки в подписке, выполните следующую команду:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.list_at_subscription_level()

for lock in lock_result:
    print(f"Lock name: {lock.name}")
    print(f"Lock level: {lock.level}")
    print(f"Lock notes: {lock.notes}")

Чтобы получить блокировку ресурса, используйте:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.get_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite"
)

print(f"Lock ID: {lock_result.id}")
print(f"Lock Name: {lock_result.name}")
print(f"Lock Level: {lock_result.level}")

Чтобы получить блокировку для группы ресурсов, используйте:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_result = lock_client.management_locks.get_at_resource_group_level(
    "exampleGroup",
    "lockGroup"
)

print(f"Lock ID: {lock_result.id}")
print(f"Lock Level: {lock_result.level}")

Чтобы удалить блокировку для ресурса, используйте:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_client.management_locks.delete_at_resource_level(
    "exampleGroup",
    "Microsoft.Web",
    "",
    "sites",
    "examplesite",
    "lockSite"
)

Чтобы удалить блокировку для группы ресурсов, используйте:

import os
from azure.identity import AzureCliCredential
from azure.mgmt.resource import ManagementLockClient

credential = AzureCliCredential()
subscription_id = os.environ["AZURE_SUBSCRIPTION_ID"]

lock_client = ManagementLockClient(credential, subscription_id)

lock_client.management_locks.delete_at_resource_group_level("exampleGroup", "lockGroup")

REST API

Вы можете заблокировать развернутые ресурсы с помощью REST API для блокировок управления. REST API позволяет создавать и удалять блокировки и получать информацию о существующих блокировках.

Чтобы создать блокировку, выполните следующую команду:

PUT https://management.azure.com/{scope}/providers/Microsoft.Authorization/locks/{lock-name}?api-version={api-version}

Областью может быть подписка, группа ресурсов или ресурс. Вы можете назначить блокировке любое имя. Для версии API укажите значение 2016-09-01.

В запросе включите объект JSON, который задает свойства блокировки.

{
  "properties": {
  "level": "CanNotDelete",
  "notes": "Optional text notes."
  }
}

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