Аудит операций уровня управления Azure Cosmos DB

ПРИМЕНИМО К: Nosql Mongodb Кассандра Гремлин Таблица

Плоскость управления в Azure Cosmos DB — это служба RESTful, которая позволяет выполнять различные операции с учетной записью Azure Cosmos DB. Она предоставляет конечным пользователям доступ к открытой модели ресурсов (например, базе данных, учетной записи) и различным операциям для выполнения действий с моделью ресурсов. Операции уровня управления включают изменения в учетной записи или контейнере Azure Cosmos DB. Например, такие операции, как создание учетной записи Azure Cosmos DB, добавление региона, обновление пропускной способности, отработка отказа региона, добавление виртуальной сети и т. д., являются некоторыми из операций уровня управления. В этой статье объясняется, как выполнять аудит операций уровня управления в Azure Cosmos DB. Операции уровня управления можно выполнять в учетных записях Azure Cosmos DB с помощью Azure CLI, PowerShell или портал Azure, а для контейнеров — с помощью Azure CLI или PowerShell.

Ниже описано несколько сценариев, в которых бывает полезен аудит операций уровня управления.

  • Вы хотите получать оповещение при изменении правил брандмауэра для учетной записи Azure Cosmos DB. Оповещение требуется для поиска несанкционированных изменений в правилах, которые управляют сетевой безопасностью учетной записи Azure Cosmos DB, и быстрых действий.

  • Вы хотите получать оповещение о добавлении или удалении нового региона из учетной записи Azure Cosmos DB. Добавление или удаление регионов влияет на требования к выставлению счетов и независимости данных. Это оповещение помогает обнаружить случайное добавление или удаление региона в учетной записи.

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

Отключение доступа на запись к метаданным на основе ключей

Прежде чем выполнять аудит операций уровня управления в Azure Cosmos DB, отключите в своей учетной записи доступ на запись к метаданным на основе ключей. Если доступ на запись метаданных на основе ключей отключен, клиенты, подключающиеся к учетной записи Azure Cosmos DB с помощью ключей учетной записи, не могут получить доступ к учетной записи. Чтобы отключить доступ на запись, задайте для свойства disableKeyBasedMetadataWriteAccess значение true. После установки этого свойства изменения в любой ресурс может вносить только пользователь с надлежащей ролью и учетными данными Azure. Дополнительные сведения о том, как включить это свойство, см. в статье о предотвращении изменений из пакетов SDK.

Если после включения параметра disableKeyBasedMetadataWriteAccess приложение на базе пакета SDK выполняет операцию создания или обновления, ему возвращается сообщение об ошибке, что операция POST для ресурса ContainerNameorDatabaseName через конечную точку Azure Cosmos DB не разрешена. Вам следует включить доступ к таким операциям для своей учетной записи либо выполнять операции создания и обновления с помощью Azure Resource Manager, Azure CLI или Azure PowerShell. Чтобы переключиться назад, установите для параметра disableKeyBasedMetadataWriteAccess значение false с помощью Azure CLI, как описано в статье Предотвращение изменений из пакета SDK для Azure Cosmos DB . Обратите внимание, что значение disableKeyBasedMetadataWriteAccess нужно изменить на false, а не на true.

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

  • Проверьте и убедитесь, что ваши приложения не выполняют вызовы к метаданным, которые изменяли бы указанные выше ресурсы (например, создание коллекции, изменение пропускной способности и т. п.), с помощью пакета SDK или ключей учетной записи.

  • Если параметру disableKeyBasedMetadataWriteAccess присвоено значение true, операции с метаданными, осуществляемые пакетом SDK, блокируются. Кроме того, для выполнения этих операций можно использовать портал Azure, Azure CLI, Azure PowerShell или развернутые шаблоны Azure Resource Manager.

Включение журналов диагностики для операций уровня управления

Вы можете включить журналы диагностики для операций уровня управления с помощью портала Azure. После включения соответствующие операции будут заноситься в журналы диагностики в виде пары событий начала и завершения с соответствующими подробностями. Например, для операций RegionFailoverStart и RegionFailoverComplete возникает событие отработки отказа региона.

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

  1. Войдите на портал Azure и перейдите в учетную запись Azure Cosmos DB.

  2. Откройте область Параметры диагностики и укажите имя для журналов.

  3. Выберите ControlPlaneRequests в качестве типа журнала и включите параметр Отправлять в Log Analytics.

  4. При необходимости отправьте журналы диагностики в службу хранилища Azure, Центры событий Azure, Azure Monitor или сторонние поставщики.

Кроме того, журналы можно хранить в учетной записи хранения или передавать в потоковом режиме в концентратор событий. В этой статье объясняется, как отправлять журналы в Log Analytics, а затем запрашивать их. После включения журналов диагностики для их вступления в силу требуется несколько минут. Все операции уровня управления, выполняемые после этого момента, отслеживаются. На следующем снимке экрана показано, как включить журналы уровня управления:

Включение журналов запросов уровня управления

Просмотр операций уровня управления

После включения журнала для отслеживания операций в определенной учетной записи выполните указанные ниже действия.

  1. Войдите на портал Azure.

  2. Откройте вкладку Монитор на панели навигации слева и выберите область Журналы. Откроется пользовательский интерфейс, в котором можно легко выполнять запросы в области данной учетной записи. Чтобы просмотреть журналы уровня управления, выполните следующий запрос:

    AzureDiagnostics
    | where ResourceProvider=="MICROSOFT.DOCUMENTDB" and Category=="ControlPlaneRequests"
    | where TimeGenerated >= ago(1h)
    

    На следующих снимках экрана записываются журналы при изменении уровня согласованности для учетной записи Azure Cosmos DB. Значение activityId_g в результатах отличается от идентификатора действия операции.

    Журналы уровня управления при добавлении виртуальной сети

    На следующих снимках экрана показаны журналы при создании пространства ключей или таблицы учетной записи Cassandra, а также при изменении пропускной способности. Журналы уровня управления для операций создания и обновления в базе данных и контейнере ведутся отдельно, как показано на следующем снимке экрана:

    Журналы уровня управления при изменении пропускной способности

Определение удостоверения, связанного с определенной операцией

Для более детальной отладки можно найти конкретную операцию в журнале действий по activityId_g или метке времени. Метка времени используется некоторыми клиентами диспетчера ресурсов, если идентификатор действия не передается явным образом. Журнал действий содержит подробные сведения об удостоверении, с помощью которого была инициирована операция. На следующем снимке экрана показано, как использовать activityId_g и найти связанные с ним операции в журнале действий.

Использование идентификатора действия для поиска операций

Операции уровня управления для учетной записи Azure Cosmos DB

Ниже перечислены операции уровня управления, доступные на уровне учетной записи. Большинство операций отслеживаются на уровне учетной записи. Эти операции отражаются в виде метрик в Azure Monitor.

  • Добавление региона
  • Удаление региона
  • Удаление учетной записи
  • Отработка отказа региона
  • Созданная учетная запись
  • Удаление виртуальной сети
  • Изменение сетевых параметров учетной записи
  • Изменение параметров репликации учетной записи
  • Изменение ключей учетной записи
  • Изменение параметров резервного копирования учетной записи
  • Изменение параметров диагностики учетной записи

Операции уровня управления для базы данных или контейнеров

Ниже перечислены операции уровня управления, доступные на уровне базы данных и контейнера. Эти операции отражаются в виде метрик в Azure Monitor.

  • Создание базы данных SQL
  • Обновление базы данных SQL
  • Изменение пропускной способности базы данных SQL
  • Удаление базы данных SQL
  • Создание контейнера SQL
  • Обновление контейнера SQL
  • Изменение пропускной способности контейнера SQL
  • Удаление контейнера SQL
  • Создание пространства ключей Cassandra
  • Обновление пространства ключей Cassandra
  • Изменение пропускной способности пространства ключей Cassandra
  • Удаление пространства ключей Cassandra
  • Создание таблицы Cassandra
  • Обновление таблицы Cassandra
  • Изменение пропускной способности таблицы Cassandra
  • Удаление таблицы Cassandra
  • Создание базы данных Gremlin
  • Обновление базы данных Gremlin
  • Изменение пропускной способности базы данных Gremlin
  • Удаление базы данных Gremlin
  • Создание графа Gremlin
  • Обновление графа Gremlin
  • Изменение пропускной способности графа Gremlin
  • Удаление графа Gremlin
  • Создание базы данных Mongo
  • Обновление базы данных Mongo
  • Изменение пропускной способности базы данных Mongo
  • Удаление базы данных Mongo
  • Создание коллекции Mongo
  • Обновление коллекции Mongo
  • Изменение пропускной способности коллекции Mongo
  • Удаление коллекции Mongo
  • Создание таблицы AzureTable
  • Обновление таблицы AzureTable
  • Изменение пропускной способности таблицы AzureTable
  • Удаление таблицы AzureTable

Операции с журналом диагностики

Ниже перечислены имена различных операций в журналах диагностики.

  • RegionAddStart, RegionAddComplete
  • RegionRemoveStart, RegionRemoveComplete
  • AccountDeleteStart, AccountDeleteComplete
  • RegionFailoverStart, RegionFailoverComplete
  • AccountCreateStart, AccountCreateComplete
  • AccountUpdateStart, AccountUpdateComplete
  • VirtualNetworkDeleteStart, VirtualNetworkDeleteComplete
  • DiagnosticLogUpdateStart, DiagnosticLogUpdateComplete

Для операций API имя указывается в следующем формате:

  • ApiKind + ApiKindResourceType + OperationType
  • ApiKind + ApiKindResourceType + "Throughput" + operationType

Пример

  • CassandraKeyspacesCreate
  • CassandraKeyspacesUpdate
  • CassandraKeyspacesThroughputUpdate
  • SqlContainersUpdate

Свойство ResourceDetails содержит весь текст ресурса в качестве полезных данных запроса, а также все свойства, запрошенные для обновления

Запросы журналов диагностики для операций уровня управления

Ниже приведены примеры запросов к журналам диагностики для операций управления плоскостью.

AzureDiagnostics 
| where Category startswith "ControlPlane"
| where OperationName contains "Update"
| project httpstatusCode_s, statusCode_s, OperationName, resourceDetails_s, activityId_g
AzureDiagnostics 
| where Category =="ControlPlaneRequests"
| where TimeGenerated >= todatetime('2020-05-14T17:37:09.563Z')
| project TimeGenerated, OperationName, apiKind_s, apiKindResourceType_s, operationType_s, resourceDetails_s
AzureDiagnostics
| where Category == "ControlPlaneRequests"
| where OperationName startswith "SqlContainersUpdate"
AzureDiagnostics
| where Category == "ControlPlaneRequests"
| where OperationName startswith "SqlContainersThroughputUpdate"

Запрос для получения идентификатора activityId и вызывающего объекта, который инициировал операцию удаления контейнера:

(AzureDiagnostics
| where Category == "ControlPlaneRequests"
| where OperationName == "SqlContainersDelete"
| where TimeGenerated >= todatetime('9/3/2020, 5:30:29.300 PM')
| summarize by activityId_g )
| join (
AzureActivity
| parse HTTPRequest with * "clientRequestId\": \"" activityId_g "\"" * 
| summarize by Caller, HTTPRequest, activityId_g)
on activityId_g
| project Caller, activityId_g

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

AzureDiagnostics
| where Category =="ControlPlaneRequests"
| where  OperationName == "SqlContainersUpdate"
| project resourceDetails_s

Выходные данные:

{id:skewed,indexingPolicy:{automatic:true,indexingMode:consistent,includedPaths:[{path:/*,indexes:[]}],excludedPaths:[{path:/_etag/?}],compositeIndexes:[],spatialIndexes:[]},partitionKey:{paths:[/pk],kind:Hash},defaultTtl:1000000,uniqueKeyPolicy:{uniqueKeys:[]},conflictResolutionPolicy:{mode:LastWriterWins,conflictResolutionPath:/_ts,conflictResolutionProcedure:}

Дальнейшие действия