1
1
# frozen_string_literal: true
2
2
3
3
require_relative '../../../instrumentation/gateway'
4
- require_relative '../../../reactive/engine'
5
- require_relative '../reactive/request'
6
- require_relative '../reactive/request_body'
7
- require_relative '../reactive/response'
8
4
require_relative '../../../event'
9
5
10
6
module Datadog
@@ -25,95 +21,91 @@ def watch
25
21
26
22
def watch_request ( gateway = Instrumentation . gateway )
27
23
gateway . watch ( 'rack.request' , :appsec ) do |stack , gateway_request |
28
- event = nil
29
24
context = gateway_request . env [ Datadog ::AppSec ::Ext ::CONTEXT_KEY ]
30
- engine = AppSec ::Reactive ::Engine . new
31
-
32
- Rack ::Reactive ::Request . subscribe ( engine , context ) do |result |
33
- if result . match?
34
- # TODO: should this hash be an Event instance instead?
35
- event = {
36
- waf_result : result ,
37
- trace : context . trace ,
38
- span : context . span ,
39
- request : gateway_request ,
40
- actions : result . actions
41
- }
42
-
43
- # We want to keep the trace in case of security event
44
- context . trace . keep! if context . trace
45
- Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
46
- context . events << event
47
-
48
- Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
49
- end
50
- end
51
25
52
- Rack ::Reactive ::Request . publish ( engine , gateway_request )
26
+ persistent_data = {
27
+ 'server.request.cookies' => gateway_request . cookies ,
28
+ 'server.request.query' => gateway_request . query ,
29
+ 'server.request.uri.raw' => gateway_request . fullpath ,
30
+ 'server.request.headers' => gateway_request . headers ,
31
+ 'server.request.headers.no_cookies' => gateway_request . headers . dup . tap { |h | h . delete ( 'cookie' ) } ,
32
+ 'http.client_ip' => gateway_request . client_ip ,
33
+ 'server.request.method' => gateway_request . method
34
+ }
35
+
36
+ result = context . run_waf ( persistent_data , { } , Datadog . configuration . appsec . waf_timeout )
37
+
38
+ if result . match?
39
+ Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
40
+
41
+ context . events << {
42
+ waf_result : result ,
43
+ trace : context . trace ,
44
+ span : context . span ,
45
+ request : gateway_request ,
46
+ actions : result . actions
47
+ }
48
+
49
+ Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
50
+ end
53
51
54
52
stack . call ( gateway_request . request )
55
53
end
56
54
end
57
55
58
56
def watch_response ( gateway = Instrumentation . gateway )
59
57
gateway . watch ( 'rack.response' , :appsec ) do |stack , gateway_response |
60
- event = nil
61
58
context = gateway_response . context
62
- engine = AppSec ::Reactive ::Engine . new
63
-
64
- Rack ::Reactive ::Response . subscribe ( engine , context ) do |result |
65
- if result . match?
66
- # TODO: should this hash be an Event instance instead?
67
- event = {
68
- waf_result : result ,
69
- trace : context . trace ,
70
- span : context . span ,
71
- response : gateway_response ,
72
- actions : result . actions
73
- }
74
-
75
- # We want to keep the trace in case of security event
76
- context . trace . keep! if context . trace
77
- Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
78
- context . events << event
79
-
80
- Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
81
- end
82
- end
83
59
84
- Rack ::Reactive ::Response . publish ( engine , gateway_response )
60
+ persistent_data = {
61
+ 'server.response.status' => gateway_response . status . to_s ,
62
+ 'server.response.headers' => gateway_response . headers ,
63
+ 'server.response.headers.no_cookies' => gateway_response . headers . dup . tap { |h | h . delete ( 'set-cookie' ) }
64
+ }
65
+
66
+ result = context . run_waf ( persistent_data , { } , Datadog . configuration . appsec . waf_timeout )
67
+
68
+ if result . match?
69
+ Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
70
+
71
+ context . events << {
72
+ waf_result : result ,
73
+ trace : context . trace ,
74
+ span : context . span ,
75
+ response : gateway_response ,
76
+ actions : result . actions
77
+ }
78
+
79
+ Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
80
+ end
85
81
86
82
stack . call ( gateway_response . response )
87
83
end
88
84
end
89
85
90
86
def watch_request_body ( gateway = Instrumentation . gateway )
91
87
gateway . watch ( 'rack.request.body' , :appsec ) do |stack , gateway_request |
92
- event = nil
93
88
context = gateway_request . env [ Datadog ::AppSec ::Ext ::CONTEXT_KEY ]
94
- engine = AppSec ::Reactive ::Engine . new
95
-
96
- Rack ::Reactive ::RequestBody . subscribe ( engine , context ) do |result |
97
- if result . match?
98
- # TODO: should this hash be an Event instance instead?
99
- event = {
100
- waf_result : result ,
101
- trace : context . trace ,
102
- span : context . span ,
103
- request : gateway_request ,
104
- actions : result . actions
105
- }
106
-
107
- # We want to keep the trace in case of security event
108
- context . trace . keep! if context . trace
109
- Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
110
- context . events << event
111
-
112
- Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
113
- end
114
- end
115
89
116
- Rack ::Reactive ::RequestBody . publish ( engine , gateway_request )
90
+ persistent_data = {
91
+ 'server.request.body' => gateway_request . form_hash
92
+ }
93
+
94
+ result = context . run_waf ( persistent_data , { } , Datadog . configuration . appsec . waf_timeout )
95
+
96
+ if result . match?
97
+ Datadog ::AppSec ::Event . tag_and_keep! ( context , result )
98
+
99
+ context . events << {
100
+ waf_result : result ,
101
+ trace : context . trace ,
102
+ span : context . span ,
103
+ request : gateway_request ,
104
+ actions : result . actions
105
+ }
106
+
107
+ Datadog ::AppSec ::ActionsHandler . handle ( result . actions )
108
+ end
117
109
118
110
stack . call ( gateway_request . request )
119
111
end
0 commit comments