Kibana ens ajuda amb els logs de AWS Cloudfront i WAF Akamai

L’anàlisis dels logs en qualsevol plataforma és molt important ja que ens permet veure quin és el comportament de cadascun dels components, alhora, ens permet des de corregir error, preveure averies a millorar el producte. De totes les solucions que he tingut la sort de probar, Splunk és la que més m’ha agradat. L’unic inconvenient d’utilitzar l’Splunk és el seu preu.

Degut al alt cost de l’Splunk i aprofitant que l’empresa on treballo necessita analitzar els logs de les CDNs de AWS Cloudfront i Akamai, vaig aprofitar per probar Kibana+Elastcisearch+Logstash. L’objectiu d’aquest post és mostrar el potencial d’aquesta combinació, una solució més econòmica que el gran tot poderos Splunk.

Comencem amb els logs de Akmaai, aquí us paso el format de log que volem analitzar, extret de la documentació oficial:

waf_logformat

apache_logformat

El filtre de logstash que he implementat és :

filter {
    grok {
      type => "esw3c_waf"
      match => { "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] (?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest}) %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{QS:referrer} %{QS:agent} %{QS:cookies} \"%{WORD:WafPolicy}\|%{DATA:WafAlertRules}\|%{DATA:WafDenyRules}\"" }
    }

    date {
      type => "esw3c_waf"
      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
      locale => "en"
    }

}

Pel que fa als logs de AWS Cloudfront, el format del log esta documentat en aquest , però basicament és:

#Fields: date time x-edge-location sc-bytes c-ip cs-method cs(Host) cs-uri-stem sc-status cs(Referer) cs(User-Agent) cs-uri-query cs(Cookie) x-edge-result-type x-edge-request-id x-host-header cs-protocol cs-bytes 
07/01/2012 01:13:11 FRA2 182 192.0.2.10 GET d111111abcdef8.cloudfront.net /view/my/file.html 200 www.displaymyfiles.com Mozilla/4.0%20(compatible;%20MSIE%205.0b1;%20Mac_PowerPC) - zip=98101 RefreshHit MRVMF7KydIvxMWfJIglgwHQwZsbG2IhRJ07sn9AkKUFSHS9EXAMPLE== d111111abcdef8.cloudfront.net http -

A més, logstash té implementat un input contra S3, ideal per a aquest cas.
Per la part del filtre, l’expressió és la seguent:

filter {
    grok {
    type => "aws"
    pattern => "%{DATE_EU:date}\t%{TIME:time}\t%{WORD:x-edge-location}\t(?:%{NUMBER:sc-bytes}|-)\t%{IPORHOST:c-ip}\t%{WORD:cs-method}\t%{HOSTNAME:cs-host}\t%{NOTSPACE:cs-uri-stem}\t%{NUMBER:sc-status}\t%{GREEDYDATA:referrer}\t%{GREEDYDATA:User-Agent}\t%{GREEDYDATA:cs-uri-stem}\t%{GREEDYDATA:cookies}\t%{WORD:x-edge-result-type}\t%{NOTSPACE:x-edge-request-id}\t%{HOSTNAME:x-host-header}\t%{URIPROTO:cs-protocol}\t%{INT:cs-bytes}"
}
mutate {
    type => "aws"
        add_field => [ "listener_timestamp", "%{date} %{time}" ]
    }
date {
      type => "aws"
      match => [ "listener_timestamp", "yy-MM-dd HH:mm:ss" ]
    }
}

Per cert, recomenar-vos activar el LifeCycle en el Bucket de S3 per a configurar un purgat de logs, creix ràpid (evidentment, el creixement també depen del vostre tràfic).

Un cop definit com farem la importació passem a comentar on guardarem les dades, ho farem en el Elasticsearch 1.0 aprofitant que ha sortit recentment. Vull destarcar 2 pluguins que als sysadmins els agradara conèixer, el pluguin HEAD i MARVEL.

Captura de pantalla del pluguin HEAD, on hem fet un index per dia/cdn
ElasticHead

Captura de pantalla del pluguin MARVEL
Marvel

Abans de pasar a la part de pintar les dades, us paso dos links amb les GROKS disponibles i una eina per a contruir-les
Llista de patrons GROK disponibles
Eina per construir les configuracions

Per acabar, per a pintar totes aquestes dades utilitzarem la aplicació de Kibana, una aplicació javascript que utilitza les dades del elaticsearch per a poder crear informes, gràfiques i filtres acurats.

Per començar he fet 2 dashboards molt simples, per una banda el de WAF de Akamai i per una altra el de Cloudfront.

Dashboard de Cloudfront:
CloudfrontDashboard

Dashboard de Akamai:
AkamaiDashboard

Leave a Reply

Your email address will not be published. Required fields are marked *