Coletar registros do AWS WAF
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
- Crie um bucket do Amazon S3 seguindo este guia do usuário: 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 a 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 futuro.
- 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 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.
- No console da AWS, pesquise e selecione AWS WAF e 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 criar, selecione a ACL da Web para a qual você quer ativar o registro.
Configurar o registro 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 o Amazon S3 como 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 que o AWS WAF grave 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 um feed no Google SecOps para processar os registros do AWS WAF
- Acesse Configurações do SIEM > Feeds.
- Clique em Adicionar novo.
- No campo Nome do feed, insira um nome para o feed (por exemplo, AWS WAF Logs).
- 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:
- 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.
Clique em Próxima.
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.