Como auditar operações do painel de controle do Azure Cosmos DB

APLICA-SE A: NoSQL MongoDB Cassandra Gremlin Table

O painel de controle no Azure Cosmos DB é um serviço RESTful que permite executar um conjunto variado de operações na conta do Azure Cosmos DB. Ele expõe um modelo de recurso público (por exemplo: banco de dados, conta) e várias operações para os usuários finais executarem ações no modelo de recurso. As operações do painel de controle incluem alterações no contêiner ou na conta do Azure Cosmos DB. Por exemplo, criar uma conta do Azure Cosmos DB, adicionar uma região, atualizar a taxa de transferência, failover de região, adicionar uma VNet etc. são algumas das operações do painel de controle. Este artigo explica como auditar as operações do painel de controle no Azure Cosmos DB. É possível executar as operações do painel de controle em contas do Azure Cosmos DB usando a CLI do Azure, o PowerShell ou o portal do Azure. Para contêineres, usar a CLI do Azure ou o PowerShell.

Veja a seguir alguns cenários de exemplo em que as operações do painel de controle de auditoria são úteis:

  • Você deseja receber um alerta quando as regras de firewall da sua conta do Azure Cosmos DB são modificadas. O alerta é necessário para localizar modificações não autorizadas nas regras que regem a segurança de rede de sua conta do Azure Cosmos DB e agir rapidamente.

  • Você deseja receber um alerta se uma nova região for adicionada ou removida da sua conta do Azure Cosmos DB. Adicionar ou remover regiões tem implicações na cobrança e nos requisitos de soberania de dados. Este alerta ajuda a detectar uma adição ou remoção acidental de região em sua conta.

  • Você quer saber mais detalhes sobre o que mudou nos logs de diagnóstico. Por exemplo, quando uma VNet é alterada.

Desabilitar acesso de gravação de metadados baseado em chave

Antes de auditar as operações do painel de controle no Azure Cosmos DB, desabilite o acesso de gravação de metadados baseado em chave em sua conta. Quando o acesso de gravação de metadados baseado em chave está desabilitado, os clientes que se conectam à conta do Azure Cosmos DB por meio de chaves de conta são impedidos de acessar. Você pode desabilitar o acesso de gravação definindo a propriedade disableKeyBasedMetadataWriteAccess como true. Depois de definir essa propriedade, usuários com a função e as credenciais adequadas no Azure poderão alterar qualquer recurso. Para saber mais sobre como habilitar essa propriedade, confira Impedir alterações por meio dos SDKs.

Depois que o disableKeyBasedMetadataWriteAccess for ativado, se os clientes baseados em SDK executarem operações de criação ou atualização, um erro "Operação POST no recurso ContainerNameorDatabaseName não é permitida por meio do ponto de extremidade do Azure Cosmos DB será exibido. Você precisa ativar o acesso a essas operações na sua conta ou executar as operações de criação/atualização por meio do Azure Resource Manager, da CLI do Azure ou do Azure PowerShell. Para desfazer, defina disableKeyBasedMetadataWriteAccess como false usando a CLI do Azure conforme descrito no artigo Impedir alterações do SDK do Azure Cosmos DB. Não se esqueça de alterar o valor de disableKeyBasedMetadataWriteAccess para false em vez de true.

Considere os seguintes pontos ao desativar o acesso de gravação de metadados:

  • Avalie e verifique se os aplicativos não fazem chamadas de metadados que alteram os recursos acima (por exemplo, criar coleção, atualizar taxa de transferência...) usando o SDK ou as chaves de conta.

  • QuandodisableKeyBasedMetadataWriteAccess é definido como true, as operações de metadados emitidas pelo SDK são bloqueadas. Como alternativa, você pode usar implantações de modelo do portal do Azure, CLI do Azure, Azure PowerShell ou gerenciador de recursos do Azure para executar essas operações.

Habilitar logs de diagnóstico para operações de painel de controle

É possível habilitar os logs de diagnóstico para operações de painel de controle usando o portal do Azure. Depois de habilitar, os logs de diagnóstico registrarão a operação como um par de eventos de início e de conclusão com detalhes relevantes. Por exemplo, RegionFailoverStart e RegionFailoverComplete concluirão o evento de failover de região.

Siga estas etapas para habilitar logs nas operações do painel de controle:

  1. Entre no portal do Azure e navegue até a sua conta Microsoft Azure Cosmos DB.

  2. Abra o painel Configurações de diagnóstico e digite um Nome para os logs a serem criados.

  3. Selecione ControlPlaneRequests como tipo de log e escolha a opção Enviar para o Log Analytics.

  4. Opcionalmente, envie os logs de diagnóstico para o Armazenamento do Azure, Hubs de Eventos do Azure, Azure Monitor, ou terceiros.

Você também pode armazenar os logs em uma conta de armazenamento ou transmitir para um hub de eventos. Este artigo mostra como enviar logs para a análise de logs e, em seguida, consultá-los. Depois de habilitar, levará alguns minutos para que os logs de diagnóstico entrem em vigor. Todas as operações do painel de controle executadas depois disso podem ser controladas. A captura de tela a seguir mostra como habilitar os logs do painel de controle:

Habilitar logs de solicitações do painel de controle

Ver operações do painel de controle

Após ativar os logs, siga estas etapas para rastrear as operações de uma conta específica:

  1. Entre no portal do Azure.

  2. Abra a guia Monitor na navegação esquerda e selecione o painel Logs. Ele abre uma interface do usuário na qual você pode facilmente executar consultas com essa conta específica no escopo. Execute a consulta a seguir para exibir os logs do painel de controle:

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

    As capturas de tela a seguir mostram logs quando um nível de consistência é alterado para uma conta do Azure Cosmos DB. O valor activityId_g dos resultados é diferente da ID de atividade de uma operação:

    Logs do painel de controle quando uma VNet é adicionada

    As capturas de tela a seguir mostram os logs quando o keyspace ou uma tabela de uma conta Cassandra são criados e quando a taxa de transferência é atualizada. Os logs do painel de controle para operações de criação e atualização no banco de dados e no contêiner são registrados separadamente, conforme mostrado na seguinte captura de tela:

    Logs do painel de controle quando a taxa de transferência é atualizada

Identificar a identidade associada a uma operação específica

Se você quiser depurar ainda mais, poderá identificar uma operação específica no Log de atividades usando a activityId_g ou o carimbo de data/hora da operação. O carimbo de data/hora é usado para alguns clientes do Resource Manager em que a ID da atividade não é passada explicitamente. O log de atividades fornece detalhes sobre a identidade com a qual a operação foi iniciada. A captura de tela a seguir mostra como usar a activityId_g para localizar as operações associadas a ela no log de atividades:

Usar a ID da atividade e localizar as operações

Operações do painel de controle para a conta do Azure Cosmos DB

Veja as operações do painel de controle disponíveis no nível da conta. A maioria das operações é controlada no nível da conta. Estas operações estão disponíveis como métricas no Azure Monitor:

  • Região adicionada
  • Região removida
  • Conta excluída
  • Região com failover
  • Conta criada
  • Rede virtual excluída
  • Configurações de rede da conta atualizadas
  • Configurações de replicação da conta atualizadas
  • Chaves de conta atualizadas
  • Configurações de backup da conta atualizadas
  • Configurações de diagnóstico da conta atualizadas

Operações do painel de controle para bancos de dados ou contêineres

Veja as operações do painel de controle disponíveis no nível do banco de dados e do contêiner. Estas operações estão disponíveis como métricas no Azure Monitor:

  • Banco de Dados SQL criado
  • Banco de Dados SQL atualizado
  • Taxa de transferência do Banco de Dados SQL atualizada
  • Banco de Dados SQL excluído
  • Contêiner SQL criado
  • Contêiner SQL atualizado
  • Taxa de transferência do contêiner SQL atualizada
  • Contêiner SQL excluído
  • Keyspace do Cassandra criado
  • Keyspace do Cassandra atualizado
  • Taxa de transferência do keyspace do Cassandra atualizada
  • Keyspace do Cassandra excluído
  • Tabela do Cassandra criada
  • Tabela do Cassandra atualizada
  • Taxa de transferência da tabela do Cassandra atualizada
  • Tabela do Cassandra excluída
  • Banco de dados do Gremlin criado
  • Banco de dados do Gremlin atualizado
  • Taxa de transferência do banco de dados do Gremlin atualizada
  • Banco de dados do Gremlin excluído
  • Grafo do Gremlin criado
  • Grafo do Gremlin atualizado
  • Taxa de transferência do grafo do Gremlin atualizada
  • Grafo do Gremlin excluído
  • Banco de dados do Mongo criado
  • Banco de dados do Mongo atualizado
  • Taxa de transferência do banco de dados do Mongo atualizada
  • Banco de dados do Mongo excluído
  • Coleção do Mongo criada
  • Coleção do Mongo atualizada
  • Taxa de transferência da coleção do Mongo atualizada
  • Coleção do Mongo excluída
  • Tabela AzureTable criada
  • Tabela AzureTable atualizada
  • Taxa de transferência da tabela AzureTable atualizada
  • Tabela AzureTable excluída

Operações de log de diagnóstico

Veja os nomes de diferentes operações nos logs de diagnóstico:

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

Operações específicas de API têm o seguinte formato de nome:

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

Exemplo

  • CassandraKeyspacesCreate
  • CassandraKeyspacesUpdate
  • CassandraKeyspacesThroughputUpdate
  • SqlContainersUpdate

A propriedade ResourceDetails contém o corpo do recurso inteiro como um conteúdo de solicitação e contém todas as propriedades solicitadas para atualização.

Consultas de log de diagnóstico para operações do painel de controle

Veja a seguir alguns exemplos de como obter logs de diagnóstico para operações do painel de controle:

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"

Consulta para obter o activityId e o autor da chamada que iniciou a operação de exclusão do contêiner:

(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

Consulta para obter atualizações de índice ou ttl. Em seguida, você pode comparar a saída dessa consulta com uma atualização anterior para ver a alteração no índice ou ttl.

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

Saída:

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

Próximas etapas