Coletar registros de recursos do Microsoft Azure
Este documento explica como coletar registros de recursos do Microsoft Azure configurando um feed do Google Security Operations usando o Microsoft Azure Blob Storage V2.
Os registros de recursos do Azure oferecem insights sobre as operações realizadas nos recursos do Azure. Esses registros capturam informações detalhadas sobre operações, status e métricas de desempenho de recursos. O conteúdo varia de acordo com o tipo de recurso e inclui dados como eventos de autenticação, mudanças de configuração, tentativas de acesso e métricas operacionais.
Antes de começar
Verifique se você atende os seguintes pré-requisitos:
- Uma instância do Google SecOps
Acesso privilegiado ao portal do Microsoft Azure com permissões para:
- Criar contas de armazenamento
- Configurar as configurações de diagnóstico para recursos do Azure
- Gerenciar chaves de acesso
Configurar a conta de armazenamento do Azure
Criar conta de armazenamento
- No portal do Azure, pesquise Contas de armazenamento.
- Clique em Criar.
Informe os seguintes detalhes de configuração:
Configuração Valor Assinatura Selecione sua assinatura do Azure Grupo de recursos Selecionar ou criar Nome da conta de armazenamento Insira um nome exclusivo (por exemplo, azureresourcelogs).Região Selecione a região (por exemplo, East US).Desempenho Padrão (recomendado) Redundância GRS (armazenamento com redundância geográfica) ou LRS (armazenamento com redundância local) Clique em Revisar + criar.
Revise a visão geral da conta e clique em Criar.
Aguarde até que a implantação seja concluída.
Receber credenciais da conta de armazenamento
- Acesse a Conta de armazenamento que você acabou de criar.
- Na navegação à esquerda, selecione Chaves de acesso em Segurança e rede.
- Clique em Mostrar chaves.
Copie e salve o seguinte para uso posterior:
- Nome da conta de armazenamento:
azureresourcelogs - Chave 1 ou Chave 2: a chave de acesso compartilhado (uma string aleatória de 512 bits na codificação base-64).
- Nome da conta de armazenamento:
Receber endpoint do serviço de blob
- Na mesma conta de armazenamento, selecione Endpoints na navegação à esquerda.
- Copie e salve o URL do endpoint do serviço de blob.
- Exemplo:
https://azureresourcelogs.blob.core.windows.net/
- Exemplo:
Configurar as configurações de diagnóstico de recursos do Azure
Os registros de recursos do Azure não são coletados por padrão. É necessário criar uma configuração de diagnóstico para cada recurso do Azure e rotear os registros para a conta de armazenamento.
- No portal do Azure, navegue até o recurso do Azure que você quer monitorar.
- Na navegação à esquerda, selecione Configurações de diagnóstico em Monitoring.
- Clique em + Adicionar configuração de diagnóstico.
- Informe os seguintes detalhes de configuração:
- Nome da configuração de diagnóstico: insira um nome descritivo (por exemplo,
export-to-secops). - Na seção Registros, selecione as categorias de registros que você quer coletar. As categorias disponíveis variam de acordo com o tipo de recurso. Estas são algumas das categorias comuns:
- Administrativo (para registros de atividades)
- Segurança (para registros de atividades)
- AuditEvent (para o Key Vault)
- ApplicationGatewayAccessLog (para o Gateway de aplicativo)
- ApplicationGatewayFirewallLog (para o Gateway de aplicativo)
- NetworkSecurityGroupEvent (para grupos de segurança de rede)
- Na seção Métricas (opcional), selecione AllMetrics para enviar métricas da plataforma à conta de armazenamento.
- Na seção Detalhes do destino, marque a caixa de seleção Arquivar em uma conta de armazenamento.
- Assinatura: selecione a assinatura que contém sua conta de armazenamento.
- Conta de armazenamento: selecione a conta de armazenamento que você criou (por exemplo,
azureresourcelogs).
- Nome da configuração de diagnóstico: insira um nome descritivo (por exemplo,
- Clique em Salvar.
Depois da configuração, os registros são exportados automaticamente para contêineres na conta de armazenamento. O Azure cria contêineres usando o padrão de nomenclatura insights-logs-<log-category-name>. Exemplo:
- Registros de auditoria do Key Vault:
insights-logs-auditevent - Registros de acesso do Application Gateway:
insights-logs-applicationgatewayaccesslog - Registros do firewall do Gateway de aplicativo:
insights-logs-applicationgatewayfirewalllog Eventos do grupo de segurança de rede:
insights-logs-networksecuritygroupevent
Configurar um feed no Google SecOps para ingerir registros de recursos do Azure
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo,
Azure Resource Logs - Key Vault). - Selecione Microsoft Azure Blob Storage V2 como o Tipo de origem.
- Selecione Recurso do Microsoft Azure como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- URI do Azure: insira o URL do endpoint do serviço de blobs com o caminho do contêiner:
https://azureresourcelogs.blob.core.windows.net/insights-logs-auditevent/- Substitua:
azureresourcelogs: o nome da sua conta de armazenamento do Azure.insights-logs-auditevent: o nome do contêiner de blob em que os registros são armazenados (varia de acordo com o tipo de recurso e a categoria de registro).
Opção de exclusão da fonte: selecione a opção de exclusão de acordo com sua preferência:
- Nunca: nunca exclui arquivos após as transferências.
- Excluir arquivos transferidos: exclui os arquivos após a transferência bem-sucedida.
- Excluir arquivos transferidos e diretórios vazios: exclui arquivos e diretórios vazios após a transferência bem-sucedida.
Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
Chave compartilhada: insira o valor da chave compartilhada (chave de acesso) que você capturou da conta de armazenamento na etapa 3.
Namespace do recurso: o namespace do recurso.
Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Configurar o firewall do Azure Storage (se ativado)
Se a sua conta de armazenamento do Azure usar um firewall, adicione os intervalos de IP do Google SecOps.
- No portal do Azure, acesse sua conta de armazenamento (por exemplo,
azureresourcelogs). - Selecione Rede em Segurança e rede.
- Em Firewalls e redes virtuais, selecione Ativado nas redes virtuais e endereços IP selecionados.
- Na seção Firewall, em Intervalo de endereços, clique em + Adicionar intervalo de IP.
Adicione cada intervalo de IP do Google SecOps na notação CIDR.
- Para receber os intervalos de IP atuais, escolha uma das seguintes opções:
- Consulte a documentação sobre a lista de permissões de IP
- Recupere-os de maneira programática usando a API Feed Management.
- Para receber os intervalos de IP atuais, escolha uma das seguintes opções:
Clique em Salvar.
Tabela de mapeamento do UDM
| Campo de registro | Mapeamento do UDM | Lógica |
|---|---|---|
| vários campos additionalfield*_label | additional.fields | Mesclado de vários campos adicionais field*_label |
| authenticationMethod | extensions.auth.mechanism | Definido como USERNAME_PASSWORD se authenticationMethod for Password |
| category, event_type | extensions.auth.type | Definido como MACHINE para SQLSecurityAuditEvents, SSO para categorias específicas e AUTHTYPE_UNSPECIFIED para outras. |
| properties.partialipaddress | intermediary.ip | Valor de "properties.partialipaddress" se não estiver vazio |
| properties.event_time, stage_time, risk_time, last_update_time, time | metadata.collected_timestamp | Convertido usando ISO8601 de properties.event_time, stage_time, risk_time, last_update_time ou time com fallback grok |
| properties.message, properties.activity, properties.log.stage | metadata.description | Valor de "properties.message" se não estiver vazio; caso contrário, de "properties.activity"; caso contrário, de "properties.log.stage". |
| event_type | metadata.event_type | Valor de event_type se não estiver vazio. Caso contrário, GENERIC_EVENT. |
| category, record.category | metadata.product_event_type | Valor copiado diretamente da categoria ou de record.category |
| properties.event_id, properties.log.auditID | metadata.product_log_id | Valor de "properties.event_id" se não estiver vazio. Caso contrário, de "properties.log.auditID". |
| properties.log.apiVersion | metadata.product_version | Valor copiado diretamente de "properties.log.apiVersion". |
| protocolo | network.application_protocol | Valor copiado diretamente do protocolo |
| properties.log.verb | network.dhcp.opcode | Valor copiado diretamente de properties.log.verb (maiúsculas) |
| properties.CsMethod, record.properties.CsMethod | network.http.method | Valor copiado diretamente de "properties.CsMethod" ou "record.properties.CsMethod" |
| user_agent | network.http.parsed_user_agent | Convertido de user_agent |
| properties.Referer, uri | network.http.referral_url | Valor de "properties.Referer" se não estiver vazio; caso contrário, de "uri". |
| properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode, responseStatus.code | network.http.response_code | Convertido para número inteiro de properties.ScStatus, record.properties.ScStatus, properties.statusCode, record.properties.statusCode ou responseStatus.code |
| user_agent | network.http.user_agent | Valor copiado diretamente de user_agent |
| properties.ScBytes, record.properties.ScBytes, properties.responseLength | network.received_bytes | Convertido para uinteger de properties.ScBytes, record.properties.ScBytes ou properties.responseLength |
| properties.CsBytes, record.properties.CsBytes, properties.requestLength | network.sent_bytes | Convertido para uinteger de properties.CsBytes, record.properties.CsBytes ou properties.requestLength |
| properties.session_id | network.session_id | Valor copiado diretamente de "properties.session_id" (convertido em string) |
| properties.tlsVersion | network.tls.version | Valor copiado diretamente de "properties.tlsVersion" |
| domain_name_value | principal.administrative_domain | Valor copiado diretamente de domain_name_value |
| properties.clientAppUsed, target_application | principal.application | Valor de "properties.clientAppUsed" se não estiver vazio. Caso contrário, de "target_application". |
| prop_device_id | principal.asset.asset_id | Definido como "ID do dispositivo: seguido por prop_device_id" se não for nulo |
| hardware | principal.asset.hardware | Unido do hardware |
| properties.host_name, properties.CIp, record.properties.CIp, properties.ComputerName, record.properties.ComputerName, properties.CsHost, record.properties.CsHost, properties.server_instance_name, record.properties.server_instance_name, server_name | principal.asset.hostname | Valor de "properties.host_name" se não estiver vazio. Caso contrário, de "properties.CIp" (grok IP), "record.properties.CIp" (grok IP), "properties.ComputerName", "record.properties.ComputerName", "properties.CsHost", "record.properties.CsHost", "properties.server_instance_name", "record.properties.server_instance_name" ou "server_name". |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.asset.ip | Valor de src_ip, src_ip1, properties.client_ip (IP grok), record.properties.clientIpAddress, properties.clientIpAddress (IP grok), record.properties.clientIpAddress, callerIpAddress (IP grok), properties.ipAddress ou ip |
| properties.host_name, properties.CsHost, record.properties.CsHost | principal.hostname | Valor de "properties.host_name" se não estiver vazio. Caso contrário, de "properties.CsHost" ou "record.properties.CsHost". |
| src_ip, src_ip1, properties.client_ip, record.properties.clientIpAddress, properties.clientIpAddress, callerIpAddress, properties.ipAddress, ip | principal.ip | Valor de src_ip, src_ip1, properties.client_ip (IP grok), record.properties.clientIpAddress, properties.clientIpAddress (IP grok), record.properties.clientIpAddress, callerIpAddress (IP grok), properties.ipAddress ou ip |
| properties.location.city, provisioning_steps_city | principal.location.city | Valor de "properties.location.city" se não estiver vazio; caso contrário, de "provisioning_steps_city" |
| properties.location.countryOrRegion, provisioning_steps_country, location, Region | principal.location.country_or_region | Valor de "properties.location.countryOrRegion" se não estiver vazio. Caso contrário, de "provisioning_steps_country", "location", ou "Region". |
| properties.location.geoCoordinates.latitude | principal.location.region_latitude | Valor copiado diretamente de "properties.location.geoCoordinates.latitude" |
| properties.location.geoCoordinates.longitude | principal.location.region_longitude | Valor copiado diretamente de "properties.location.geoCoordinates.longitude" |
| properties.location.state | principal.location.state | Valor copiado diretamente de "properties.location.state" |
| prop_os | principal.platform | Definido como WINDOWS se prop_os corresponder a (?i)Win; LINUX se (?i)Lin; MAC se (?i)Mac |
| properties.deviceDetail.operatingSystem | principal.platform_version | Valor copiado diretamente de "properties.deviceDetail.operatingSystem" |
| src_port | principal.port | Convertido para número inteiro de src_port |
| is_compliant_label, is_managed_label, serice_type_label, serice_credential_label | principal.resource.attribute.labels | Mesclado de is_compliant_label, is_managed_label, serice_type_label, serice_credential_label |
| properties.sourceSystem.Name | principal.resource.name | Valor copiado diretamente de "properties.sourceSystem.Name" |
| properties.sourceSystem.Id | principal.resource.product_object_id | Valor copiado diretamente de "properties.sourceSystem.Id" |
| properties.server_principal_name, source_user_principal_name, user_principal_name, local_account_username_value | principal.user.email_addresses | Unido de "properties.server_principal_name" (se corresponder ao e-mail), "source_user_principal_name" (se corresponder ao e-mail), "user_principal_name" (se corresponder ao e-mail) ou "local_account_username_value" (se corresponder ao e-mail) |
| properties.sequence_group_id, grpname, properties.log.user.groups | principal.user.group_identifiers | Unido de "properties.sequence_group_id", "grpname" ou "properties.log.user.groups" |
| properties.sourceIdentity.details.id, properties.userId, details_id_not_present | principal.user.product_object_id | Valor de properties.sourceIdentity.details.id se não estiver vazio. Caso contrário, de properties.userId. Caso contrário, de details_id_not_present. |
| properties.ServicePrincipalDisplayName, properties.servicePrincipalName, properties.sourceIdentity.details.DisplayName, properties.userDisplayName, record.properties.log.user.username | principal.user.user_display_name | Valor de properties.ServicePrincipalDisplayName se não estiver vazio; caso contrário, de properties.servicePrincipalName; caso contrário, de properties.sourceIdentity.details.DisplayName; caso contrário, de properties.userDisplayName; caso contrário, de record.properties.log.user.username |
| properties.servicePrincipalId, user_userPrincipalName, source_user_principal_name, details_user_principal_name, user_principal_name, properties.accountName, record.properties.log.user.uid | principal.user.userid | Valor de properties.servicePrincipalId se não estiver vazio; caso contrário, de user_userPrincipalName; caso contrário, de source_user_principal_name; caso contrário, de details_user_principal_name; caso contrário, de user_principal_name; caso contrário, de properties.accountName; caso contrário, de record.properties.log.user.uid |
| security_action, succeeded, statusText, resultType | security_result.action | Definido como ALLOW se security_action for allow; caso contrário, ALLOW se succeeded for true ou statusText for Success ou resultType for success; caso contrário, BLOCK se succeeded for false ou statusText for failed ou resultType for failed |
| properties.action_name | security_result.action_details | Valor copiado diretamente de "properties.action_name" |
| status_label | security_result.about.resource.attribute.labels | Mesclado de status_label |
| properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields | security_result.detection_fields | Mesclado de properties_log_label, corr_key_label, resultType_label, resultSignature_label, networkName_label, networkType_label, method_label, authentication_step_requirement_label, authentication_step_result_detail_label, stepdate_label, initiatedby_name_label, initiatedby_id_label, initiatedby_type_label, targetSystem_id_label, targetSystem_name_label, containerID_label, pod_label, authentication_label, api_name_label, scale_unit_label, namespace_name_label, subscription_id_label, activity_id_label_1, task_name_label, environment_label, cookie, additional_field_event_ip, additional_field_event_primary_stamp, additional_field_event_stamp_type, source, correlationId_field, activityDateTime_field, detectedDateTime_field, lastUpdatedDateTime_field, count_label, total_label, minimum_label, maximum_label, average_label, metricName_label, timeGrain_label, ApiName_label, Authentication_label, GeoType_label, old_label, new_label, add_label, keyId_label, sr_result.rule_name, sr_result.rule_id, resultField, sr_result.detection_fields |
| resultDescription, sec_result.description, properties.queryexecutionstatus | security_result.description | Valor de resultDescription (gsub newlines); caso contrário, de sec_result.description; caso contrário, de properties.queryexecutionstatus |
| policy_id_value | security_result.rule_id | Valor copiado diretamente de policy_id_value |
| properties.Result, statusText, properties.queryexecutionstatus | security_result.summary | Valor de "properties.Result" se não estiver vazio. Caso contrário, de "statusText". Caso contrário, de "properties.queryexecutionstatus". |
| target_application | target.application | Valor de target_application |
| properties.ComputerName, record.properties.ComputerName, properties.server_instance_name, record.properties.server_instance_name | target.asset.hostname | Valor de properties.ComputerName, record.properties.ComputerName, properties.server_instance_name ou record.properties.server_instance_name |
| (fixado no código) | target.cloud.environment | Defina como "MICROSOFT_AZURE". |
| properties.SPort, record.properties.SPort | target.port | Convertido para número inteiro de properties.SPort ou record.properties.SPort |
| properties.querytext.query | target.process.command_line | Valor copiado diretamente de "properties.querytext.query" |
| properties.processId | target.process.pid | Convertido para string de properties.processId |
| subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label | target.resource.attribute.labels | Mesclado de subscription_id_label, resource_group_label, request_resource_type_label, request_resource_id_label, additional_objectKey, additional_clientRequestId, additional_RiskEventType, additional_tokenIssuerType, keyId_label, appid_label |
| properties_databasename, properties.resourceDisplayName, record.properties.databasename, record.properties.databaseName | target.resource.name | Valor de "properties_databasename" se não estiver vazio; caso contrário, de "properties.resourceDisplayName"; caso contrário, de "record.properties.databasename"; caso contrário, de "record.properties.databaseName" |
| resourceId, properties.resourceId | target.resource.product_object_id | Valor de resourceId se não estiver vazio; caso contrário, de properties.resourceId |
| properties_collectionname, properties.resourceDisplayName, record.properties.collectionname, record.properties.collectionName, properties.log.objectRef.resource | target.resource.resource_subtype | Valor de properties_collectionname se não estiver vazio; caso contrário, de properties.resourceDisplayName; caso contrário, de record.properties.collectionname; caso contrário, de record.properties.collectionName; caso contrário, de properties.log.objectRef.resource |
| resourceId, message | target.resource.resource_type | Definido como DATABASE se resourceId corresponder ao padrão; caso contrário, CLUSTER se a mensagem corresponder a MANAGEDCLUSTERS; caso contrário, VIRTUAL_MACHINE se MANAGEDINSTANCES; caso contrário, DATABASE se DATABASEACCOUNTS |
| resourceType | target.resource.type | Valor copiado diretamente de "resourceType" |
| properties.CsUriStem, properties.log.requestURI, value (from additionalInfo) | target.url | Valor de properties.CsUriStem se não estiver vazio. Caso contrário, de properties.log.requestURI. Caso contrário, de value (de additionalInfo). |
| user_principal_name | target.user.email_addresses | Unido de user_principal_name (se corresponder ao e-mail) |
| properties.userId | target.user.product_object_id | Valor copiado diretamente de "properties.userId". |
| properties.userDisplayName | target.user.user_display_name | Valor copiado diretamente de properties.userDisplayName |
| user_principal_name, properties.userPrincipalName | target.user.userid | Valor de user_principal_name se não estiver vazio; caso contrário, de properties.userPrincipalName |
| (fixado no código) | metadata.product_name | Definido como "Logs de recursos do Azure" |
| (fixado no código) | metadata.vendor_name | Defina como "Microsoft". |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.