Coletar registros do Azure WAF

Compatível com:

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

  1. No console do Azure, pesquise Contas de armazenamento.
  2. Clique em Criar.
  3. 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.
  4. Clique em Revisar + criar.
  5. Leia a visão geral da conta e clique em Criar.
  6. Na página Visão geral da conta de armazenamento, selecione o submenu Chaves de acesso em Segurança e rede.
  7. Clique em Mostrar ao lado de chave1 ou chave2.
  8. Clique em Copiar para a área de transferência para copiar a chave.
  9. Salve a chave em um local seguro para uso futuro.
  10. Na página Visão geral da conta de armazenamento, selecione o submenu Endpoints em Configurações.
  11. 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.
  12. Salve o URL do endpoint em um local seguro para uso futuro.

Configurar a exportação de registros para os registros do Azure WAF

  1. Faça login no portal do Azure usando sua conta privilegiada.
  2. Acesse Regras de firewall de aplicativo da Web (WAF) e selecione um WAF para monitorar.
  3. Selecione Monitoramento > Configurações de diagnóstico.
  4. Clique em + Adicionar configuração de diagnóstico.
    • Digite um nome descritivo para a configuração de diagnóstico.
  5. Selecione allLogs.
  6. Selecione a caixa de seleção Arquivar em uma conta de armazenamento como destino.
    • Especifique a assinatura e a conta de armazenamento.
  7. Clique em Salvar.

Configurar um feed no Google SecOps para processar os registros do Azure WAF

  1. Acesse Configurações do SIEM > Feeds.
  2. Clique em Adicionar novo.
  3. No campo Nome do feed, insira um nome para o feed. Por exemplo, Logs do Azure WAF.
  4. Selecione Microsoft Azure Blob Storage como o Tipo de origem.
  5. Selecione Azure WAF como o Tipo de registro.
  6. Clique em Próxima.
  7. 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)
    • 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.

  8. Clique em Próxima.

  9. 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 para principal.ip.
  • Definir rec_properties_trackingReference, rec_properties_host, rec_properties_policyMode, rec_properties_ruleName, rec_properties_policy, rec_properties_details_msg, rec_properties_clientIP e rec_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 para security_result.rule_name.
  • properties.action foi mapeado para security_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.