cscli parsers install crowdsecurity/apache2-logs
This apache2 parser support access and error logs in the HTTPD COMBINED LOG standard format, with the following possible modifications :
target_fqdn
. This is meant for multi-tenant / aggregated logs.referrer
and user_agent
have been made optional for more epurated logging formatsnote : If you are aggregating logs from several domains, prefix your logline with the target FQDN. HTTP based scenarios should take this into account so that buckets are per source IP per target FQDN, limiting false positives due to logs multiplexing.
1#Apache access/errors logs2#debug: true3filter: "evt.Parsed.program startsWith 'apache2'"4onsuccess: next_stage5name: crowdsecurity/apache2-logs6description: "Parse Apache2 access and error logs"7#log line can be prefixed by a target_fqdn8nodes:9 - grok:10 pattern: '(%{IPORHOST:target_fqdn}(:%{INT:port})? )?%{COMMONAPACHELOG}( "%{NOTDQUOTE:referrer}" "%{NOTDQUOTE:http_user_agent}")?'11 apply_on: message12 # these ones apply for both grok patterns13 statics:14 - meta: log_type15 value: http_access-log16 - target: evt.StrTime17 expression: evt.Parsed.timestamp18 - meta: service19 value: http20 - meta: source_ip21 expression: evt.Parsed.clientip22 - meta: http_status23 expression: evt.Parsed.response24 - meta: http_path25 expression: "evt.Parsed.request != '' ? evt.Parsed.request : evt.Parsed.rawrequest"26 - meta: http_verb27 expression: "evt.Parsed.verb"28 - meta: http_user_agent29 expression: "evt.Parsed.http_user_agent"30 - meta: target_fqdn31 expression: "evt.Parsed.target_fqdn"32 onsuccess: next_stage33 - grok:34 pattern: '%{HTTPD_ERRORLOG}'35 apply_on: message36 onsuccess: next_stage37 pattern_syntax:38 NOT_DOUBLE_POINT: '[^:]+'39 NOT_DOUBLE_QUOTE: '[^"]+'40 nodes:41 - filter: "evt.Parsed.module == 'auth_basic'"42 onsuccess: next_stage43 pattern_syntax:44 EXTRACT_USER_AND_PATH: 'user %{NOT_DOUBLE_POINT:username}: authentication failure for "%{NOT_DOUBLE_QUOTE:target_uri}": Password Mismatch'45 EXTRACT_USER_AND_PATH2: 'user %{NOT_DOUBLE_POINT:username} not found: "?%{NOT_DOUBLE_QUOTE:target_uri}"?'46 grok:47 pattern: '%{EXTRACT_USER_AND_PATH}|%{EXTRACT_USER_AND_PATH2}'48 apply_on: message49 # these ones apply for both grok patterns50 statics:51 - meta: username52 expression: evt.Parsed.username53 - meta: http_path54 expression: evt.Parsed.target_uri55 - meta: sub_type56 value: "auth_fail"57 - filter: "evt.Parsed.module == 'core' && evt.Parsed.message contains 'Invalid URI'"58 onsuccess: next_stage59 pattern_syntax:60 EXTRACT_URIVERB: 'Invalid URI in request %{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})'61 grok:62 pattern: '%{EXTRACT_URIVERB}'63 apply_on: message64 statics:65 - meta: http_path66 expression: evt.Parsed.request67 - meta: sub_type68 value: "invalid_uri"69 - filter: "evt.Parsed.module == 'authz_core' && evt.Parsed.message contains 'client denied'"70 onsuccess: next_stage71 pattern_syntax:72 EXTRACT_PATH: 'client denied by server configuration: %{GREEDYDATA:target_uri}'73 grok:74 pattern: '%{EXTRACT_PATH}'75 apply_on: message76 statics:77 - meta: http_path78 expression: evt.Parsed.target_uri79 - meta: sub_type80 value: "permission_denied"81 - filter: "evt.Parsed.module == 'ssl' && evt.Parsed.message contains 'SSL handshake stopped'"82 statics:83 - meta: sub_type84 value: "ssl_handshake_stopped"8586 statics:87 - meta: log_type88 value: http_error-log89 - target: evt.StrTime90 expression: evt.Parsed.timestamp91 - meta: service92 value: http93 - meta: source_ip94 expression: evt.Parsed.client95 - meta: http_status96 expression: evt.Parsed.response979899