Coletar registros do WAF do Azure
Este documento explica como exportar registros do firewall de aplicativos da Web (WAF) do Azure para o Google Security Operations usando uma conta de armazenamento do Azure. O analisador processa registros no formato JSON, transformando-os em UDM. Ele processa registros que contêm uma matriz records iterando por cada registro e mapeando campos específicos para propriedades da UDM. Se a matriz records estiver ausente, o analisador vai processar o registro como um único evento, extraindo e mapeando os campos de acordo com a situação.
Antes de começar
Verifique se você atende aos seguintes pré-requisitos:
- Instância do Google SecOps
- Um locatário ativo do Azure
- Acesso privilegiado ao Azure
Configurar a conta de armazenamento do Azure
- No console do Azure, pesquise Contas de armazenamento.
- Clique em Criar.
- Especifique valores para os seguintes parâmetros de entrada:
- Assinatura: selecione a assinatura.
- Grupo de recursos: selecione o grupo de recursos.
- Região: selecione a região.
- Performance: selecione a performance (padrão recomendado).
- Redundância: selecione a redundância (GRS ou LRS recomendado).
- Nome da conta de armazenamento: insira um nome para a nova conta de armazenamento.
- Clique em Revisar + criar.
- Revise a visão geral da conta e clique em Criar.
- Na página Visão geral da conta de armazenamento, selecione o submenu Chaves de acesso em Segurança e rede.
- Clique em Mostrar ao lado de key1 ou key2.
- Clique em Copiar para a área de transferência para copiar a chave.
- Salve a chave em um local seguro para uso posterior.
- Na página Visão geral da conta de armazenamento, selecione o submenu Endpoints em Configurações.
- Clique em Copiar para a área de transferência para copiar o URL do endpoint do serviço de blob. Por exemplo,
https://<storageaccountname>.blob.core.windows.net
. - Salve o URL do endpoint em um local seguro para uso posterior.
Como configurar a exportação de registros do WAF do Azure
- Faça login no portal do Azure usando sua conta privilegiada.
- Acesse Regras de firewall de aplicativos da Web (WAF) e selecione um WAF para monitorar.
- Selecione Monitoring > Configurações de diagnóstico.
- Clique em + Adicionar configuração de diagnóstico.
- Insira um nome descritivo para a configuração de diagnóstico.
- Selecione allLogs.
- Marque a caixa de seleção Arquivar em uma conta de armazenamento como destino.
- Especifique a Assinatura e a Conta de armazenamento.
- Clique em Salvar.
Configurar feeds
Há dois pontos de entrada diferentes para configurar feeds na plataforma do Google SecOps:
- Configurações do SIEM > Feeds > Adicionar novo
- Central de conteúdo > Pacotes de conteúdo > Começar
Como configurar o feed do WAF do Azure
- Clique no pacote Plataforma do Azure.
- Localize o tipo de registro WAF do Azure e clique em Adicionar novo feed.
Especifique valores para os seguintes campos:
- Tipo de origem: Armazenamento de blobs do Microsoft Azure V2.
- URI do Azure: o URL do endpoint do blob.
ENDPOINT_URL/BLOB_NAME
- Substitua:
ENDPOINT_URL
: o URL do endpoint do blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: o nome do blob (por exemplo,<logname>-logs
)
- Substitua:
- Opções de exclusão de origem: selecione a opção de exclusão de acordo com suas preferências de ingestão.
Observação: se você selecionar a opção
Delete transferred files
ouDelete transferred files and empty directories
, verifique se concedeu as permissões adequadas à conta de serviço. - Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
Chave compartilhada: a chave de acesso ao Azure Blob Storage. Opções avançadas
Nome do feed: um valor pré-preenchido que identifica o feed.
Namespace do recurso: namespace associado ao feed.
Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.
Clique em Criar feed.
Para mais informações sobre como configurar vários feeds para diferentes tipos de registros nessa família de produtos, consulte Configurar feeds por produto.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
backendPoolName |
additional.fields[?key=='backendPoolName'].value.string_value |
O valor é extraído do campo backendPoolName no registro bruto. |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
O valor é extraído do campo backendSettingName no registro bruto. |
category |
metadata.product_event_type |
O valor é extraído do campo category no registro bruto. |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
O valor é extraído do campo EventEnqueuedUtcTime no registro bruto quando o campo records existe. |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
O valor é extraído do campo EventProcessedUtcTime no registro bruto quando o campo records existe. |
operationName |
additional.fields[?key=='operationName'].value.string_value |
O valor é extraído do campo operationName no registro bruto. |
properties.action |
additional.fields[?key=='action'].value.string_value |
O valor é extraído do campo properties.action no registro bruto quando o campo records existe. |
properties.action |
security_result.action_details |
O valor é extraído do campo properties.action no registro bruto quando o campo records não existe. |
properties.clientIP , properties.clientIp |
principal.asset.ip , principal.ip |
O valor é extraído do campo properties.clientIP ou properties.clientIp no registro bruto, priorizando clientIP . |
properties.clientPort |
principal.port |
O valor é extraído do campo properties.clientPort no registro bruto. |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
O valor é extraído do campo properties.clientResponseTime no registro bruto quando o campo records não existe. |
properties.details.data |
additional.fields[?key=='Properties data'].value.string_value |
O valor é extraído do campo properties.details.data no registro bruto quando o campo records existe. |
properties.details.file |
principal.process.file.full_path |
O valor é extraído do campo properties.details.file no registro bruto quando o campo records não existe. |
properties.details.matches[].matchVariableName , properties.details.matches[].matchVariableValue |
additional.fields[?key.startsWith('%{idx} ')].value.string_value |
O valor é extraído da matriz properties.details.matches no registro bruto. O key na UDM é construído usando o índice (idx ) e matchVariableName . O value é extraído de matchVariableValue . |
properties.details.message |
metadata.description |
O valor é extraído do campo properties.details.message no registro bruto após a remoção de barras invertidas e aspas. |
properties.details.msg |
metadata.description |
O valor é extraído do campo properties.details.msg no registro bruto quando o campo records existe. |
properties.httpMethod |
network.http.method |
O valor é extraído do campo properties.httpMethod no registro bruto. |
properties.httpStatus |
network.http.response_code |
O valor é extraído do campo properties.httpStatus no registro bruto. |
properties.httpVersion |
network.application_protocol |
Se o campo properties.httpVersion contiver HTTP , o valor HTTP será atribuído. |
properties.host , properties.hostname , properties.originalHost |
principal.asset.hostname , principal.hostname |
O valor é extraído de properties.originalHost , properties.host ou properties.hostname , priorizando-os nessa ordem. |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
O valor é extraído do campo properties.policyId no registro bruto. |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
O valor é extraído do campo properties.policyMode no registro bruto quando o campo records existe. |
properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
O valor é extraído do campo properties.policy no registro bruto quando o campo records existe. |
properties.receivedBytes |
network.received_bytes |
O valor é extraído do campo properties.receivedBytes no registro bruto. |
properties.requestUri |
target.url |
O valor é extraído do campo properties.requestUri no registro bruto. |
properties.ruleId |
security_result.rule_id |
O valor é extraído do campo properties.ruleId no registro bruto. |
properties.ruleName |
security_result.rule_name |
O valor é extraído do campo properties.ruleName no registro bruto quando o campo records existe. |
properties.ruleName , ruleSetType |
security_result.rule_name |
O valor é extraído do campo properties.ruleName ou, se estiver vazio, do campo ruleSetType no registro bruto quando o campo records não existe. |
properties.ruleSetVersion |
security_result.detection_fields[?key=='ruleSetVersion'].value |
O valor é extraído do campo properties.ruleSetVersion no registro bruto. |
properties.sentBytes |
network.sent_bytes |
O valor é extraído do campo properties.sentBytes no registro bruto. |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
O valor é extraído do campo properties.serverResponseLatency no registro bruto quando o campo records não existe. |
properties.serverRouted |
target.asset.ip , target.ip , target.port |
O IP e a porta são extraídos do campo properties.serverRouted . |
properties.sslCipher |
network.tls.cipher |
O valor é extraído do campo properties.sslCipher no registro bruto. |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
O valor é extraído do campo properties.sslClientCertificateIssuerName no registro bruto. |
properties.sslProtocol |
network.tls.version |
O valor é extraído do campo properties.sslProtocol no registro bruto. |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
O valor é extraído do campo properties.timeTaken no registro bruto quando o campo records não existe. |
properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
O valor é extraído do campo properties.trackingReference no registro bruto quando o campo records existe. |
properties.transactionId |
network.session_id |
O valor é extraído do campo properties.transactionId no registro bruto. |
properties.userAgent |
network.http.user_agent |
O valor é extraído do campo properties.userAgent no registro bruto. |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
O valor é extraído do campo properties.WAFEvaluationTime no registro bruto quando o campo records não existe. |
properties.WAFMode |
additional.fields[?key=='Properties WAFMode'].value.string_value |
O valor é extraído do campo properties.WAFMode no registro bruto quando o campo records não existe. |
rec.category |
metadata.product_event_type |
O valor é extraído do campo rec.category no registro bruto quando o campo records existe. |
rec.operationName |
additional.fields[?key=='operationName'].value.string_value |
O valor é extraído do campo rec.operationName no registro bruto quando o campo records existe. |
rec.properties.clientIP , rec.properties.clientIp |
principal.asset.ip , principal.ip |
O valor é extraído do campo rec.properties.clientIP ou rec.properties.clientIp no registro bruto, priorizando clientIP quando o campo records existe. |
rec.properties.clientPort |
principal.port |
O valor é extraído do campo rec.properties.clientPort no registro bruto quando o campo records existe. |
rec.properties.host |
principal.asset.hostname , principal.hostname |
O valor é extraído do campo rec.properties.host no registro bruto quando o campo records existe. |
rec.properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
O valor é extraído do campo rec.properties.policy no registro bruto quando o campo records existe. |
rec.properties.requestUri |
target.url |
O valor é extraído do campo rec.properties.requestUri no registro bruto quando o campo records existe. |
rec.properties.ruleName |
security_result.rule_name |
O valor é extraído do campo rec.properties.ruleName no registro bruto quando o campo records existe. |
rec.properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
O valor é extraído do campo rec.properties.trackingReference no registro bruto quando o campo records existe. |
rec.resourceId |
target.resource.id |
O valor é extraído do campo rec.resourceId no registro bruto quando o campo records existe. |
rec.time |
metadata.event_timestamp |
O valor é extraído do campo rec.time no registro bruto quando o campo records existe. |
resourceId |
target.resource.id |
O valor é extraído do campo resourceId no registro bruto quando o campo records não existe. |
timeStamp |
metadata.event_timestamp |
O valor é extraído do campo timeStamp no registro bruto quando o campo records não existe. |
N/A | metadata.event_type |
O valor é definido como NETWORK_CONNECTION se o principal (nome do host ou IP do cliente) e o IP de destino estiverem presentes. Ele é definido como STATUS_UPDATE se uma conta principal estiver presente, mas o IP de destino estiver faltando. Caso contrário, o padrão será GENERIC_EVENT ou o valor do campo event_type . |
N/A | metadata.log_type |
O valor está fixado no código como AZURE_WAF . |
N/A | metadata.product_name |
O valor está fixado no código como Azure WAF Logs . |
N/A | metadata.vendor_name |
O valor está fixado no código como Microsoft . |
N/A | security_result.action |
O valor é definido como ALLOW se properties.action for Matched e BLOCK se properties.action for Block . |
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.