Recolha registos do WAF do Azure
Este documento explica como exportar registos da firewall de aplicações Web (WAF) do Azure para o Google Security Operations através de uma conta de armazenamento do Azure. O analisador processa registos no formato JSON, transformando-os em UDM. Processa registos que contêm uma matriz records iterando através de cada registo e mapeando campos específicos para propriedades da UDM. Se a matriz records estiver ausente, o analisador processa o registo como um único evento, extraindo e mapeando os campos em conformidade.
Antes de começar
Certifique-se de que cumpre os seguintes pré-requisitos:
- Instância do Google SecOps
- Um inquilino do Azure ativo
- Acesso privilegiado ao Azure
Configure a conta de armazenamento do Azure
- Na consola do Azure, pesquise Contas de armazenamento.
- Clique em Criar.
- Especifique valores para os seguintes parâmetros de entrada:
- Subscrição: selecione a subscrição.
- Grupo de recursos: selecione o grupo de recursos.
- Região: selecione a região.
- Desempenho: selecione o desempenho (padrão recomendado).
- Redundância: selecione a redundância (GRS ou LRS recomendado).
- Nome da conta de armazenamento: introduza um nome para a nova conta de armazenamento.
- Clique em Rever + criar.
- Reveja a vista geral da conta e clique em Criar.
- Na página Vista geral da conta de armazenamento, selecione o submenu Chaves de acesso em Segurança + rede.
- Clique em Mostrar junto a key1 ou key2.
- Clique em Copiar para a área de transferência para copiar a chave.
- Guarde a chave num local seguro para utilização posterior.
- Na página Vista geral da conta de armazenamento, selecione o submenu Pontos finais em Definições.
- Clique em Copiar para a área de transferência para copiar o URL do ponto final do serviço Blob; por exemplo,
https://<storageaccountname>.blob.core.windows.net
. - Guarde o URL do ponto final numa localização segura para utilização posterior.
Como configurar a exportação de registos para registos do WAF do Azure
- Inicie sessão no Portal do Azure com a sua conta privilegiada.
- Aceda a Regras do firewall de app Web (WAF) e selecione um WAF para monitorizar.
- Selecione Monitorização > Definições de diagnóstico.
- Clique em + Adicionar definição de diagnóstico.
- Introduza um nome descritivo para a definição de diagnóstico.
- Selecione allLogs.
- Selecione a caixa de verificação Arquivar numa conta de armazenamento como destino.
- Especifique a Subscrição e a Conta de armazenamento.
- Clique em Guardar.
Configure feeds
Existem dois pontos de entrada diferentes para configurar feeds na plataforma Google SecOps:
- Definições do SIEM > Feeds > Adicionar novo
- Content Hub > Pacotes de conteúdo > Começar
Como configurar o feed do WAF do Azure
- Clique no pacote Plataforma Azure.
- Localize o tipo de registo Azure WAF e clique em Adicionar novo feed.
Especifique valores para os seguintes campos:
- Source Type: Microsoft Azure Blob Storage V2.
- URI do Azure: o URL do ponto final do blob.
ENDPOINT_URL/BLOB_NAME
- Substitua o seguinte:
ENDPOINT_URL
: o URL do ponto final do blob (https://<storageaccountname>.blob.core.windows.net
)BLOB_NAME
: o nome do blob (por exemplo,<logname>-logs
)
- Substitua o seguinte:
- Opções de eliminação de origens: selecione a opção de eliminação de acordo com as suas preferências de carregamento.
Nota: se selecionar a opção
Delete transferred files
ouDelete transferred files and empty directories
, certifique-se de que concedeu as autorizações adequadas à conta de serviço. - Idade máxima do ficheiro: inclui ficheiros modificados no último número de dias. A predefinição é 180 dias.
Chave partilhada: a chave de acesso ao armazenamento de blobs do Azure. Opções avançadas
Nome do feed: um valor pré-preenchido que identifica o feed.
Espaço de nomes do recurso: espaço de nomes associado ao feed.
Etiquetas de carregamento: etiquetas aplicadas a todos os eventos deste feed.
Clique em Criar feed.
Para mais informações sobre a configuração de vários feeds para diferentes tipos de registos nesta família de produtos, consulte o artigo Configure feeds por produto.
Tabela de mapeamento da UDM
Campo de registo | Mapeamento de UDM | Lógica |
---|---|---|
backendPoolName |
additional.fields[?key=='backendPoolName'].value.string_value |
O valor é retirado do campo backendPoolName no registo não processado. |
backendSettingName |
additional.fields[?key=='backendSettingName'].value.string_value |
O valor é retirado do campo backendSettingName no registo não processado. |
category |
metadata.product_event_type |
O valor é retirado do campo category no registo não processado. |
EventEnqueuedUtcTime |
additional.fields[?key=='EventEnqueuedUtcTime'].value.string_value |
O valor é retirado do campo EventEnqueuedUtcTime no registo não processado quando o campo records existe. |
EventProcessedUtcTime |
additional.fields[?key=='EventProcessedUtcTime'].value.string_value |
O valor é retirado do campo EventProcessedUtcTime no registo não processado quando o campo records existe. |
operationName |
additional.fields[?key=='operationName'].value.string_value |
O valor é retirado do campo operationName no registo não processado. |
properties.action |
additional.fields[?key=='action'].value.string_value |
O valor é retirado do campo properties.action no registo não processado quando o campo records existe. |
properties.action |
security_result.action_details |
O valor é retirado do campo properties.action no registo não processado 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 registo não processado, dando prioridade a clientIP . |
properties.clientPort |
principal.port |
O valor é retirado do campo properties.clientPort no registo não processado. |
properties.clientResponseTime |
principal.resource.attribute.labels[?key=='Client Response Time'].value |
O valor é retirado do campo properties.clientResponseTime no registo não processado 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 registo não processado quando o campo records existe. |
properties.details.file |
principal.process.file.full_path |
O valor é retirado do campo properties.details.file no registo não processado 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 registo não processado. O key no UDM é construído com o índice (idx ) e matchVariableName . O valor de value é retirado de matchVariableValue . |
properties.details.message |
metadata.description |
O valor é retirado do campo properties.details.message no registo não processado após a remoção das barras invertidas e das aspas. |
properties.details.msg |
metadata.description |
O valor é retirado do campo properties.details.msg no registo não processado quando o campo records existe. |
properties.httpMethod |
network.http.method |
O valor é retirado do campo properties.httpMethod no registo não processado. |
properties.httpStatus |
network.http.response_code |
O valor é retirado do campo properties.httpStatus no registo não processado. |
properties.httpVersion |
network.application_protocol |
Se o campo properties.httpVersion contiver HTTP , é atribuído o valor HTTP . |
properties.host , properties.hostname , properties.originalHost |
principal.asset.hostname , principal.hostname |
O valor é retirado de um dos seguintes elementos: properties.originalHost , properties.host ou properties.hostname , dando-lhes prioridade nessa ordem. |
properties.policyId |
security_result.detection_fields[?key=='policyId'].value |
O valor é retirado do campo properties.policyId no registo não processado. |
properties.policyMode |
security_result.detection_fields[?key=='policyMode'].value |
O valor é retirado do campo properties.policyMode no registo não processado quando o campo records existe. |
properties.policy |
additional.fields[?key=='Properties policy'].value.string_value |
O valor é retirado do campo properties.policy no registo não processado quando o campo records existe. |
properties.receivedBytes |
network.received_bytes |
O valor é retirado do campo properties.receivedBytes no registo não processado. |
properties.requestUri |
target.url |
O valor é retirado do campo properties.requestUri no registo não processado. |
properties.ruleId |
security_result.rule_id |
O valor é retirado do campo properties.ruleId no registo não processado. |
properties.ruleName |
security_result.rule_name |
O valor é retirado do campo properties.ruleName no registo não processado 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 registo não processado quando o campo records não existe. |
properties.ruleSetVersion |
security_result.detection_fields[?key=='ruleSetVersion'].value |
O valor é retirado do campo properties.ruleSetVersion no registo não processado. |
properties.sentBytes |
network.sent_bytes |
O valor é retirado do campo properties.sentBytes no registo não processado. |
properties.serverResponseLatency |
additional.fields[?key=='Server Response Latency'].value.string_value |
O valor é retirado do campo properties.serverResponseLatency no registo não processado 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 registo não processado. |
properties.sslClientCertificateIssuerName |
network.tls.server.certificate.issuer |
O valor é retirado do campo properties.sslClientCertificateIssuerName no registo não processado. |
properties.sslProtocol |
network.tls.version |
O valor é retirado do campo properties.sslProtocol no registo não processado. |
properties.timeTaken |
additional.fields[?key=='Properties Timetaken'].value.string_value |
O valor é retirado do campo properties.timeTaken no registo não processado quando o campo records não existe. |
properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
O valor é retirado do campo properties.trackingReference no registo não processado quando o campo records existe. |
properties.transactionId |
network.session_id |
O valor é retirado do campo properties.transactionId no registo não processado. |
properties.userAgent |
network.http.user_agent |
O valor é retirado do campo properties.userAgent no registo não processado. |
properties.WAFEvaluationTime |
additional.fields[?key=='Properties WAFEvaluationTime'].value.string_value |
O valor é retirado do campo properties.WAFEvaluationTime no registo não processado 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 registo não processado quando o campo records não existe. |
rec.category |
metadata.product_event_type |
O valor é retirado do campo rec.category no registo não processado quando o campo records existe. |
rec.operationName |
additional.fields[?key=='operationName'].value.string_value |
O valor é retirado do campo rec.operationName no registo não processado 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 registo não processado, dando prioridade a clientIP quando o campo records existe. |
rec.properties.clientPort |
principal.port |
O valor é retirado do campo rec.properties.clientPort no registo não processado quando o campo records existe. |
rec.properties.host |
principal.asset.hostname , principal.hostname |
O valor é retirado do campo rec.properties.host no registo não processado 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 registo não processado quando o campo records existe. |
rec.properties.requestUri |
target.url |
O valor é retirado do campo rec.properties.requestUri no registo não processado quando o campo records existe. |
rec.properties.ruleName |
security_result.rule_name |
O valor é retirado do campo rec.properties.ruleName no registo não processado quando o campo records existe. |
rec.properties.trackingReference |
additional.fields[?key=='trackingReference'].value.string_value |
O valor é retirado do campo rec.properties.trackingReference no registo não processado quando o campo records existe. |
rec.resourceId |
target.resource.id |
O valor é retirado do campo rec.resourceId no registo não processado quando o campo records existe. |
rec.time |
metadata.event_timestamp |
O valor é retirado do campo rec.time no registo não processado quando o campo records existe. |
resourceId |
target.resource.id |
O valor é retirado do campo resourceId no registo não processado quando o campo records não existe. |
timeStamp |
metadata.event_timestamp |
O valor é retirado do campo timeStamp no registo não processado quando o campo records não existe. |
N/A | metadata.event_type |
O valor é definido como NETWORK_CONNECTION se o principal (nome de anfitrião ou IP do cliente) e o IP de destino estiverem presentes. É definido como STATUS_UPDATE se estiver presente um principal, mas o IP de destino estiver em falta. Caso contrário, a predefinição é GENERIC_EVENT ou o valor do campo event_type . |
N/A | metadata.log_type |
O valor está codificado como AZURE_WAF . |
N/A | metadata.product_name |
O valor está codificado como Azure WAF Logs . |
N/A | metadata.vendor_name |
O valor está codificado 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 da Google SecOps.