Ограничение исходящего доступа из кластера Azure Data Explorer

Ограничение исходящего доступа из кластера важно для снижения таких рисков, как, например, кража данных. Злоумышленник может создать внешнюю таблицу для учетной записи хранения и извлечь большие объемы данных. Вы можете управлять исходящим доступом на уровне кластера, определив политики внешних вызовов. Управление политиками внешних вызовов позволяет разрешить исходящий доступ к указанным SQL, хранилищу или другим конечным точкам.

В этой статье вы узнаете, как использовать расширения для политик внешних вызовов, позволяющих дополнительно ограничить вызовы из кластера.

Типы политик внешних вызовов

Политики внешних вызовов можно разделить следующим образом:

  • Неизменяемые политики внешних вызовов: Это стандартные политики кластера. Они предварительно настроены и не могут быть изменены.
  • Политики внешних вызовов кластера: Это политики, которые можно изменить с помощью команд политики внешних вызовов.

Предварительные требования

Команды запуска политики внешних вызовов

  1. Войдите в пользовательский веб-интерфейс Azure Data Explorer.

  2. В меню слева выберите Запрос и подключитесь к кластеру.

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

    .show cluster policy callout
    

    Снимок экрана: страница ограниченного запроса с неизменяемыми политиками внешних вызовов.

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

[
   {
      "CalloutType":"kusto",
      "CalloutUriRegex":"[a-z0-9]{3,22}\\.(\\w+\\.)?kusto(mfa)?\\.windows\\.net/?$",
      "CanCall":true
   },
   {
      "CalloutType":"kusto",
      "CalloutUriRegex":"//[a-z0-9]{3,22}\\.[a-z0-9-]{1,50}\\.(kusto\\.azuresynapse|kustodev\\.azuresynapse-dogfood)\\.net/?$",
      "CanCall":true
   },
   {
      "CalloutType":"kusto",
      "CalloutUriRegex":"^https://([A-Za-z0-9]+\\.)?(ade|adx)\\.(int\\.)?(applicationinsights|loganalytics|monitor)\\.(io|azure(\\.com|\\.us|\\.cn))/",
      "CanCall":true
   },
   {
      "CalloutType":"sql",
      "CalloutUriRegex":"[a-z0-9][a-z0-9\\-]{0,61}[a-z0-9]?\\.database\\.windows\\.net/?$",
      "CanCall":true
   },
   {
      "CalloutType":"sql",
      "CalloutUriRegex":"[a-z0-9-]{0,61}?(-ondemand)?\\.sql\\.azuresynapse(-dogfood)?\\.net/?$",
      "CanCall":true
   },
   {
      "CalloutType":"external_data",
      "CalloutUriRegex":".*",
      "CanCall":true
   },
   {
      "CalloutType":"azure_digital_twins",
      "CalloutUriRegex":"[A-Za-z0-9\\-]{3,63}\\.api\\.[A-Za-z0-9]+\\.digitaltwins\\.azure\\.net/?$",
      "CanCall":true
   }
]

Очистка списка неизменяемых политик внешних вызовов

Чтобы ограничить исходящий доступ из кластера, необходимо очистить список неизменяемых политик внешних вызовов. Для этого выполните следующую команду с помощью Azure CLI или любых других средств, вызвав API-интерфейсы Azure Data Explorer.

  1. Активируйте развертывание ARM с помощью Azure CLI с обновленным шаблоном ARM:

    Пример файла шаблона ARM с именем template.json и свойством restrictOutboundNetworkAccess, установленным на значение Включено:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      ...
      "resources": [
          {
              "type": "Microsoft.Kusto/Clusters",
              "apiVersion": "2021-02-01",
              ...
              "properties": {
                  ...
                  "restrictOutboundNetworkAccess": "Enabled",
                  ...
              }
          }
          ...
      ]
    }
    

    Пример вызова с помощью Azure CLI, ссылающегося на шаблон выше.

    # Replace the <...> placeholders with the correct values
    az deployment group create   --name RestrictOutboundAccess   --resource-group <resource group>   --template-file ./template.json
    

    При обновлении свойства кластера restrictOutboundNetworkAccess удаляются все неизменяемые политики в кластере. Это предотвращает инициирование внешних вызовов для других служб, как показано в следующем примере.

    Снимок экрана: страница ограниченного запроса с ошибкой неизменяемых политик внешних вызовов.

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

    .show cluster policy callout 
    | where EntityType == "Cluster immutable policy"
    

    Снимок экрана: страница ограниченного запроса без неизменяемых политик внешних вызовов.

Добавление полных доменных имен во внешние вызовы при ограниченных условиях

Если вы хотите разрешить исходящий доступ к определенному полному доменному имени, его можно добавить в список allowedFqdnList вашего кластера. Это можно сделать, внося изменения в шаблон ARM кластера Data Explorer Azure.

  1. Активируйте развертывание ARM с помощью Azure CLI с обновленным шаблоном ARM:

    Пример файла шаблона ARM с именем template.json и свойством allowedFqdnList, установленным на ["some.sql.azuresynapse.net", "..."]:

    {
      "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
      "contentVersion": "1.0.0.0",
      ...
      "resources": [
          {
              "type": "Microsoft.Kusto/Clusters",
              "apiVersion": "2021-02-01",
              ...
              "properties": {
                  ...
                  "restrictOutboundNetworkAccess": "Enabled",
                  "allowedFqdnList": ["some.sql.azuresynapse.net", "..."]
                  ...
              }
          }
          ...
      ]
    }
    

    Пример вызова с помощью Azure CLI, ссылающегося на шаблон выше.

    # Replace the <...> placeholders with the correct values
    az deployment group create   --name ConfigureAllowedFqdnList   --resource-group <resource group>   --template-file ./template.json
    
  2. Добавив полное доменное имя в список разрешенных, вы сможете выполнять вызовы к указанному полному домену. Вы можете проверить результат развертывания, выполнив следующую команду:

    .show cluster policy callout 
    | project Policy=parse_json(Policy)
    | mv-expand Policy
    | where Policy.CalloutType == "sql" 
    

    Снимок экрана: страница ограниченного запроса с настраиваемой политикой внешних вызовов.

    Примечание

    Существует набор политик по умолчанию для Azure Data Explorer для взаимодействия с внутренним уровнем хранения. Они не создают риска кражи данных.