Coletar registros do AWS WAF
Neste documento, explicamos como coletar os registros do firewall de aplicativos da Web (WAF) da AWS configurando um feed do Google Security Operations. O analisador transforma registros brutos formatados em JSON em um formato estruturado de acordo com a 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 da UDM para representação e análise consistentes.
Antes de começar
*Verifique se você atende aos seguintes pré-requisitos:
- Instância do Google SecOps
- Acesso privilegiado à AWS
Configurar o bucket do Amazon S3
- Crie um bucket do Amazon S3 seguindo este guia do usuário: Como criar um bucket
- Salve o Nome e a Região do bucket para uso posterior.
- Crie um usuário seguindo este guia: Como criar um usuário do IAM.
- Selecione o usuário criado.
- Selecione a guia Credenciais de segurança.
- Clique em Criar chave de acesso na seção Chaves de acesso.
- Selecione Serviço de terceiros como o Caso de uso.
- Clique em Próxima.
- Opcional: adicione uma tag de descrição.
- Clique em Criar chave de acesso.
- Clique em Fazer o download do arquivo CSV para salvar a chave de acesso e a chave de acesso secreta para uso posterior.
- Clique em Concluído.
- Selecione a guia Permissões.
- Clique em Adicionar permissões na seção Políticas de permissões.
- Selecione Adicionar permissões.
- Selecione Anexar políticas diretamente.
- Pesquise e selecione a política AmazonS3FullAccess.
- Clique em Próxima.
- Clique em Adicionar permissões
Criar uma ACL (lista de controle de acesso) da Web do WAF
Se você ainda não configurou o AWS WAF, crie uma ACL da Web do WAF (lista de controle de acesso). Para configurações atuais, pule para o próximo procedimento.
- No console da AWS, pesquise e selecione AWS WAF & Shield.
- Clique em Criar ACL da Web.
- 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.
- Nome: dê um nome à ACL (por exemplo,
- Depois de criada, selecione a ACL da Web para ativar o registro em registros.
Como configurar o registro em log do AWS WAF
- No console do AWS WAF, acesse a guia Logging da ACL da Web.
- Clique em Ativar a geração de registros.
- Selecione Amazon S3 como o destino dos seus registros.
- Escolha o bucket do S3 criado anteriormente para armazenar os registros.
- Opcional: configure um prefixo de registro para organizar os registros (por exemplo,
waf-logs/
). - Clique em Salvar.
Verificar as permissões do bucket do S3
Verifique se o bucket do S3 tem as permissões adequadas para o AWS WAF gravar registros.
- Acesse o console do S3.
- Selecione o bucket em que os registros serão armazenados.
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/*" } ] }
- Clique em Salvar.
Configurar feeds
Há dois pontos de entrada diferentes para configurar feeds na plataforma do Google SecOps:
- Configurações do SIEM > Feeds > Adicionar novo
- Central de conteúdo > Pacotes de conteúdo > Começar
Como configurar o feed do AWS WAF
- Clique no pacote Amazon Cloud Platform.
- Localize o tipo de registro AWS WAF.
Especifique os valores nos campos a seguir.
- Tipo de origem: Amazon SQS V2
- Nome da fila: o nome da fila do SQS de onde ler.
- URI do S3: o URI do bucket.
s3://your-log-bucket-name/
- Substitua
your-log-bucket-name
pelo nome real do seu bucket do S3.
- Substitua
Opções de exclusão de origem: selecione a opção de exclusão de acordo com suas preferências de ingestão.
Idade máxima do arquivo: inclui arquivos modificados no último número de dias. O padrão é de 180 dias.
ID da chave de acesso à fila do SQS: uma chave de acesso à conta que é uma string alfanumérica de 20 caracteres.
Chave de acesso secreta da fila do SQS: uma chave de acesso da conta que é uma string alfanumérica de 40 caracteres.
Opções avançadas
- Nome do feed: um valor pré-preenchido que identifica o feed.
- Namespace do recurso: namespace associado ao feed.
- Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.
Clique em Criar feed.
Para mais informações sobre como configurar vários feeds para diferentes tipos de registros nessa família de produtos, consulte Configurar feeds por produto.
Tabela de mapeamento da UDM
Campo de registro | Mapeamento da 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 por 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 por 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 por 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 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 por 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 encerramento será extraído e mapeado para "security_result.rule_name" e "security_result.description". O ID do grupo de regras de encerramento é 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.detectioncom 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 por 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". Cada elemento de dados correspondente é 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 | 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 do Google SecOps.