Recolha registos do AWS WAF
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
- Crie um contentor do Amazon S3 seguindo este manual do utilizador: Criar um contentor
- Guarde o Nome e a Região do contentor para utilização posterior.
- Crie um utilizador seguindo este guia do utilizador: Criar um utilizador do IAM.
- Selecione o utilizador criado.
- Selecione o separador Credenciais de segurança.
- Clique em Criar chave de acesso na secção Chaves de acesso.
- Selecione Serviço de terceiros como o Exemplo de utilização.
- Clicar em Seguinte.
- Opcional: adicione a etiqueta de descrição.
- Clique em Criar chave de acesso.
- Clique em Transferir ficheiro CSV para guardar a chave de acesso e a chave de acesso secreta para utilização posterior.
- Clique em Concluído.
- Selecione o separador Autorizações.
- Clique em Adicionar autorizações na secção Políticas de autorizações.
- Selecione Adicionar autorizações.
- Selecione Anexar políticas diretamente.
- Pesquise e selecione a política AmazonS3FullAccess.
- Clicar em Seguinte.
- 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.
- Na consola da AWS, pesquise e selecione AWS WAF & Shield.
- Clique em Criar ACL Web.
- 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.
- Nome: atribua um nome à LCA (por exemplo,
- Depois de criada, selecione a ACL Web para a qual quer ativar o registo.
Como configurar o registo do AWS WAF
- Na AWS WAF Console, aceda ao separador Logging da sua ACL Web.
- Clique em Ativar registo.
- Selecione Amazon S3 como destino dos seus registos.
- Escolha o S3 bucket criado anteriormente para armazenar os registos.
- Opcional: configure um prefixo do registo para organizar os registos (por exemplo,
waf-logs/
). - 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.
- Aceda à consola S3.
- Selecione o contentor onde os registos vão ser armazenados.
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/*" } ] }
- 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
- Clique no pacote Amazon Cloud Platform.
- Localize o tipo de registo AWS WAF.
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.
- Substitua
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.
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.