6
6
*/
7
7
8
8
import { EcsVersion } from '@elastic/ecs' ;
9
+ import { Alert } from '@kbn/alerts-as-data-utils' ;
9
10
import { AuthenticatedUser } from '@kbn/core/server' ;
10
11
import {
11
12
ATTACK_DISCOVERY_AD_HOC_RULE_ID ,
12
13
ATTACK_DISCOVERY_AD_HOC_RULE_TYPE_ID ,
13
14
type CreateAttackDiscoveryAlertsParams ,
14
15
replaceAnonymizedValuesWithOriginalValues ,
16
+ AttackDiscovery ,
15
17
} from '@kbn/elastic-assistant-common' ;
16
18
import {
17
19
ALERT_INSTANCE_ID ,
@@ -55,6 +57,80 @@ import {
55
57
} from '../../../schedules/fields/field_names' ;
56
58
import { AttackDiscoveryAlertDocument } from '../../../schedules/types' ;
57
59
60
+ type AttackDiscoveryAlertDocumentBase = Omit < AttackDiscoveryAlertDocument , keyof Alert > ;
61
+
62
+ export const transformToBaseAlertDocument = ( {
63
+ attackDiscovery,
64
+ alertsParams,
65
+ } : {
66
+ attackDiscovery : AttackDiscovery ;
67
+ alertsParams : Omit < CreateAttackDiscoveryAlertsParams , 'attackDiscoveries' | 'generationUuid' > ;
68
+ } ) : AttackDiscoveryAlertDocumentBase => {
69
+ const { alertsContextCount, anonymizedAlerts, apiConfig, connectorName, replacements } =
70
+ alertsParams ;
71
+
72
+ const {
73
+ alertIds,
74
+ entitySummaryMarkdown,
75
+ detailsMarkdown,
76
+ mitreAttackTactics,
77
+ summaryMarkdown,
78
+ title,
79
+ } = attackDiscovery ;
80
+
81
+ return {
82
+ // Alert base fields
83
+ [ ECS_VERSION ] : EcsVersion ,
84
+ [ ALERT_RISK_SCORE ] : getAlertRiskScore ( {
85
+ alertIds,
86
+ anonymizedAlerts,
87
+ } ) ,
88
+
89
+ // Attack discovery fields
90
+ [ ALERT_ATTACK_DISCOVERY_ALERT_IDS ] : alertIds ,
91
+ [ ALERT_ATTACK_DISCOVERY_ALERTS_CONTEXT_COUNT ] : alertsContextCount ,
92
+ [ ALERT_ATTACK_DISCOVERY_API_CONFIG ] : {
93
+ action_type_id : apiConfig . actionTypeId ,
94
+ connector_id : apiConfig . connectorId ,
95
+ model : apiConfig . model ,
96
+ name : connectorName ,
97
+ provider : apiConfig . provider ,
98
+ } ,
99
+ [ ALERT_ATTACK_DISCOVERY_DETAILS_MARKDOWN ] : detailsMarkdown ,
100
+ [ ALERT_ATTACK_DISCOVERY_DETAILS_MARKDOWN_WITH_REPLACEMENTS ] :
101
+ replaceAnonymizedValuesWithOriginalValues ( {
102
+ messageContent : detailsMarkdown ,
103
+ replacements,
104
+ } ) ,
105
+ [ ALERT_ATTACK_DISCOVERY_ENTITY_SUMMARY_MARKDOWN ] : entitySummaryMarkdown ,
106
+ [ ALERT_ATTACK_DISCOVERY_ENTITY_SUMMARY_MARKDOWN_WITH_REPLACEMENTS ] :
107
+ entitySummaryMarkdown != null
108
+ ? replaceAnonymizedValuesWithOriginalValues ( {
109
+ messageContent : entitySummaryMarkdown ,
110
+ replacements,
111
+ } )
112
+ : undefined ,
113
+ [ ALERT_ATTACK_DISCOVERY_MITRE_ATTACK_TACTICS ] : mitreAttackTactics ,
114
+ [ ALERT_ATTACK_DISCOVERY_REPLACEMENTS ] : ! isEmpty ( replacements )
115
+ ? Object . entries ( replacements ) . map ( ( [ uuid , value ] ) => ( {
116
+ uuid,
117
+ value,
118
+ } ) )
119
+ : undefined ,
120
+ [ ALERT_ATTACK_DISCOVERY_SUMMARY_MARKDOWN ] : summaryMarkdown ,
121
+ [ ALERT_ATTACK_DISCOVERY_SUMMARY_MARKDOWN_WITH_REPLACEMENTS ] :
122
+ replaceAnonymizedValuesWithOriginalValues ( {
123
+ messageContent : summaryMarkdown ,
124
+ replacements,
125
+ } ) ,
126
+ [ ALERT_ATTACK_DISCOVERY_TITLE ] : title ,
127
+ [ ALERT_ATTACK_DISCOVERY_TITLE_WITH_REPLACEMENTS ] : replaceAnonymizedValuesWithOriginalValues ( {
128
+ messageContent : title ,
129
+ replacements,
130
+ } ) ,
131
+ } ;
132
+ } ;
133
+
58
134
export const transformToAlertDocuments = ( {
59
135
authenticatedUser,
60
136
createAttackDiscoveryAlertsParams,
@@ -66,102 +142,42 @@ export const transformToAlertDocuments = ({
66
142
now : Date ;
67
143
spaceId : string ;
68
144
} ) : AttackDiscoveryAlertDocument [ ] => {
69
- const {
70
- alertsContextCount,
71
- anonymizedAlerts,
72
- apiConfig,
73
- attackDiscoveries,
74
- connectorName,
75
- generationUuid,
76
- replacements,
77
- } = createAttackDiscoveryAlertsParams ;
145
+ const { attackDiscoveries, generationUuid, ...restParams } = createAttackDiscoveryAlertsParams ;
78
146
79
- const replacementsOrEmpty = replacements ?? { } ;
147
+ return attackDiscoveries . map ( ( attackDiscovery ) => {
148
+ const alertUuid = uuidv4 ( ) ;
80
149
81
- return attackDiscoveries . map (
82
- ( {
83
- alertIds,
84
- entitySummaryMarkdown,
85
- detailsMarkdown,
86
- mitreAttackTactics,
87
- summaryMarkdown,
88
- title,
89
- } ) => {
90
- const alertUuid = uuidv4 ( ) ;
150
+ const baseAlertDocument = transformToBaseAlertDocument ( {
151
+ attackDiscovery,
152
+ alertsParams : restParams ,
153
+ } ) ;
154
+
155
+ return {
156
+ ...baseAlertDocument ,
91
157
92
- return {
93
- '@timestamp' : now . toISOString ( ) ,
94
- [ ALERT_ATTACK_DISCOVERY_ALERT_IDS ] : alertIds ,
95
- [ ALERT_ATTACK_DISCOVERY_ALERTS_CONTEXT_COUNT ] : alertsContextCount ,
96
- [ ALERT_ATTACK_DISCOVERY_API_CONFIG ] : {
97
- action_type_id : apiConfig . actionTypeId ,
98
- connector_id : apiConfig . connectorId ,
99
- model : apiConfig . model ,
100
- name : connectorName ,
101
- provider : apiConfig . provider ,
158
+ '@timestamp' : now . toISOString ( ) ,
159
+ [ ALERT_ATTACK_DISCOVERY_USER_ID ] : authenticatedUser . profile_uid ,
160
+ [ ALERT_ATTACK_DISCOVERY_USER_NAME ] : authenticatedUser . username ,
161
+ [ ALERT_ATTACK_DISCOVERY_USERS ] : [
162
+ {
163
+ id : authenticatedUser . profile_uid ,
164
+ name : authenticatedUser . username ,
102
165
} ,
103
- [ ALERT_ATTACK_DISCOVERY_DETAILS_MARKDOWN ] : detailsMarkdown ,
104
- [ ALERT_ATTACK_DISCOVERY_DETAILS_MARKDOWN_WITH_REPLACEMENTS ] :
105
- replaceAnonymizedValuesWithOriginalValues ( {
106
- messageContent : detailsMarkdown ,
107
- replacements : replacementsOrEmpty ,
108
- } ) ,
109
- [ ALERT_ATTACK_DISCOVERY_ENTITY_SUMMARY_MARKDOWN ] : entitySummaryMarkdown ,
110
- [ ALERT_ATTACK_DISCOVERY_ENTITY_SUMMARY_MARKDOWN_WITH_REPLACEMENTS ] :
111
- entitySummaryMarkdown != null
112
- ? replaceAnonymizedValuesWithOriginalValues ( {
113
- messageContent : entitySummaryMarkdown ,
114
- replacements : replacementsOrEmpty ,
115
- } )
116
- : undefined ,
117
- [ ALERT_ATTACK_DISCOVERY_MITRE_ATTACK_TACTICS ] : mitreAttackTactics ,
118
- [ ALERT_ATTACK_DISCOVERY_REPLACEMENTS ] : ! isEmpty ( replacementsOrEmpty )
119
- ? Object . entries ( replacementsOrEmpty ) . map ( ( [ uuid , value ] ) => ( {
120
- uuid,
121
- value,
122
- } ) )
123
- : undefined ,
124
- [ ALERT_ATTACK_DISCOVERY_SUMMARY_MARKDOWN ] : summaryMarkdown ,
125
- [ ALERT_ATTACK_DISCOVERY_SUMMARY_MARKDOWN_WITH_REPLACEMENTS ] :
126
- replaceAnonymizedValuesWithOriginalValues ( {
127
- messageContent : summaryMarkdown ,
128
- replacements : replacementsOrEmpty ,
129
- } ) ,
130
- [ ALERT_ATTACK_DISCOVERY_TITLE ] : title ,
131
- [ ALERT_ATTACK_DISCOVERY_TITLE_WITH_REPLACEMENTS ] : replaceAnonymizedValuesWithOriginalValues (
132
- {
133
- messageContent : title ,
134
- replacements : replacementsOrEmpty ,
135
- }
136
- ) ,
137
- [ ALERT_ATTACK_DISCOVERY_USER_ID ] : authenticatedUser . profile_uid ,
138
- [ ALERT_ATTACK_DISCOVERY_USER_NAME ] : authenticatedUser . username ,
139
- [ ALERT_ATTACK_DISCOVERY_USERS ] : [
140
- {
141
- id : authenticatedUser . profile_uid ,
142
- name : authenticatedUser . username ,
143
- } ,
144
- ] ,
145
- [ ALERT_RULE_EXECUTION_UUID ] : generationUuid ,
146
- [ ALERT_INSTANCE_ID ] : alertUuid ,
147
- [ ALERT_RISK_SCORE ] : getAlertRiskScore ( {
148
- alertIds,
149
- anonymizedAlerts,
150
- } ) ,
151
- [ ALERT_RULE_CATEGORY ] : 'Attack discovery ad hoc (placeholder rule category)' ,
152
- [ ALERT_RULE_CONSUMER ] : 'siem' ,
153
- [ ALERT_RULE_NAME ] : 'Attack discovery ad hoc (placeholder rule name)' ,
154
- [ ALERT_RULE_PRODUCER ] : 'siem' ,
155
- [ ALERT_RULE_REVISION ] : 1 ,
156
- [ ALERT_RULE_TYPE_ID ] : ATTACK_DISCOVERY_AD_HOC_RULE_TYPE_ID , // sentinel value
157
- [ ALERT_RULE_UUID ] : ATTACK_DISCOVERY_AD_HOC_RULE_ID , // sentinel value
158
- [ ALERT_STATUS ] : 'active' ,
159
- [ ALERT_UUID ] : alertUuid , // IMPORTANT: the document _id should be the same as this field when it's bulk inserted
160
- [ ALERT_WORKFLOW_STATUS ] : 'open' ,
161
- [ ECS_VERSION ] : EcsVersion ,
162
- [ EVENT_KIND ] : 'signal' ,
163
- [ SPACE_IDS ] : [ spaceId ] ,
164
- } ;
165
- }
166
- ) ;
166
+ ] ,
167
+ [ ALERT_RULE_EXECUTION_UUID ] : generationUuid ,
168
+ [ ALERT_INSTANCE_ID ] : alertUuid ,
169
+ [ ALERT_RULE_CATEGORY ] : 'Attack discovery ad hoc (placeholder rule category)' ,
170
+ [ ALERT_RULE_CONSUMER ] : 'siem' ,
171
+ [ ALERT_RULE_NAME ] : 'Attack discovery ad hoc (placeholder rule name)' ,
172
+ [ ALERT_RULE_PRODUCER ] : 'siem' ,
173
+ [ ALERT_RULE_REVISION ] : 1 ,
174
+ [ ALERT_RULE_TYPE_ID ] : ATTACK_DISCOVERY_AD_HOC_RULE_TYPE_ID , // sentinel value
175
+ [ ALERT_RULE_UUID ] : ATTACK_DISCOVERY_AD_HOC_RULE_ID , // sentinel value
176
+ [ ALERT_STATUS ] : 'active' ,
177
+ [ ALERT_UUID ] : alertUuid , // IMPORTANT: the document _id should be the same as this field when it's bulk inserted
178
+ [ ALERT_WORKFLOW_STATUS ] : 'open' ,
179
+ [ EVENT_KIND ] : 'signal' ,
180
+ [ SPACE_IDS ] : [ spaceId ] ,
181
+ } ;
182
+ } ) ;
167
183
} ;
0 commit comments