logstash-patterns-core 4.0.2 → 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/CHANGELOG.md +149 -8
- data/CONTRIBUTORS +1 -0
- data/Gemfile +11 -1
- data/LICENSE +199 -10
- data/README.md +12 -19
- data/lib/logstash/patterns/core.rb +11 -3
- data/logstash-patterns-core.gemspec +1 -1
- data/patterns/ecs-v1/aws +28 -0
- data/patterns/ecs-v1/bacula +53 -0
- data/patterns/ecs-v1/bind +13 -0
- data/patterns/ecs-v1/bro +30 -0
- data/patterns/ecs-v1/exim +26 -0
- data/patterns/ecs-v1/firewalls +111 -0
- data/patterns/ecs-v1/grok-patterns +95 -0
- data/patterns/ecs-v1/haproxy +40 -0
- data/patterns/ecs-v1/httpd +17 -0
- data/patterns/ecs-v1/java +34 -0
- data/patterns/ecs-v1/junos +13 -0
- data/patterns/ecs-v1/linux-syslog +16 -0
- data/patterns/ecs-v1/maven +1 -0
- data/patterns/ecs-v1/mcollective +4 -0
- data/patterns/ecs-v1/mongodb +7 -0
- data/patterns/ecs-v1/nagios +124 -0
- data/patterns/ecs-v1/postgresql +2 -0
- data/patterns/ecs-v1/rails +13 -0
- data/patterns/ecs-v1/redis +3 -0
- data/patterns/ecs-v1/ruby +2 -0
- data/patterns/ecs-v1/squid +6 -0
- data/patterns/ecs-v1/zeek +33 -0
- data/patterns/legacy/aws +14 -0
- data/patterns/{bacula → legacy/bacula} +5 -5
- data/patterns/legacy/bind +3 -0
- data/patterns/{bro → legacy/bro} +0 -0
- data/patterns/{exim → legacy/exim} +8 -2
- data/patterns/{firewalls → legacy/firewalls} +7 -2
- data/patterns/{grok-patterns → legacy/grok-patterns} +5 -13
- data/patterns/{haproxy → legacy/haproxy} +1 -1
- data/patterns/legacy/httpd +15 -0
- data/patterns/{java → legacy/java} +1 -4
- data/patterns/{junos → legacy/junos} +0 -0
- data/patterns/{linux-syslog → legacy/linux-syslog} +1 -1
- data/patterns/legacy/maven +1 -0
- data/patterns/{mcollective → legacy/mcollective} +0 -0
- data/patterns/{mcollective-patterns → legacy/mcollective-patterns} +0 -0
- data/patterns/{mongodb → legacy/mongodb} +0 -0
- data/patterns/{nagios → legacy/nagios} +1 -1
- data/patterns/{postgresql → legacy/postgresql} +0 -0
- data/patterns/{rails → legacy/rails} +0 -0
- data/patterns/legacy/redis +3 -0
- data/patterns/{ruby → legacy/ruby} +0 -0
- data/patterns/legacy/squid +4 -0
- data/spec/patterns/aws_spec.rb +395 -0
- data/spec/patterns/bacula_spec.rb +367 -0
- data/spec/patterns/bind_spec.rb +78 -0
- data/spec/patterns/bro_spec.rb +613 -0
- data/spec/patterns/core_spec.rb +271 -16
- data/spec/patterns/exim_spec.rb +201 -0
- data/spec/patterns/firewalls_spec.rb +683 -49
- data/spec/patterns/haproxy_spec.rb +253 -28
- data/spec/patterns/httpd_spec.rb +291 -10
- data/spec/patterns/java_spec.rb +375 -0
- data/spec/patterns/junos_spec.rb +101 -0
- data/spec/patterns/maven_spec.rb +61 -0
- data/spec/patterns/mcollective_spec.rb +35 -0
- data/spec/patterns/mongodb_spec.rb +170 -33
- data/spec/patterns/nagios_spec.rb +299 -78
- data/spec/patterns/netscreen_spec.rb +123 -0
- data/spec/patterns/rails3_spec.rb +87 -29
- data/spec/patterns/redis_spec.rb +207 -0
- data/spec/patterns/shorewall_spec.rb +85 -74
- data/spec/patterns/squid_spec.rb +139 -0
- data/spec/patterns/syslog_spec.rb +266 -8
- data/spec/spec_helper.rb +83 -5
- metadata +74 -26
- data/patterns/aws +0 -11
- data/patterns/redis +0 -3
- data/spec/patterns/bro.rb +0 -126
- data/spec/patterns/s3_spec.rb +0 -132
@@ -0,0 +1,15 @@
|
|
1
|
+
HTTPDUSER %{EMAILADDRESS}|%{USER}
|
2
|
+
HTTPDERROR_DATE %{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}
|
3
|
+
|
4
|
+
# Log formats
|
5
|
+
HTTPD_COMMONLOG %{IPORHOST:clientip} %{HTTPDUSER:ident} %{HTTPDUSER:auth} \[%{HTTPDATE:timestamp}\] "(?:%{WORD:verb} %{NOTSPACE:request}(?: HTTP/%{NUMBER:httpversion})?|%{DATA:rawrequest})" (?:-|%{NUMBER:response}) (?:-|%{NUMBER:bytes})
|
6
|
+
HTTPD_COMBINEDLOG %{HTTPD_COMMONLOG} %{QS:referrer} %{QS:agent}
|
7
|
+
|
8
|
+
# Error logs
|
9
|
+
HTTPD20_ERRORLOG \[%{HTTPDERROR_DATE:timestamp}\] \[%{LOGLEVEL:loglevel}\] (?:\[client %{IPORHOST:clientip}\] ){0,1}%{GREEDYDATA:message}
|
10
|
+
HTTPD24_ERRORLOG \[%{HTTPDERROR_DATE:timestamp}\] \[(?:%{WORD:module})?:%{LOGLEVEL:loglevel}\] \[pid %{POSINT:pid}(:tid %{NUMBER:tid})?\]( \(%{POSINT:proxy_errorcode}\)%{DATA:proxy_message}:)?( \[client %{IPORHOST:clientip}:%{POSINT:clientport}\])?( %{DATA:errorcode}:)? %{GREEDYDATA:message}
|
11
|
+
HTTPD_ERRORLOG %{HTTPD20_ERRORLOG}|%{HTTPD24_ERRORLOG}
|
12
|
+
|
13
|
+
# Deprecated
|
14
|
+
COMMONAPACHELOG %{HTTPD_COMMONLOG}
|
15
|
+
COMBINEDAPACHELOG %{HTTPD_COMBINEDLOG}
|
@@ -1,15 +1,12 @@
|
|
1
1
|
JAVACLASS (?:[a-zA-Z$_][a-zA-Z$_0-9]*\.)*[a-zA-Z$_][a-zA-Z$_0-9]*
|
2
2
|
#Space is an allowed character to match special cases like 'Native Method' or 'Unknown Source'
|
3
|
-
JAVAFILE (?:[
|
3
|
+
JAVAFILE (?:[a-zA-Z$_0-9. -]+)
|
4
4
|
#Allow special <init>, <clinit> methods
|
5
5
|
JAVAMETHOD (?:(<(?:cl)?init>)|[a-zA-Z$_][a-zA-Z$_0-9]*)
|
6
6
|
#Line number is optional in special cases 'Native method' or 'Unknown source'
|
7
7
|
JAVASTACKTRACEPART %{SPACE}at %{JAVACLASS:class}\.%{JAVAMETHOD:method}\(%{JAVAFILE:file}(?::%{NUMBER:line})?\)
|
8
8
|
# Java Logs
|
9
9
|
JAVATHREAD (?:[A-Z]{2}-Processor[\d]+)
|
10
|
-
JAVACLASS (?:[a-zA-Z0-9-]+\.)+[A-Za-z0-9$]+
|
11
|
-
JAVAFILE (?:[A-Za-z0-9_.-]+)
|
12
|
-
JAVASTACKTRACEPART at %{JAVACLASS:class}\.%{WORD:method}\(%{JAVAFILE:file}:%{NUMBER:line}\)
|
13
10
|
JAVALOGMESSAGE (.*)
|
14
11
|
# MMM dd, yyyy HH:mm:ss eg: Jan 9, 2014 7:13:13 AM
|
15
12
|
CATALINA_DATESTAMP %{MONTH} %{MONTHDAY}, 20%{YEAR} %{HOUR}:?%{MINUTE}(?::?%{SECOND}) (?:AM|PM)
|
File without changes
|
@@ -11,6 +11,6 @@ SYSLOGLINE %{SYSLOGBASE2} %{GREEDYDATA:message}
|
|
11
11
|
# IETF 5424 syslog(8) format (see http://www.rfc-editor.org/info/rfc5424)
|
12
12
|
SYSLOG5424PRI <%{NONNEGINT:syslog5424_pri}>
|
13
13
|
SYSLOG5424SD \[%{DATA}\]+
|
14
|
-
SYSLOG5424BASE %{SYSLOG5424PRI}%{NONNEGINT:syslog5424_ver} +(?:%{TIMESTAMP_ISO8601:syslog5424_ts}|-) +(?:%{
|
14
|
+
SYSLOG5424BASE %{SYSLOG5424PRI}%{NONNEGINT:syslog5424_ver} +(?:%{TIMESTAMP_ISO8601:syslog5424_ts}|-) +(?:%{IPORHOST:syslog5424_host}|-) +(-|%{SYSLOG5424PRINTASCII:syslog5424_app}) +(-|%{SYSLOG5424PRINTASCII:syslog5424_proc}) +(-|%{SYSLOG5424PRINTASCII:syslog5424_msgid}) +(?:%{SYSLOG5424SD:syslog5424_sd}|-|)
|
15
15
|
|
16
16
|
SYSLOG5424LINE %{SYSLOG5424BASE} +%{GREEDYDATA:syslog5424_msg}
|
@@ -0,0 +1 @@
|
|
1
|
+
MAVEN_VERSION (?:(\d+)\.)?(?:(\d+)\.)?(\*|\d+)(?:[.-](RELEASE|SNAPSHOT))?
|
File without changes
|
File without changes
|
File without changes
|
@@ -89,7 +89,7 @@ NAGIOS_PASSIVE_HOST_CHECK %{NAGIOS_TYPE_PASSIVE_HOST_CHECK:nagios_type}: %{DATA:
|
|
89
89
|
NAGIOS_SERVICE_EVENT_HANDLER %{NAGIOS_TYPE_SERVICE_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_service};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
|
90
90
|
NAGIOS_HOST_EVENT_HANDLER %{NAGIOS_TYPE_HOST_EVENT_HANDLER:nagios_type}: %{DATA:nagios_hostname};%{DATA:nagios_state};%{DATA:nagios_statelevel};%{DATA:nagios_event_handler_name}
|
91
91
|
|
92
|
-
NAGIOS_TIMEPERIOD_TRANSITION %{NAGIOS_TYPE_TIMEPERIOD_TRANSITION:nagios_type}: %{DATA:nagios_service};%{
|
92
|
+
NAGIOS_TIMEPERIOD_TRANSITION %{NAGIOS_TYPE_TIMEPERIOD_TRANSITION:nagios_type}: %{DATA:nagios_service};%{NUMBER:nagios_unknown1};%{NUMBER:nagios_unknown2}
|
93
93
|
|
94
94
|
####################
|
95
95
|
#### External checks
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,4 @@
|
|
1
|
+
# Pattern squid3
|
2
|
+
# Documentation of squid3 logs formats can be found at the following link:
|
3
|
+
# http://wiki.squid-cache.org/Features/LogFormat
|
4
|
+
SQUID3 %{NUMBER:timestamp}\s+%{NUMBER:duration}\s%{IP:client_address}\s%{WORD:cache_result}/%{NONNEGINT:status_code}\s%{NUMBER:bytes}\s%{WORD:request_method}\s%{NOTSPACE:url}\s(%{NOTSPACE:user}|-)\s%{WORD:hierarchy_code}/(%{IPORHOST:server}|-)\s%{NOTSPACE:content_type}
|
@@ -0,0 +1,395 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require "spec_helper"
|
3
|
+
require "logstash/patterns/core"
|
4
|
+
|
5
|
+
describe_pattern "ELB_ACCESS_LOG", ['legacy', 'ecs-v1'] do
|
6
|
+
|
7
|
+
context "parsing an access log" do
|
8
|
+
|
9
|
+
let(:message) do
|
10
|
+
"2014-02-15T23:39:43.945958Z my-test-loadbalancer 192.168.131.39:2817 10.0.0.1:80 0.000073 0.001048 0.000057 200 200 0 29 \"GET http://www.example.com:80/ HTTP/1.1\""
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'matches' do
|
14
|
+
should include("timestamp" => "2014-02-15T23:39:43.945958Z" )
|
15
|
+
if ecs_compatibility?
|
16
|
+
expect(grok).to include("aws" => { "elb" => {
|
17
|
+
"name"=>"my-test-loadbalancer",
|
18
|
+
"request_processing_time"=>{"sec"=>0.000073},
|
19
|
+
"response_processing_time"=>{"sec"=>0.000057},
|
20
|
+
"backend_processing_time"=>{"sec"=>0.001048},
|
21
|
+
"backend"=>{
|
22
|
+
"ip"=>"10.0.0.1", "port"=>80,
|
23
|
+
"http"=>{"response"=>{"status_code"=>200}}
|
24
|
+
}
|
25
|
+
}})
|
26
|
+
expect(grok).to include("http"=>{
|
27
|
+
"request"=>{"body"=>{"bytes"=>0}, "method"=>"GET"},
|
28
|
+
"response"=>{"body"=>{"bytes"=>29}, "status_code"=>200},
|
29
|
+
"version"=>"1.1"
|
30
|
+
})
|
31
|
+
expect(grok).to include("source"=>{"ip"=>"192.168.131.39", "port"=>2817})
|
32
|
+
expect(grok).to include("url"=>{
|
33
|
+
"original"=>"http://www.example.com:80/",
|
34
|
+
"port"=>80, "path"=>"/", "domain"=>"www.example.com", "scheme"=>"http"
|
35
|
+
})
|
36
|
+
else
|
37
|
+
should include("elb" => "my-test-loadbalancer" )
|
38
|
+
should include("clientip" => "192.168.131.39" )
|
39
|
+
should include("clientport" => 2817 )
|
40
|
+
should include("backendip" => "10.0.0.1" )
|
41
|
+
should include("backendport" => 80 )
|
42
|
+
should include("request_processing_time" => 0.000073 )
|
43
|
+
should include("backend_processing_time" => 0.001048 )
|
44
|
+
should include("response_processing_time" => 0.000057 )
|
45
|
+
should include("response" => 200 )
|
46
|
+
should include("backend_response" => 200 )
|
47
|
+
should include("received_bytes" => 0 )
|
48
|
+
should include("bytes" => 29 )
|
49
|
+
should include("verb" => "GET" )
|
50
|
+
should include("request" => "http://www.example.com:80/" )
|
51
|
+
should include("proto" => "http" )
|
52
|
+
should include("httpversion" => "1.1" )
|
53
|
+
should include("urihost" => "www.example.com:80" )
|
54
|
+
should include("path" => "/" )
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
["tags", "params"].each do |attribute|
|
59
|
+
it "have #{attribute} as nil" do
|
60
|
+
expect(subject[attribute]).to be_nil
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context "parsing a PUT request access log with missing backend info" do
|
66
|
+
|
67
|
+
let(:message) do
|
68
|
+
'2015-04-10T08:11:09.865823Z us-west-1-production-media 49.150.87.133:55128 - -1 -1 -1 408 - 1294336 0 "PUT https://media.xxxyyyzzz.com:443/videos/F4_M-T4X0MM6Hvy1PFHesw HTTP/1.1"'
|
69
|
+
end
|
70
|
+
|
71
|
+
it "matches" do
|
72
|
+
expect(grok).to include("timestamp"=>"2015-04-10T08:11:09.865823Z")
|
73
|
+
if ecs_compatibility?
|
74
|
+
expect(grok).to include("url"=>{
|
75
|
+
"original"=>"https://media.xxxyyyzzz.com:443/videos/F4_M-T4X0MM6Hvy1PFHesw",
|
76
|
+
"scheme"=>"https", "port"=>443, "path"=>"/videos/F4_M-T4X0MM6Hvy1PFHesw", "domain"=>"media.xxxyyyzzz.com"
|
77
|
+
})
|
78
|
+
expect(grok).to include("source"=>{"port"=>55128, "ip"=>"49.150.87.133"})
|
79
|
+
expect(grok).to include("http"=>{
|
80
|
+
"request"=>{"method"=>"PUT", "body"=>{"bytes"=>1294336}}, "version"=>"1.1",
|
81
|
+
"response"=>{"body"=>{"bytes"=>0}, "status_code"=>408}
|
82
|
+
})
|
83
|
+
# no backend.ip and backend.port
|
84
|
+
# no backend.http.status.code
|
85
|
+
# no request_processing_time.sec and friends
|
86
|
+
expect(grok).to include("aws"=>{"elb"=>{"name"=>"us-west-1-production-media"}})
|
87
|
+
else
|
88
|
+
expect(grok).to include(
|
89
|
+
"elb"=>"us-west-1-production-media",
|
90
|
+
"clientip"=>"49.150.87.133", "clientport"=>55128,
|
91
|
+
"response_processing_time"=>-1.0,
|
92
|
+
"request_processing_time"=>-1.0,
|
93
|
+
"backend_processing_time"=>-1.0,
|
94
|
+
"response"=>408,
|
95
|
+
"received_bytes"=>1294336,
|
96
|
+
"bytes"=>0,
|
97
|
+
"verb"=>"PUT",
|
98
|
+
"request"=>"https://media.xxxyyyzzz.com:443/videos/F4_M-T4X0MM6Hvy1PFHesw",
|
99
|
+
"port"=>"443", "proto"=>"https", "path"=>"/videos/F4_M-T4X0MM6Hvy1PFHesw", "urihost"=>"media.xxxyyyzzz.com:443",
|
100
|
+
"httpversion"=>"1.1")
|
101
|
+
|
102
|
+
expect(grok.keys).to_not include("backendip", "backendport", "backendresponse")
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
|
108
|
+
context '(new) https format' do # slightly longer - 3 fields added at the end
|
109
|
+
|
110
|
+
let(:message) do
|
111
|
+
'2015-05-13T23:39:43.945958Z my-loadbalancer 192.168.131.39:2817 10.0.0.1:80 0.000086 0.001048 0.001337 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.38.0 (#56-0ef1d4a5)" DHE-RSA-AES128-SHA TLSv1.2'
|
112
|
+
end
|
113
|
+
|
114
|
+
it 'matches (new) suffix fields' do
|
115
|
+
if ecs_compatibility?
|
116
|
+
expect(grok).to include "tls" => { "cipher" => "DHE-RSA-AES128-SHA" }
|
117
|
+
expect(grok).to include "aws" => { "elb" => hash_including("ssl_protocol" => 'TLSv1.2')}
|
118
|
+
expect(grok).to include "user_agent"=>{"original"=>"curl/7.38.0 (#56-0ef1d4a5)"}
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context 'with optional fields' do
|
123
|
+
|
124
|
+
let(:message) do
|
125
|
+
'2015-05-13T23:39:43.945958Z my-loadbalancer 192.168.131.39:2817 10.0.0.1:80 0.000086 0.001048 0.001337 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "-" - -'
|
126
|
+
end
|
127
|
+
|
128
|
+
it 'matches (new) suffix fields' do
|
129
|
+
if ecs_compatibility?
|
130
|
+
expect(grok.keys).to_not include "tls"
|
131
|
+
expect(grok['aws']['elb'].keys).to_not include "ssl_protocol"
|
132
|
+
expect(grok.keys).to_not include "user_agent"
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
describe_pattern "S3_ACCESS_LOG", ['legacy', 'ecs-v1'] do
|
142
|
+
|
143
|
+
context "parsing GET.VERSIONING message" do
|
144
|
+
|
145
|
+
let(:message) do
|
146
|
+
"79a5 mybucket [06/Feb/2014:00:00:38 +0000] 192.0.2.3 79a5 3E57427F3EXAMPLE REST.GET.VERSIONING - \"GET /mybucket?versioning HTTP/1.1\" 200 - 113 - 7 - \"-\" \"S3Console/0.4\" -"
|
147
|
+
end
|
148
|
+
|
149
|
+
it { should include("owner" => "79a5" ) unless ecs_compatibility? }
|
150
|
+
it { should include("bucket" => "mybucket" ) unless ecs_compatibility? }
|
151
|
+
it { should include("timestamp" => "06/Feb/2014:00:00:38 +0000" ) unless ecs_compatibility? }
|
152
|
+
it { should include("clientip" => "192.0.2.3" ) unless ecs_compatibility? }
|
153
|
+
it { should include("requester" => "79a5" ) unless ecs_compatibility? }
|
154
|
+
it { should include("request_id" => "3E57427F3EXAMPLE" ) unless ecs_compatibility? }
|
155
|
+
it { should include("operation" => "REST.GET.VERSIONING" ) unless ecs_compatibility? }
|
156
|
+
it { should include("key" => "-" ) unless ecs_compatibility? }
|
157
|
+
|
158
|
+
it { should include("verb" => "GET" ) unless ecs_compatibility? }
|
159
|
+
it { should include("request" => "/mybucket?versioning" ) unless ecs_compatibility? }
|
160
|
+
it { should include("httpversion" => "1.1" ) unless ecs_compatibility? }
|
161
|
+
it { should include("response" => 200 ) unless ecs_compatibility? }
|
162
|
+
it { should include("bytes" => 113 ) unless ecs_compatibility? }
|
163
|
+
|
164
|
+
it { should include("request_time_ms" => 7 ) unless ecs_compatibility? }
|
165
|
+
it { should include("referrer" => "\"-\"" ) unless ecs_compatibility? }
|
166
|
+
it { should include("agent" => "\"S3Console/0.4\"" ) unless ecs_compatibility? }
|
167
|
+
|
168
|
+
["tags", "error_code", "object_size", "turnaround_time_ms", "version_id"].each do |attribute|
|
169
|
+
it "have #{attribute} as nil" do
|
170
|
+
expect(subject[attribute]).to be_nil unless ecs_compatibility?
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
end
|
175
|
+
|
176
|
+
context "parsing a GET.OBJECT message" do
|
177
|
+
|
178
|
+
let(:message) do
|
179
|
+
"79a5 mybucket [12/May/2014:07:54:01 +0000] 10.0.1.2 - 7ACC4BE89EXAMPLE REST.GET.OBJECT foo/bar.html \"GET /foo/bar.html HTTP/1.1\" 304 - - 1718 10 - \"-\" \"Mozilla/5.0\" -"
|
180
|
+
end
|
181
|
+
|
182
|
+
it do
|
183
|
+
if ecs_compatibility?
|
184
|
+
should include("aws"=>{"s3access"=>hash_including("bucket_owner" => "79a5")})
|
185
|
+
else
|
186
|
+
should include("owner" => "79a5")
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
it { should include("bucket" => "mybucket" ) unless ecs_compatibility? }
|
191
|
+
it { should include("timestamp" => "12/May/2014:07:54:01 +0000" ) }
|
192
|
+
|
193
|
+
it { should include("clientip" => "10.0.1.2" ) unless ecs_compatibility? }
|
194
|
+
it { should include("requester" => "-" ) unless ecs_compatibility? }
|
195
|
+
it { should include("client" => { 'ip' => '10.0.1.2' } ) if ecs_compatibility? }
|
196
|
+
|
197
|
+
it { should include("request_id" => "7ACC4BE89EXAMPLE" ) unless ecs_compatibility? }
|
198
|
+
it { should include("operation" => "REST.GET.OBJECT" ) unless ecs_compatibility? }
|
199
|
+
|
200
|
+
it do
|
201
|
+
if ecs_compatibility?
|
202
|
+
should include("aws"=>{"s3access"=>hash_including("key" => "foo/bar.html")})
|
203
|
+
else
|
204
|
+
should include("key" => "foo/bar.html")
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
it { should include("verb" => "GET" ) unless ecs_compatibility? }
|
209
|
+
it { should include("request" => "/foo/bar.html" ) unless ecs_compatibility? }
|
210
|
+
it { should include("httpversion" => "1.1" ) unless ecs_compatibility? }
|
211
|
+
it { should include("response" => 304 ) unless ecs_compatibility? }
|
212
|
+
it { should include("object_size" => 1718 ) unless ecs_compatibility? }
|
213
|
+
|
214
|
+
it { should include("request_time_ms" => 10 ) unless ecs_compatibility? }
|
215
|
+
it { should include("referrer" => "\"-\"" ) unless ecs_compatibility? }
|
216
|
+
|
217
|
+
it { should include("agent" => "\"Mozilla/5.0\"" ) unless ecs_compatibility? }
|
218
|
+
it { should include("user_agent"=>{"original"=>"Mozilla/5.0"}) if ecs_compatibility? }
|
219
|
+
|
220
|
+
["tags", "error_code", "turnaround_time_ms", "version_id", "bytes"].each do |attribute|
|
221
|
+
it "have #{attribute} as nil" do
|
222
|
+
expect(subject[attribute]).to be_nil unless ecs_compatibility?
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
end
|
227
|
+
|
228
|
+
context 'a long line' do
|
229
|
+
|
230
|
+
let(:message) do
|
231
|
+
'79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be awsexamplebucket1 [06/Feb/2019:00:00:38 +0000] ' +
|
232
|
+
'192.0.2.3 arn:aws:iam::123456:user/test@elastic.co A1206F460EXAMPLE REST.GET.BUCKETPOLICY - ' +
|
233
|
+
'"GET /awsexamplebucket1?policy HTTP/1.1" 404 NoSuchBucketPolicy 297 - 38 12 "-" ' +
|
234
|
+
'"AWS-Support-TrustedAdvisor, aws-internal/3 aws-sdk-java/1.11.590 Linux/4.9.137-0.1.ac.218.74.329.metal1.x86_64" - ' +
|
235
|
+
'BNaBsXZQQDbssi6xMBdBU2sLt+Yf5kZDmeBUP35sFoKa3sLLeMC78iwEIWxs99CRUrbS4n11234= SigV2 ECDHE-RSA-AES128-GCM-SHA256 ' +
|
236
|
+
'AuthHeader awsexamplebucket1.s3.us-west-1.amazonaws.com TLSV1.1'
|
237
|
+
end
|
238
|
+
|
239
|
+
it 'matches' do
|
240
|
+
if ecs_compatibility?
|
241
|
+
expect(grok).to include("client"=>{"ip"=>"192.0.2.3", "user"=>{"id"=>"arn:aws:iam::123456:user/test@elastic.co"}})
|
242
|
+
expect(grok).to include("http"=>{"request"=>{"method"=>"GET"}, "version"=>"1.1", "response"=>{"status_code"=>404}})
|
243
|
+
expect(grok).to include("url"=>{"original"=>"/awsexamplebucket1?policy"})
|
244
|
+
expect(grok).to include("aws"=>{"s3access"=>{
|
245
|
+
"bucket_owner"=>"79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be",
|
246
|
+
"bucket"=>"awsexamplebucket1",
|
247
|
+
"request_id"=>"A1206F460EXAMPLE",
|
248
|
+
"operation"=>"REST.GET.BUCKETPOLICY",
|
249
|
+
"turn_around_time"=>12,
|
250
|
+
"bytes_sent"=>297,
|
251
|
+
"request_uri"=>"GET /awsexamplebucket1?policy HTTP/1.1", # NOTE: redundant (beats compatibility)
|
252
|
+
"error_code"=>"NoSuchBucketPolicy",
|
253
|
+
"total_time" => 38,
|
254
|
+
# these fields weren't matched in legacy mode:
|
255
|
+
# Host Id -> Signature Version -> Cipher Suite -> Authentication Type -> Host Header -> TLS version
|
256
|
+
"host_id" => "BNaBsXZQQDbssi6xMBdBU2sLt+Yf5kZDmeBUP35sFoKa3sLLeMC78iwEIWxs99CRUrbS4n11234=",
|
257
|
+
"signature_version" => "SigV2",
|
258
|
+
#"cipher_suite" => "ECDHE-RSA-AES128-GCM-SHA256", # tls.cipher
|
259
|
+
"authentication_type" => "AuthHeader",
|
260
|
+
"host_header" => "awsexamplebucket1.s3.us-west-1.amazonaws.com",
|
261
|
+
"tls_version" => "TLSV1.1"
|
262
|
+
}})
|
263
|
+
expect(grok).to include("tls"=>{"cipher"=>"ECDHE-RSA-AES128-GCM-SHA256"})
|
264
|
+
expect(grok).to include("user_agent"=>{
|
265
|
+
"original"=>"AWS-Support-TrustedAdvisor, aws-internal/3 aws-sdk-java/1.11.590 Linux/4.9.137-0.1.ac.218.74.329.metal1.x86_64"
|
266
|
+
})
|
267
|
+
else
|
268
|
+
expect(grok).to include("owner"=>"79a59df900b949e55d96a1e698fbacedfd6e09d98eacf8f8d5218e7cd47ef2be",
|
269
|
+
"bucket"=>"awsexamplebucket1",
|
270
|
+
"timestamp"=>"06/Feb/2019:00:00:38 +0000",
|
271
|
+
"clientip"=>"192.0.2.3",
|
272
|
+
"requester"=>"arn:aws:iam::123456:user/test@elastic.co",
|
273
|
+
"request_id"=>"A1206F460EXAMPLE",
|
274
|
+
"operation"=>"REST.GET.BUCKETPOLICY",
|
275
|
+
"key"=>"-",
|
276
|
+
"verb"=>"GET",
|
277
|
+
"request"=>"/awsexamplebucket1?policy",
|
278
|
+
"httpversion"=>"1.1",
|
279
|
+
"response"=>404,
|
280
|
+
"error_code"=>"NoSuchBucketPolicy",
|
281
|
+
"bytes"=>297,
|
282
|
+
# object_size nil
|
283
|
+
"request_time_ms"=>38,
|
284
|
+
"turnaround_time_ms"=>12,
|
285
|
+
"referrer"=>"\"-\"",
|
286
|
+
"agent"=>"\"AWS-Support-TrustedAdvisor, aws-internal/3 aws-sdk-java/1.11.590 Linux/4.9.137-0.1.ac.218.74.329.metal1.x86_64\"")
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
describe_pattern "CLOUDFRONT_ACCESS_LOG", ['legacy', 'ecs-v1'] do
|
294
|
+
|
295
|
+
let(:message) do
|
296
|
+
"2016-06-10 18:41:39 IAD53 224281 192.168.1.1 GET d27enomp470abc.cloudfront.net /content/sample/thing.pdf 200 https://example.com/ Mozilla/5.0%2520(Windows%2520NT%25206.1;%2520WOW64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/51.0.2704.79%2520Safari/537.36 - - Miss UGskZ6dUKY7b4C6Pt7wAWVsU2KO-vTRe-mR4r9H-WQMjhNvY6w1Xcg== host.example.com https 883 0.036 - TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 RefreshHit"
|
297
|
+
end
|
298
|
+
|
299
|
+
it 'matches' do
|
300
|
+
should include("timestamp" => "2016-06-10 18:41:39" )
|
301
|
+
|
302
|
+
if ecs_compatibility?
|
303
|
+
should include("aws"=>{"cloudfront"=>hash_including("x_edge_location"=>"IAD53")})
|
304
|
+
should include("destination"=>{"bytes"=>224281})
|
305
|
+
should include("source"=>{"ip"=>"192.168.1.1", "bytes"=>883})
|
306
|
+
should include("http"=>{
|
307
|
+
"request"=>{"method"=>"GET", "referrer"=>"https://example.com/"},
|
308
|
+
"response"=>{"status_code"=>200}
|
309
|
+
})
|
310
|
+
should include("user_agent"=>{"original"=>"Mozilla/5.0%2520(Windows%2520NT%25206.1;%2520WOW64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/51.0.2704.79%2520Safari/537.36"})
|
311
|
+
should include("url"=>{"domain"=>"d27enomp470abc.cloudfront.net", "path"=>"/content/sample/thing.pdf"})
|
312
|
+
should include("aws"=>{"cloudfront"=>hash_including("x_edge_result_type"=>"Miss")})
|
313
|
+
should include("aws"=>{"cloudfront"=>hash_including("x_edge_request_id"=>'UGskZ6dUKY7b4C6Pt7wAWVsU2KO-vTRe-mR4r9H-WQMjhNvY6w1Xcg==')})
|
314
|
+
should include("network"=>{"protocol"=>"https"})
|
315
|
+
should include("aws"=>{"cloudfront"=>hash_including("http"=>{"request"=>{"host"=>"host.example.com"}})})
|
316
|
+
should include("aws"=>{"cloudfront"=>hash_including("time_taken"=>0.036)})
|
317
|
+
should include("aws"=>{"cloudfront"=>hash_including("ssl_protocol"=>"TLSv1.2")})
|
318
|
+
should include("tls"=>{"cipher"=>"ECDHE-RSA-AES128-GCM-SHA256"})
|
319
|
+
should include("aws"=>{"cloudfront"=>hash_including("x_edge_response_result_type"=>"RefreshHit")})
|
320
|
+
else
|
321
|
+
should include("x_edge_location" => "IAD53" )
|
322
|
+
should include("sc_bytes" => 224281 )
|
323
|
+
should include("clientip" => "192.168.1.1" )
|
324
|
+
should include("cs_method" => "GET" )
|
325
|
+
should include("cs_host" => "d27enomp470abc.cloudfront.net" )
|
326
|
+
should include("cs_uri_stem" => "/content/sample/thing.pdf" )
|
327
|
+
should include("sc_status" => 200 )
|
328
|
+
should include("referrer" => "https://example.com/" )
|
329
|
+
should include("agent" => "Mozilla/5.0%2520(Windows%2520NT%25206.1;%2520WOW64)%2520AppleWebKit/537.36%2520(KHTML,%2520like%2520Gecko)%2520Chrome/51.0.2704.79%2520Safari/537.36" )
|
330
|
+
should include("cs_uri_query" => "-" )
|
331
|
+
should include("cookies" => "-" )
|
332
|
+
should include("x_edge_result_type" => "Miss" )
|
333
|
+
should include("x_edge_request_id" => "UGskZ6dUKY7b4C6Pt7wAWVsU2KO-vTRe-mR4r9H-WQMjhNvY6w1Xcg==" )
|
334
|
+
should include("x_host_header" => "host.example.com" )
|
335
|
+
should include("cs_protocol" => "https" )
|
336
|
+
should include("cs_bytes" => 883 )
|
337
|
+
should include("time_taken" => 0.036 )
|
338
|
+
should include("x_forwarded_for" => "-" )
|
339
|
+
should include("ssl_protocol" => "TLSv1.2" )
|
340
|
+
should include("ssl_cipher" => "ECDHE-RSA-AES128-GCM-SHA256" )
|
341
|
+
should include("x_edge_response_result_type" => "RefreshHit" )
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
["tags", "params"].each do |attribute|
|
346
|
+
it "have #{attribute} as nil" do
|
347
|
+
expect(subject[attribute]).to be_nil
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
context 'version 1.0' do # more fields at the end
|
352
|
+
|
353
|
+
let(:message) do
|
354
|
+
# Version: 1.0 - https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html
|
355
|
+
# 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 time-taken x-forwarded-for ssl-protocol ssl-cipher x-edge-response-result-type cs-protocol-version fle-status fle-encrypted-fields c-port time-to-first-byte x-edge-detailed-result-type sc-content-type sc-content-len sc-range-start sc-range-end
|
356
|
+
"2019-12-04 21:02:31 LAX1 392 192.0.2.100 GET d111111abcdef8.cloudfront.net /index.html 200 - Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36 - - Hit SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ== d111111abcdef8.cloudfront.net https 23 0.001 - TLSv1.2 ECDHE-RSA-AES128-GCM-SHA256 Hit HTTP/2.0 - - 11040 0.001 Hit text/html 78 - -"
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'matches' do
|
360
|
+
should include("timestamp" => "2019-12-04\t21:02:31")
|
361
|
+
|
362
|
+
if ecs_compatibility?
|
363
|
+
should include("destination"=>{"bytes"=>392}, "source"=>{"ip"=>"192.0.2.100", "bytes"=>23, "port"=>11040}) # source.port not matched in legacy mode
|
364
|
+
should include("url"=>{"domain"=>"d111111abcdef8.cloudfront.net", "path"=>"/index.html"})
|
365
|
+
should include("http"=>hash_including("request"=>{"mime_type"=>"text/html", "method"=>"GET"}, "response"=>{"status_code"=>200})) # mime_type not matched in legacy mode
|
366
|
+
should include("user_agent"=>{"original"=>"Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36"})
|
367
|
+
should include("tls"=>{"cipher"=>"ECDHE-RSA-AES128-GCM-SHA256"})
|
368
|
+
should include("network"=>{"protocol"=>"https"})
|
369
|
+
|
370
|
+
should include("http"=>hash_including("version"=>"2.0"))
|
371
|
+
should include("aws"=>{"cloudfront"=>{
|
372
|
+
"x_edge_location"=>"LAX1",
|
373
|
+
"x_edge_request_id"=>"SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ==", # event.id
|
374
|
+
"x_edge_result_type"=>"Hit",
|
375
|
+
"x_edge_response_result_type"=>"Hit",
|
376
|
+
"x_edge_detailed_result_type"=>"Hit", # not captured in legacy mode
|
377
|
+
"time_taken"=>0.001,
|
378
|
+
"time_to_first_byte"=>0.001, # not captured in legacy mode
|
379
|
+
"http"=>{"request"=>{"host"=>"d111111abcdef8.cloudfront.net", "size"=>78}}, # http.request.size not captured in legacy mode
|
380
|
+
"ssl_protocol"=>"TLSv1.2",
|
381
|
+
}})
|
382
|
+
else
|
383
|
+
should include("cs_method"=>"GET", "cs_host"=>"d111111abcdef8.cloudfront.net", "cs_uri_stem"=>"/index.html", "cs_protocol"=>"https", "cs_bytes"=>23)
|
384
|
+
should include("x_host_header"=>"d111111abcdef8.cloudfront.net")
|
385
|
+
should include("time_taken"=>0.001)
|
386
|
+
should include("x_edge_request_id"=>"SOX4xwn4XV6Q4rgb7XiVGOHms_BGlTAC4KyHmureZmBNrjGdRLiNIQ==")
|
387
|
+
should include("agent"=>"Mozilla/5.0%20(Windows%20NT%2010.0;%20Win64;%20x64)%20AppleWebKit/537.36%20(KHTML,%20like%20Gecko)%20Chrome/78.0.3904.108%20Safari/537.36")
|
388
|
+
|
389
|
+
should include("x_forwarded_for"=>"text/html") # TODO the legacy pattern does not handle the long(er) format correctly
|
390
|
+
end
|
391
|
+
end
|
392
|
+
|
393
|
+
end
|
394
|
+
|
395
|
+
end
|