Quais são minhas opções para analisar os logs do AWS WAF armazenados no CloudWatch ou no Amazon S3?
Estou armazenando meus logs do AWS WAF no Amazon CloudWatch ou no Amazon Simple Storage Solution (Amazon S3) como destino do meu stream de entrega do Amazon Kinesis Data Firehose. Que opções eu tenho para analisar meus logs de acesso do AWS WAF?
Resolução
Para analisar e filtrar solicitações de log específicas, use os Amazon CloudWatch Logs Insights para logs do CloudWatch ou o Amazon Athena para logs do Amazon S3.
Análisar os logs de acesso do AWS WAF com CloudWatch Logs Insights
- Abra o console do Amazon CloudWatch.
- No painel de navegação, escolha Logs e, em seguida, escolha Log Insights.
- Em Select log group(s) (Selecionar grupo(s) de logs), escolha um ou mais grupos de logs para consulta que consistem em logs de acesso do AWS WAF.
- (Opcional) Escolha um intervalo de tempo para o período que deseja consultar.
- Use a sintaxe de consulta para criar consultas.
- Escolha Run (Executar) para visualizar os resultados do grupo de logs.
Estes são exemplos de consultas que você pode usar para filtrar informações específicas do CloudWatch Logs Insights:
Filtrar por uma string específica
Execute esta consulta para filtrar o log com base em uma string específica:
Observação: substitua a string {jndi:ldap. pela string que deseja pesquisar.
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method,httpRequest.uri as URI | parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | filter @message like "{jndi:ldap" | sort action, URI desc
Filtrar por host
Execute esta consulta para filtrar por host:
Observação: substitua o valor do host www.example.com pelo host que deseja pesquisar.
parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | filter Host = "www.example.com" | fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI
Filtrar por solicitações POST
Execute esta consulta para isolar todas as solicitações POST:
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.httpMethod as Method, httpRequest.uri as URI, httpRequest.requestId as RequestID | filter httpRequest.httpMethod ="POST" | display Rule, action, Country, ClientIP, Method, URI, Host, UserAgent, RequestID | sort Rule, action desc
Filtrar por UserAgent
Execute esta consulta para filtrar por UserAgent:
Observação: substitua User-Agent-Value pelo seu valor de UserAgent**.**
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | filter UserAgent like "<User-Agent-Value>" | fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI
Solicitações de filtro não provenientes de um país
Execute esta consulta para filtrar solicitações que não são provenientes de um país específico:
fields terminatingRuleId as Rule, action, httpRequest.country as Country, httpRequest.clientIp as ClientIP, httpRequest.uri as URI | parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | filter Country != "US" | sort Country, action desc
Filtrar por script entre sites ou injeção de SQL
Execute esta consulta para filtrar scripts entre sites ou injeção de SQL:
fields @timestamp, terminatingRuleId, action, httpRequest.clientIp as ClientIP, httpRequest.country as Country, terminatingRuleMatchDetails.0.conditionType as ConditionType, terminatingRuleMatchDetails.0.location as Location, terminatingRuleMatchDetails.0.matchedData.0 as MatchedData | filter ConditionType in["XSS","SQL_INJECTION"]
Série temporal baseada em uma regra de encerramento
Execute esta consulta para filtrar uma série temporal com base em uma regra de encerramento:
#Time Series by Terminating Rule filter terminatingRuleId = "AWS-AWSManagedRulesCommonRuleSet" | stats count(*) as requestCount by bin(30m)
Resumir solicitações bloqueadas por ClientIP, país, URI e regra
Execute esta consulta para resumir solicitações bloqueadas por ClientIP, país, URI e regra:
fields httpRequest.clientIp as ClientIP, httpRequest.country as Country, httpRequest.uri as URI, terminatingRuleId as Rule | filter action = "BLOCK" | stats count(*) as RequestCount by Country, ClientIP, URI, Rule | sort RequestCount desc
Principais IPs de clientes
Execute esta consulta para contar os principais IPs de clientes:
stats count(*) as RequestCount by httpRequest.clientIp as ClientIP | sort RequestCount desc
Principais países
Execute esta consulta para contar os principais países:
stats count(*) as RequestCount by httpRequest.country as Country | sort RequestCount desc
Principais hosts
Execute esta consulta para contar os principais hosts:
parse @message /\{"name":"[Hh]ost\",\"value":\"(?<Host>[^"}]*)/ | stats count(*) as RequestCount by Host | sort RequestCount desc
Principais métodos
Execute essa consulta para contar os principais métodos:
stats count(*)as RequestCount by httpRequest.httpMethod as Method | sort RequestCount desc
Principais regras de encerramento
Execute esta consulta para contar as principais regras de encerramento:
stats count(*) as RequestCount by terminatingRuleId | sort RequestCount desc
Principais UserAgents
Execute esta consulta para contar os principais UserAgents:
parse @message /\{"name":"[Uu]ser\-[Aa]gent\",\"value\"\:\"(?<UserAgent>[^"}]*)/ | stats count(*) as RequestCount by UserAgent | sort RequestCount desc
Solicitação não encerrada por Default_Action ou regras com a ação ALLOW
Execute esta consulta para filtrar por solicitações não encerradas por uma Default_Action ou regras com uma ação ALLOW:
fields @timestamp, terminatingRuleId, action, @message | filter terminatingRuleId != 'Default_Action' and action != 'ALLOW' | sort @timestamp desc
Solicitação com token Captcha inválido
Execute esta consulta para filtrar por solicitações com um token Captcha inválido:
fields @timestamp, httpRequest.clientIp, httpRequest.requestId, captchaResponse.failureReason, @message |filter captchaResponse.failureReason ='TOKEN_MISSING' | sort @timestamp desc
Solicitação bloqueada por regra baseada em taxa
Execute esta consulta para filtrar por solicitações bloqueadas por uma regra baseada em taxa:
fields @timestamp, httpRequest.clientIp, terminatingRuleId, httpRequest.country,@message | filter terminatingRuleType ="RATE_BASED" ## and webaclId = "arn:aws:wafv2:us-east-1:xxxxxxxx:regional/webacl/waf-test/abcdefghijkl" ## uncomment to filter for specific WebACL | sort requestCount desc
Filtrar todas as solicitações detectadas pelo AWS Bot Control (ABC)
Execute esta consulta para filtrar todas as solicitações detectadas pelo ABC:
fields @timestamp, @message |filter @message like 'awswaf:managed:aws:bot-control' | parse @message '"labels":[*]' as Labels | sort @timestamp desc
Analisar os logs de acesso do AWS WAF com o Amazon Athena
Você pode ativar o registro em log de acesso do AWS WAF diretamente em um bucket do Amazon S3. Ou você pode usar o stream de entrega do Amazon Kinesis Data Firehose para entregar seus logs de acesso do AWS WAF a um bucket do Amazon S3. Para saber como armazenar logs no Amazon S3, consulte Como configuro o log abrangente do AWS WAF para armazenar logs no Amazon S3?
Quando seus logs de acesso estiverem no bucket do Amazon S3, crie a tabela do AWS WAF para usar o Amazon Athena para consultar logs e filtrar vários detalhes.
Essas consultas são exemplos que você pode usar para consultar logs do AWS WAF com o Athena:
Informações sobres solicitações bloqueadas com regras do AWS WAF
Execute esta consulta do Athena para listar todas as solicitações bloqueadas com regras do AWS WAF:
SELECT timestamp, action, httpsourcename, httpsourceid, httprequest.requestID, httprequest.clientip, webaclid, terminatingruleid, terminatingruletype, rulegrouplist, terminatingrulematchdetails FROM "wafv2"."waf_logs" WHERE ("action" LIKE 'BLOCK')
Solicitar agente do usuário
Execute esta consulta do Athena para solicitar o UserAgent:
Observação: substitua User-Agent por seu valor de UserAgent.
select n.value, count(n.value) as count from waf_logs cross join unnest( cast( httprequest.headers as ARRAY(ROW(name VARCHAR, value VARCHAR)) ) ) as x(n) where n.name = 'User-Agent' group by n.value ORDER BY count(n.value) DESC
URI de solicitação
Execute esta consulta do Athena para verificar o URI da solicitação:
SELECT "httprequest"."uri" , "count"(*) "count" FROM waf_logs WHERE ("action" LIKE 'BLOCK') GROUP BY "httprequest"."uri" ORDER BY "count" DESC
Contar solicitações bloqueadas com base no ClientIP
Execute esta consulta do Athena para visualizar a contagem de solicitações bloqueadas com base no ClientIP e no país:
SELECT "httprequest"."clientip" , "count"(*) "count" , "httprequest"."country" FROM waf_logs WHERE ("action" LIKE 'BLOCK') GROUP BY "httprequest"."clientip", "httprequest"."country" ORDER BY "count" DESC
Visualizar contagem de solicitações
Execute esta consulta do Athena para visualizar a contagem de solicitações:
SELECT "httprequest"."clientip" , "count"(*) "count" ,"httprequest"."country" FROM waf_logs WHERE ("action" LIKE 'BLOCK') GROUP BY "httprequest"."clientip", "httprequest"."country" ORDER BY "count" DESC
Para obter exemplos adicionais de consulta do Athena, consulte Exemplos de consultas para logs do AWS WAF.
Conteúdo relevante
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 2 anos
- AWS OFICIALAtualizada há 3 meses