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 da Web do WAF (lista de controle de acesso)
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
- Central de conteúdo > Pacotes de conteúdo
Configure feeds em Configurações do SIEM > Feeds
Para configurar vários feeds para diferentes tipos de registros nessa família de produtos, consulte Configurar vários feeds.
Para configurar um único feed, siga estas etapas:
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo feed.
- Na próxima página, clique em Configurar um único feed.
- No campo Nome do feed, insira um nome para o feed (por exemplo, Registros do AWS WAF).
- Selecione Amazon S3 como o Tipo de origem.
- Selecione AWS WAF como o Tipo de registro.
- Clique em Próxima.
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.
- Substitua:
- URI é um: selecione Diretório ou Diretório que inclui subdiretórios.
- Opções de exclusão de origem: selecione a opção de exclusão de acordo com suas preferências de ingestão.
ID da chave de acesso: a chave de acesso do usuário com permissões para ler do bucket do S3.
Chave de acesso secreta: a chave secreta do usuário com permissões para ler do bucket do S3.
Namespace do recurso: o namespace do recurso.
Rótulos de ingestão: o rótulo a ser aplicado aos eventos deste feed.
Clique em Próxima.
Revise a nova configuração do feed na tela Finalizar e clique em Enviar.
Configurar feeds na Central de conteúdo
Especifique valores para os seguintes campos:
- 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/
- Substitua
your-log-bucket-name
pelo nome real do seu bucket do S3.
- Substitua
- URI é um: selecione Diretório ou Diretório que inclui subdiretórios, dependendo da estrutura do bucket.
- Opções de exclusão de origem: selecione a opção de exclusão de acordo com suas preferências de ingestão.
ID da chave de acesso: a chave de acesso do usuário com permissões para ler do bucket do S3.
Chave de acesso secreta: a chave secreta do usuário com permissões para ler do bucket do S3.
Opções avançadas
- Nome do feed: um valor pré-preenchido que identifica o feed.
- Tipo de origem: método usado para coletar registros no Google SecOps.
- Namespace do recurso: namespace associado ao feed.
- Rótulos de ingestão: rótulos aplicados a todos os eventos deste feed.
Tabela de mapeamento do 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.