Coletar registros do AWS WAF

Compatível com:

Neste documento, explicamos como coletar os registros do AWS Web Application Firewall (WAF) configurando um feed de operações de segurança do Google. O analisador transforma registros formatados em JSON brutos em um formato estruturado que segue o UDM do Google SecOps. Ele extrai campos como endereços IP, URLs, user agents e detalhes de regras de segurança, mapeando-os para os campos correspondentes do UDM para representação e análise consistentes.

Antes de começar

  • Verifique se você tem uma instância do Google SecOps.
  • Verifique se você tem acesso privilegiado à AWS.

Configurar o bucket do Amazon S3

  1. Crie um bucket do Amazon S3 seguindo este guia do usuário: Criar um bucket.
  2. Salve o Nome e a Região do bucket para uso posterior.
  3. Crie um usuário seguindo este guia: Como criar um usuário do IAM.
  4. Selecione o Usuário criado.
  5. Selecione a guia Credenciais de segurança.
  6. Clique em Criar chave de acesso na seção Chaves de acesso.
  7. Selecione Serviço de terceiros como o caso de uso.
  8. Clique em Próxima.
  9. Opcional: adicione a tag de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso futuro.
  12. Clique em Concluído.
  13. Selecione a guia Permissões.
  14. Clique em Adicionar permissões na seção Políticas de permissões.
  15. Selecione Adicionar permissões.
  16. Selecione Anexar políticas diretamente.
  17. Pesquise e selecione a política AmazonS3FullAccess.
  18. Clique em Próxima.
  19. Clique em Adicionar permissões

Criar uma ACL (lista de controle de acesso) da Web do WAF

Se você ainda não tiver configurado o AWS WAF, será necessário criar uma ACL (lista de controle de acesso) da Web do WAF. Para configurações existentes, pule para o próximo procedimento.

  1. No console da AWS, pesquise e selecione AWS WAF e Shield.
  2. Clique em Criar ACL da Web.
  3. Forneça as seguintes configurações:
    • Nome: dê um nome à ACL (por exemplo, my-waf-web-acl).
    • Região: escolha a região em que você quer aplicar o WAF.
    • Métricas do CloudWatch: ative a coleta de métricas para monitorar a atividade e as regras acionadas.
  4. Depois de criar, selecione a ACL da Web para a qual você quer ativar o registro.

Configurar o registro do AWS WAF

  1. No console do AWS WAF, acesse a guia Logging da ACL da Web.
  2. Clique em Ativar a geração de registros.
  3. Selecione o Amazon S3 como destino dos seus registros.
  4. Escolha o bucket do S3 criado anteriormente para armazenar os registros.
  5. Opcional: configure um prefixo de registro para organizar os registros (por exemplo, waf-logs/).
  6. Clique em Salvar.

Verificar as permissões do bucket do S3

Verifique se o bucket do S3 tem as permissões adequadas para que o AWS WAF grave registros.

  1. Acesse o console do S3.
  2. Selecione o bucket em que os registros serão armazenados.
  3. Na guia Permissões, adicione a seguinte política de bucket para permitir que o AWS WAF grave registros:

    {
      "Version": "2012-10-17",
      "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
                "Service": "wafv2.amazonaws.com"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::your-log-bucket-name/*"
          }
      ]
    }
    
  1. Clique em Salvar.

Configurar um feed no Google SecOps para processar os registros do AWS 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, AWS WAF Logs).
  4. Selecione Amazon S3 como o Tipo de origem.
  5. Selecione AWS WAF como o Tipo de registro.
  6. Clique em Próxima.
  7. Especifique valores para os seguintes parâmetros de entrada:

    • Região: a região em que o bucket do Amazon S3 está localizado.
    • URI do S3: o URI do bucket.
      • s3://your-log-bucket-name/waf-logs/
        • Substitua:
          • your-log-bucket-name: o nome real do bucket.
    • O URI é: selecione Diretório ou 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.
    • ID da chave de acesso: a chave de acesso do usuário com acesso ao bucket do S3.
    • Chave de acesso secreta: a chave secreta do usuário com acesso ao bucket do S3.
    • 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 de UDM Lógica
ação security_result.action Se a ação for PERMITIR, defina security_result.action como PERMITIR e security_result.severity como INFORMATIVO. Se a ação for "BLOCK", defina security_result.action como "BLOCK". Se a ação for CAPTCHA e captchaResponse.responseCode for 405, defina security_result.action como BLOCK e security_result.action_details como "CAPTCHA {captchaResponse.failureReason}".
captchaResponse.failureReason security_result.action_details Usado em conjunto com action e captchaResponse.responseCode para determinar security_result.action_details.
captchaResponse.responseCode security_result.action_details Usado com action e captchaResponse.failureReason para determinar security_result.action_details.
httpRequest.clientIp principal.ip e principal.asset.ip Mapeado diretamente para principal.ip e principal.asset.ip.
httpRequest.headers target.hostname, target.asset.hostname, network.http.user_agent, network.http.parsed_user_agent, network.http.referral_url, target.location.country_or_region, target.resource.attribute.labels, target.user.userid Itera cada cabeçalho em httpRequest.headers. Se o nome do cabeçalho for "host" ou "Host", o valor será mapeado para target.hostname e target.asset.hostname. Se o nome do cabeçalho for "User-Agent" ou "user-agent", o valor será mapeado para network.http.user_agent e analisado em network.http.parsed_user_agent. Se o nome do cabeçalho for "Referer" ou "referer", o valor será mapeado para network.http.referral_url. Se o nome do cabeçalho for "(?i)time-zone", o valor será mapeado para target.location.country_or_region. Se o nome do cabeçalho for "authorization", o valor será decodificado, e o nome de usuário será extraído e mapeado para target.user.userid. Todos os outros cabeçalhos são adicionados como pares de chave-valor a target.resource.attribute.labels.
httpRequest.httpMethod network.http.method Mapeado diretamente para network.http.method.
httpRequest.requestId network.session_id Mapeado diretamente para network.session_id.
httpRequest.uri target.url Mapeado diretamente para target.url.
httpSourceId target.resource.name Mapeado diretamente para target.resource.name.
httpSourceName metadata.product_event_type Mapeado diretamente para metadata.product_event_type.
rótulos security_result.rule_labels Itera cada rótulo em "labels". Se o nome do rótulo não estiver vazio, ele será adicionado como um par de chave-valor a security_result.rule_labels.
nonTerminatingMatchingRules security_result.action_details, security_result.rule_labels Itera cada regra em nonTerminatingMatchingRules. Se a ação for "ALLOW" e a ação da regra for CAPTCHA, defina security_result.action_details como "CAPTCHA SUCCESSFUL" e adicione o ID da regra a security_result.rule_labels com a chave "nonTerminatingCaptchaRuleName". Se a ação for "BLOCK" ou "ALLOW" e a ação da regra for "COUNT", defina security_result.action_details como "COUNT RULE" e adicione o ID da regra a security_result.rule_labels com a chave "nonTerminatingCountRuleName". Se a ação for "BLOCK" ou "ALLOW" e a ação da regra for "CHALLENGE", defina security_result.action_details como "COUNT RULE" e adicione o ID da regra a security_result.rule_labels com a chave "nonTerminatingChallengeRuleName".
rateBasedRuleList security_result.rule_id, security_result.rule_name, security_result.description Se terminatingRuleType for "RATE_BASED", ele iterará por cada regra em rateBasedRuleList. Se terminatingRuleId corresponder ao nome da regra, o ID, o nome e a descrição da regra serão mapeados para security_result.rule_id, security_result.rule_name e security_result.description, respectivamente.
responseCodeSent network.http.response_code Mapeado diretamente para network.http.response_code e convertido em um número inteiro.
ruleGroupList intermediary.labels, security_result.rule_id, security_result.rule_name, security_result.description, security_result.detection_fields Itera cada grupo de regras em ruleGroupList. O ID do grupo de regras é adicionado como um par de chave-valor a intermediary.labels. Se terminatingRuleType for "MANAGED_RULE_GROUP" e terminatingRuleId corresponder ao ID do grupo de regras, o ID, o nome e a descrição da regra serão mapeados para security_result.rule_id, security_result.rule_name e security_result.description, respectivamente. Se terminatingRuleType for "GROUP", o ID da regra de término será extraído e mapeado para security_result.rule_name e security_result.description. O ID do grupo de regras de término é adicionado a security_result.rule_labels com a chave "terminatingRuleGroupName". Se terminatingRuleType for "REGULAR", a ação da regra de encerramento será extraída e adicionada aos campos security_result.detection com a chave "terminatingRuleAction{index}".
terminatingRuleId security_result.rule_id, security_result.rule_name, security_result.description Se terminatingRuleType for "RATE_BASED", "MANAGED_RULE_GROUP" ou "REGULAR", terminatingRuleId será mapeado para security_result.rule_id, security_result.rule_name e usado para construir security_result.description.
terminatingRuleMatchDetails security_result.description, security_result.category_details, security_result.detection_fields Itera cada correspondência em terminatingRuleMatchDetails. Define security_result.description como "Terminating Rule". Se o tipo de condição não estiver vazio, ele será adicionado a security_result.category_details. Se o local não estiver vazio, ele será adicionado a security_result.detection_fields com a chave "location". Para cada elemento de dados correspondente, ele é adicionado a security_result.detection_fields com a chave "matchedData".
terminatingRuleType security_result.rule_type Mapeado diretamente para security_result.rule_type.
timestamp metadata.event_timestamp Convertido em um carimbo de data/hora e mapeado para metadata.event_timestamp.
webaclId intermediary.resource.name Mapeado diretamente para intermediary.resource.name.
metadata.vendor_name Defina como "AMAZON".
metadata.product_name Defina como "AWS Web Application Firewall".
metadata.log_type Defina como "AWS_WAF".
network.application_protocol Defina como "HTTP".
metadata.event_type Defina como "NETWORK_HTTP" se httpRequest.headers contiver um cabeçalho "host" ou "Host". Caso contrário, defina como "STATUS_UPDATE".

Alterações

2024-03-14

  • Melhoria no tratamento de caracteres de escape inválidos em mensagens de registro para garantir o formato JSON adequado.

2023-12-29

  • O mapeamento das informações "user-agent" foi padronizado para o campo apropriado do UDM.
  • Extraiu IDs de usuários do cabeçalho "authorization" em solicitações HTTP.

2023-12-08

  • Correção de vários bugs relacionados ao mapeamento de nome de host, extração de URL de destino e processamento de regras.
  • Melhoria no tratamento de erros em seções específicas do analisador.

2023-12-11

  • Adicionamos suporte a um novo formato de registro com a introdução de um novo padrão Grok.

2023-08-16

  • Melhoramos o mapeamento de ações de regras de segurança para o campo de UDM dos campos de detecção.

2022-12-16

  • A lógica de filtragem de datas foi otimizada e o processamento de dados JSON inválidos foi aprimorado.
  • As informações do user agent foram mapeadas dos cabeçalhos HTTP para um campo dedicado da UDM.

2022-12-11

  • A lógica desnecessária para o processamento de registros de mensagens CSV e SYSLOG foi removida.

2022-07-22

  • Isso marcou a criação inicial do analisador.

Precisa de mais ajuda? Receba respostas de membros da comunidade e profissionais do Google SecOps.