Recolha registos do AWS WAF

Compatível com:

Este documento explica como recolher os registos da firewall de aplicações Web (WAF) da AWS configurando um feed do Google Security Operations. O analisador transforma os registos formatados JSON não processados num formato estruturado em conformidade com o UDM do Google SecOps. Extrai campos como endereços IP, URLs, agentes do utilizador e detalhes das regras de segurança, mapeando-os para os campos UDM correspondentes para uma representação e uma análise consistentes.

Antes de começar

*Certifique-se de que cumpre os seguintes pré-requisitos:

  • Instância do Google SecOps
  • Acesso privilegiado ao AWS

Configure o contentor do Amazon S3

  1. Crie um contentor do Amazon S3 seguindo este manual do utilizador: Criar um contentor
  2. Guarde o Nome e a Região do contentor para utilização posterior.
  3. Crie um utilizador seguindo este guia do utilizador: Criar um utilizador do IAM.
  4. Selecione o utilizador criado.
  5. Selecione o separador Credenciais de segurança.
  6. Clique em Criar chave de acesso na secção Chaves de acesso.
  7. Selecione Serviço de terceiros como o Exemplo de utilização.
  8. Clicar em Seguinte.
  9. Opcional: adicione a etiqueta de descrição.
  10. Clique em Criar chave de acesso.
  11. Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
  12. Clique em Concluído.
  13. Selecione o separador Autorizações.
  14. Clique em Adicionar autorizações na secção Políticas de autorizações.
  15. Selecione Adicionar autorizações.
  16. Selecione Anexar políticas diretamente.
  17. Pesquise e selecione a política AmazonS3FullAccess.
  18. Clicar em Seguinte.
  19. Clique em Adicionar autorizações.

Crie uma LCA (lista de controlo de acesso) Web da WAF

Se ainda não configurou o AWS WAF, tem de criar uma ACL Web do WAF (lista de controlo de acesso). Para configurações existentes, pode avançar para o procedimento seguinte.

  1. Na consola da AWS, pesquise e selecione AWS WAF & Shield.
  2. Clique em Criar ACL Web.
  3. Indique as seguintes definições:
    • Nome: atribua um nome à LCA (por exemplo, my-waf-web-acl).
    • Região: escolha a região onde quer aplicar a WAF.
    • Métricas do CloudWatch: ative a recolha de métricas para acompanhar a atividade e as regras acionadas.
  4. Depois de criada, selecione a ACL Web para a qual quer ativar o registo.

Como configurar o registo do AWS WAF

  1. Na AWS WAF Console, aceda ao separador Logging da sua ACL Web.
  2. Clique em Ativar registo.
  3. Selecione Amazon S3 como destino dos seus registos.
  4. Escolha o S3 bucket criado anteriormente para armazenar os registos.
  5. Opcional: configure um prefixo do registo para organizar os registos (por exemplo, waf-logs/).
  6. Clique em Guardar.

Valide as autorizações para o contentor do S3

Certifique-se de que o contentor do S3 tem as autorizações adequadas para o AWS WAF escrever registos.

  1. Aceda à consola S3.
  2. Selecione o contentor onde os registos vão ser armazenados.
  3. No separador Autorizações, adicione a seguinte política de contentor para permitir que o AWS WAF escreva registos:

    {
      "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 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 AWS WAF

  1. Clique no pacote Amazon Cloud Platform.
  2. Localize o tipo de registo AWS WAF.
  3. Especifique os valores nos seguintes campos.

    • Tipo de origem: Amazon SQS V2
    • Nome da fila: o nome da fila SQS a partir da qual ler
    • URI do S3: o URI do contentor.
      • s3://your-log-bucket-name/
        • Substitua your-log-bucket-name pelo nome real do seu contentor do S3.
    • Opções de eliminação de origens: selecione a opção de eliminação de acordo com as suas preferências de carregamento.

    • Idade máxima do ficheiro: inclua ficheiros modificados no último número de dias. A predefinição é 180 dias.

    • ID da chave de acesso à fila SQS: uma chave de acesso à conta que é uma string alfanumérica de 20 carateres.

    • Chave de acesso secreta da fila SQS: uma chave de acesso à conta que é uma string alfanumérica de 40 carateres.

    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.
  4. 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 do UDM Lógica
ação security_result.action Se a ação for ALLOW, defina security_result.action como ALLOW e security_result.severity como INFORMATIONAL. 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 em conjunto com action e captchaResponse.failureReason para determinar security_result.action_details.
httpRequest.clientIp principal.ip, 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 é mapeado para target.hostname e target.asset.hostname. Se o nome do cabeçalho for "User-Agent" ou "user-agent", o valor é 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 é mapeado para network.http.referral_url. Se o nome do cabeçalho for "(?i)time-zone", o valor é mapeado para target.location.country_or_region. Se o nome do cabeçalho for "authorization", o valor é descodificado, o nome de utilizador é extraído e mapeado para target.user.userid. Todos os outros cabeçalhos são adicionados como pares de chave-valor para 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.
etiquetas security_result.rule_labels Itera cada etiqueta em labels. Se o nome da etiqueta não estiver vazio, é 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", itera cada regra em rateBasedRuleList. Se terminatingRuleId corresponder ao nome da regra, o ID da regra, o nome da regra e a descrição são mapeados para security_result.rule_id, security_result.rule_name e security_result.description, respetivamente.
responseCodeSent network.http.response_code Mapeado diretamente para network.http.response_code e convertido num 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 da regra, o nome da regra e a descrição são mapeados para security_result.rule_id, security_result.rule_name e security_result.description, respetivamente. Se terminatingRuleType for "GROUP", o ID da regra de terminação é extraído e mapeado para security_result.rule_name e security_result.description. O ID do grupo de regras de terminação é adicionado a security_result.rule_labels com a chave "terminatingRuleGroupName". Se terminatingRuleType for "REGULAR", a ação da regra de rescisão é extraída e adicionada a security_result.detectionfields 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 é 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, é adicionado a security_result.category_details. Se a localização não estiver vazia, é adicionada a security_result.detection_fields com a chave "location". Para cada elemento de dados correspondente, este é 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 numa data/hora e mapeado para metadata.event_timestamp.
webaclId intermediary.resource.name Mapeado diretamente para intermediary.resource.name.
metadata.vendor_name Definido como "AMAZON".
metadata.product_name Definido como "AWS Web Application Firewall".
metadata.log_type Definido como "AWS_WAF".
network.application_protocol Definido como "HTTP".
metadata.event_type Definido como "NETWORK_HTTP" se httpRequest.headers contiver um cabeçalho "host" ou "Host". Caso contrário, defina como "STATUS_UPDATE".

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