Coletar registros do Azure WAF
Este documento explica como exportar registros do Azure Web Application Firewall (WAF) 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 de registros iterando por cada registro e mapeando campos específicos para propriedades do UDM. Se a matriz records estiver ausente, o analisador vai processar o registro como um único evento, extraindo e mapeando os campos.
Antes de começar
- Verifique se você tem uma instância do Google SecOps.
- Verifique se você tem um locatário do Azure ativo.
- Verifique se você tem 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.
- Leia 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 chave1 ou chave2.
- Clique em Copiar para a área de transferência para copiar a chave.
- Salve a chave em um local seguro para uso futuro.
- 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 futuro.
Configurar a exportação de registros para os registros do Azure WAF
- Faça login no portal do Azure usando sua conta privilegiada.
- Acesse Regras de firewall de aplicativo da Web (WAF) e selecione um WAF para monitorar.
- Selecione Monitoramento > Configurações de diagnóstico.
- Clique em + Adicionar configuração de diagnóstico.
- Digite um nome descritivo para a configuração de diagnóstico.
- Selecione allLogs.
- Selecione 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 um feed no Google SecOps para processar os registros do Azure WAF
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed. Por exemplo, Logs do Azure WAF.
- Selecione Microsoft Azure Blob Storage como o Tipo de origem.
- Selecione Azure WAF como o Tipo de registro.
- Clique em Próxima.
Especifique valores para os seguintes parâmetros de entrada:
- 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:
- URI é um: selecione o TIPO DE URI de acordo com a configuração do fluxo de registros (Arquivo único | Diretório | Diretório que inclui subdiretórios).
Opções de exclusão da origem: selecione a opção de exclusão de acordo com sua preferência.
Chave compartilhada: a chave de acesso ao Armazenamento de blobs do Azure.
Namespace de recursos: o namespace de recursos.
Rótulos de ingestão: o rótulo a ser aplicado aos eventos desse feed.
- URI do Azure: o URL do endpoint do blob.
Clique em Próxima.
Revise a configuração do novo feed na tela Finalizar e clique em Enviar.
Tabela de mapeamento do UDM
Campo de registro | Mapeamento do UDM | Lógica |
---|---|---|
backendPoolName |
additional.fields[?key=='backendPoolName'].value.string_value |
O valor é retirado do campo backendPoolName no registro bruto. |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
O valor é retirado do campo backendSettingName no registro bruto. |
category |
metadata.product_event_type |
O valor é retirado do campo category no registro bruto. |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
O valor é retirado do campo EventEnqueuedUtcTime no registro bruto quando o campo records existe. |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
O valor é retirado do campo EventProcessedUtcTime no registro bruto quando o campo records existe. |
operationName |
additional.fields[?key=='operationName'].value.string_value |
O valor é retirado do campo operationName no registro bruto. |
properties.action |
additional.fields[?key=='action'].value.string_value |
O valor é retirado do campo properties.action no registro bruto quando o campo records existe. |
properties.action |
security_result.action_details |
O valor é retirado 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 é retirado do campo properties.clientIP ou properties.clientIp no registro bruto, priorizando clientIP . |
properties.clientPort |
principal.port |
O valor é retirado do campo properties.clientPort no registro bruto. |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
O valor é retirado 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 é retirado do campo properties.details.data no registro bruto quando o campo records existe. |
properties.details.file |
principal.process.file.full_path |
O valor é retirado 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 é retirado da matriz properties.details.matches no registro bruto. O key no UDM é construído usando o índice (idx ) e o matchVariableName . O value é extraído de matchVariableValue . |
properties.details.message |
metadata.description |
O valor é retirado 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 é retirado do campo properties.details.msg no registro bruto quando o campo records existe. |
properties.httpMethod |
network.http.method |
O valor é retirado do campo properties.httpMethod no registro bruto. |
properties.httpStatus |
network.http.response_code |
O valor é retirado 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 é retirado de properties.originalHost , properties.host ou properties.hostname , priorizando-os nessa ordem. |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
O valor é retirado do campo properties.policyId no registro bruto. |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
O valor é retirado do campo properties.policyMode no registro bruto quando o campo records existe. |
properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
O valor é retirado do campo properties.policy no registro bruto quando o campo records existe. |
properties.receivedBytes |
network.received_bytes |
O valor é retirado do campo properties.receivedBytes no registro bruto. |
properties.requestUri |
target.url |
O valor é retirado do campo properties.requestUri no registro bruto. |
properties.ruleId |
security_result.rule_id |
O valor é retirado do campo properties.ruleId no registro bruto. |
properties.ruleName |
security_result.rule_name |
O valor é retirado do campo properties.ruleName no registro bruto quando o campo records existe. |
properties.ruleName , ruleSetType |
security_result.rule_name |
O valor é retirado do campo properties.ruleName ou, se estiver vazio, do campo ruleSetType no registro bruto quando o campo records não existir. |
properties.ruleSetVersion |
security_result.detection_fields[?key=='ruleSetVersion'].value |
O valor é retirado do campo properties.ruleSetVersion no registro bruto. |
properties.sentBytes |
network.sent_bytes |
O valor é retirado do campo properties.sentBytes no registro bruto. |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
O valor é retirado 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 é retirado do campo properties.sslCipher no registro bruto. |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
O valor é retirado do campo properties.sslClientCertificateIssuerName no registro bruto. |
properties.sslProtocol |
network.tls.version |
O valor é retirado do campo properties.sslProtocol no registro bruto. |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
O valor é retirado 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 é retirado do campo properties.trackingReference no registro bruto quando o campo records existe. |
properties.transactionId |
network.session_id |
O valor é retirado do campo properties.transactionId no registro bruto. |
properties.userAgent |
network.http.user_agent |
O valor é retirado do campo properties.userAgent no registro bruto. |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
O valor é retirado 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 é retirado do campo properties.WAFMode no registro bruto quando o campo records não existe. |
rec.category |
metadata.product_event_type |
O valor é retirado do campo rec.category no registro bruto quando o campo records existe. |
rec.operationName |
additional.fields[?key=='operationName'].value.string_value |
O valor é retirado 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 é retirado 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 é retirado do campo rec.properties.clientPort no registro bruto quando o campo records existe. |
rec.properties.host |
principal.asset.hostname , principal.hostname |
O valor é retirado 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 é retirado do campo rec.properties.policy no registro bruto quando o campo records existe. |
rec.properties.requestUri |
target.url |
O valor é retirado do campo rec.properties.requestUri no registro bruto quando o campo records existe. |
rec.properties.ruleName |
security_result.rule_name |
O valor é retirado 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 é retirado do campo rec.properties.trackingReference no registro bruto quando o campo records existe. |
rec.resourceId |
target.resource.id |
O valor é retirado do campo rec.resourceId no registro bruto quando o campo records existe. |
rec.time |
metadata.event_timestamp |
O valor é retirado do campo rec.time no registro bruto quando o campo records existe. |
resourceId |
target.resource.id |
O valor é retirado do campo resourceId no registro bruto quando o campo records não existe. |
timeStamp |
metadata.event_timestamp |
O valor é retirado do campo timeStamp no registro bruto quando o campo records não existe. |
N/A | metadata.event_type |
O valor será 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 um principal estiver presente, mas o IP de destino estiver ausente. Caso contrário, o padrão será GENERIC_EVENT ou o valor do campo event_type . |
N/A | metadata.log_type |
O valor é fixado em AZURE_WAF . |
N/A | metadata.product_name |
O valor é fixado em Azure WAF Logs . |
N/A | metadata.vendor_name |
O valor é fixado em Microsoft . |
N/A | security_result.action |
O valor será definido como ALLOW se properties.action for Matched e BLOCK se properties.action for Block . |
Alterações
2024-04-07
Melhoria:
rec.properties.clientIp
foi mapeado paraprincipal.ip
.- Definir
rec_properties_trackingReference
,rec_properties_host
,rec_properties_policyMode
,rec_properties_ruleName
,rec_properties_policy
,rec_properties_details_msg
,rec_properties_clientIP
erec_time
nos dados de estado.
2023-07-14
Melhoria:
- Um loop
for
foi adicionado para processar registros JSON.
2023-02-28
Melhoria:
properties.ruleName
foi mapeado parasecurity_result.rule_name
.properties.action
foi mapeado parasecurity_result.action
.- Adição da verificação on_error para
properties.clientPort
,properties.httpStatus
,properties.receivedBytes
,properties.sentBytes
,properties.clientResponseTime
,properties.timeTaken
.
2022-10-22
- Parser recém-criado
Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.