Skip to content

Commit 45aa758

Browse files
authored
wiz.issue: Add sourceRules field to the issue data stream (#16692)
wiz.issue: Add sourceRules field to the issue data stream Add newly added "sourceRules" node to GraphQL query in issue data stream. This is mapped to "source_rules" field of type "nested". Mark existing "source_rule" field to be deprecated, but populate it with first sourceRule in the "source_rules" list. This allows users time to migrate any custom artifacts to use "source_rules" field instead. Implementation is largely taken from here[1]. [1] #16627 (comment)
1 parent 8b5c6ed commit 45aa758

File tree

10 files changed

+601
-123
lines changed

10 files changed

+601
-123
lines changed

packages/wiz/_dev/deploy/docker/files/config-issue.yml

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

packages/wiz/changelog.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
# newer versions go on top
2+
- version: "3.12.0"
3+
changes:
4+
- description: |
5+
Add `sourceRules` field to the issue data stream.
6+
Deprecate `sourceRule` field, which will be removed in a future version.
7+
Any custom-user artifacts will need to be updated to use the new field.
8+
type: enhancement
9+
link: https://github.com/elastic/integrations/pull/16692
210
- version: "3.11.0"
311
changes:
412
- description: Add `risks` field to the `sourceRule` object in the issue data stream.

packages/wiz/data_stream/issue/_dev/test/pipeline/test-issue.log

Lines changed: 2 additions & 2 deletions
Large diffs are not rendered by default.

packages/wiz/data_stream/issue/_dev/test/pipeline/test-issue.log-expected.json

Lines changed: 192 additions & 34 deletions
Large diffs are not rendered by default.

packages/wiz/data_stream/issue/agent/stream/cel.yml.hbs

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ state:
3131
nodes {
3232
id
3333
type
34-
sourceRule{
34+
sourceRules{
3535
__typename
3636
... on Control {
3737
id
3838
name
39-
controlDescription: description
39+
description
4040
resolutionRecommendation
4141
risks
4242
securitySubCategories {
@@ -52,17 +52,35 @@ state:
5252
... on CloudEventRule{
5353
id
5454
name
55-
cloudEventRuleDescription: description
55+
description
5656
risks
57+
securitySubCategories {
58+
title
59+
category {
60+
name
61+
framework {
62+
name
63+
}
64+
}
65+
}
5766
sourceType
5867
type
5968
}
6069
... on CloudConfigurationRule{
6170
id
6271
name
63-
cloudConfigurationRuleDescription: description
72+
description
6473
remediationInstructions
6574
risks
75+
securitySubCategories {
76+
title
77+
category {
78+
name
79+
framework {
80+
name
81+
}
82+
}
83+
}
6684
serviceType
6785
}
6886
}

packages/wiz/data_stream/issue/elasticsearch/ingest_pipeline/default.yml

Lines changed: 86 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -325,58 +325,92 @@ processors:
325325
tag: rename_severity
326326
target_field: wiz.issue.severity
327327
ignore_missing: true
328-
- rename:
329-
field: json.sourceRule.__typename
330-
tag: rename_source_rule_typename
331-
target_field: wiz.issue.source_rule.__typename
332-
ignore_missing: true
333-
- rename:
334-
field: json.sourceRule.id
335-
tag: rename_source_rule_id
336-
target_field: wiz.issue.source_rule.id
337-
ignore_missing: true
338-
- rename:
339-
field: json.sourceRule.controlDescription
340-
tag: rename_control_description
341-
target_field: wiz.issue.source_rule.control_description
342-
ignore_missing: true
343-
- set:
344-
field: message
345-
tag: set_message
346-
copy_from: wiz.issue.source_rule.control_description
347-
ignore_empty_value: true
348-
if: ctx.message == null
349-
- rename:
350-
field: json.sourceRule.cloudConfigurationRuleDescription
351-
tag: rename_source_rule_cloud_configuration_rule_description
352-
target_field: wiz.issue.source_rule.cloud_configuration_rule_description
353-
ignore_missing: true
354-
- set:
355-
field: message
356-
tag: set_message
357-
copy_from: wiz.issue.source_rule.cloud_configuration_rule_description
358-
ignore_empty_value: true
359-
if: ctx.message == null
360-
- rename:
361-
field: json.sourceRule.name
362-
tag: rename_source_rule_name
363-
target_field: wiz.issue.source_rule.name
364-
ignore_missing: true
365-
- rename:
366-
field: json.sourceRule.risks
367-
tag: rename_source_rule_risks
368-
target_field: wiz.issue.source_rule.risks
369-
ignore_missing: true
370-
- rename:
371-
field: json.sourceRule.resolutionRecommendation
372-
tag: rename_source_rule_resolution_recommendation
373-
target_field: wiz.issue.source_rule.resolution_recommendation
374-
ignore_missing: true
375-
- rename:
376-
field: json.sourceRule.securitySubCategories
377-
tag: rename_framework_name
378-
target_field: wiz.issue.source_rule.security_sub_categories
379-
ignore_missing: true
328+
- script:
329+
tag: map_source_rules_array
330+
description: 'Loop over sourceRules array and create mapped objects for source_rules nested field'
331+
if: ctx.json?.sourceRules != null && ctx.json.sourceRules instanceof List && ctx.json.sourceRules.size() > 0
332+
lang: painless
333+
source: |
334+
def sourceRulesList = new ArrayList();
335+
ctx.wiz.issue.source_rule = ctx.wiz.issue.source_rule ?: [:];
336+
for (def rule : ctx.json.sourceRules) {
337+
boolean doSourceRule = sourceRulesList.size() == 0;
338+
def mappedRule = new HashMap();
339+
if (rule.__typename != null) {
340+
mappedRule.put('__typename', rule.__typename);
341+
if (doSourceRule) {
342+
ctx.wiz.issue.source_rule.__typename = rule.__typename;
343+
}
344+
}
345+
if (rule.id != null) {
346+
mappedRule.put('id', rule.id);
347+
if (doSourceRule) {
348+
ctx.wiz.issue.source_rule.id = rule.id;
349+
}
350+
}
351+
if (rule.name != null) {
352+
mappedRule.put('name', rule.name);
353+
if (doSourceRule) {
354+
ctx.wiz.issue.source_rule.name = rule.name;
355+
}
356+
}
357+
if (rule.description != null) {
358+
mappedRule.put('description', rule.description);
359+
if (doSourceRule && (rule.__typename != null)) {
360+
if (rule.__typename == "Control") {
361+
ctx.wiz.issue.source_rule.control_description = rule.description;
362+
}
363+
if (rule.__typename == "CloudConfigurationEvent") {
364+
ctx.wiz.issue.source_rule.control_cloud_configuration_rule_description = rule.description;
365+
}
366+
if (rule.__typename == "CloudEventRule") {
367+
ctx.wiz.issue.source_rule.cloud_event_rule_description = rule.description;
368+
}
369+
if (ctx.message == null) {
370+
ctx.message = rule.description;
371+
}
372+
}
373+
}
374+
if (rule.resolutionRecommendation != null) {
375+
mappedRule.put('resolution_recommendation', rule.resolutionRecommendation);
376+
if (doSourceRule) {
377+
ctx.wiz.issue.source_rule.resolution_recommendation = rule.resolutionRecommendation;
378+
}
379+
}
380+
if (rule.remediationInstructions != null) {
381+
mappedRule.put('remediation_instructions', rule.remediationInstructions);
382+
}
383+
if (rule.risks != null && rule.risks.size() > 0) {
384+
def risksList = new ArrayList();
385+
risksList.addAll(rule.risks);
386+
mappedRule.put('risks', risksList);
387+
if (doSourceRule) {
388+
ctx.wiz.issue.source_rule.risks = risksList;
389+
}
390+
}
391+
if (rule.securitySubCategories != null) {
392+
mappedRule.put('security_sub_categories', rule.securitySubCategories);
393+
if (doSourceRule) {
394+
ctx.wiz.issue.source_rule.security_sub_categories = rule.securitySubCategories;
395+
}
396+
}
397+
if (rule.type != null) {
398+
mappedRule.put('type', rule.type);
399+
}
400+
if (rule.serviceType != null) {
401+
mappedRule.put('service_type', rule.serviceType);
402+
}
403+
if (rule.sourceType != null) {
404+
mappedRule.put('source_type', rule.sourceType);
405+
}
406+
sourceRulesList.add(mappedRule);
407+
}
408+
409+
ctx.wiz.issue.source_rules = sourceRulesList;
410+
on_failure:
411+
- append:
412+
field: error.message
413+
value: 'Processor {{{_ingest.on_failure_processor_type}}} with tag {{{_ingest.on_failure_processor_tag}}} in pipeline {{{_ingest.on_failure_pipeline}}} failed with message: {{{_ingest.on_failure_message}}}'
380414
- date:
381415
field: json.statusChangedAt
382416
tag: date_set_timestamp

packages/wiz/data_stream/issue/fields/fields.yml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,19 +98,71 @@
9898
type: keyword
9999
- name: source_rule
100100
type: group
101+
description: DEPRECATED. Use `wiz.issue.source_rules` instead.
101102
fields:
102103
- name: __typename
103104
type: keyword
105+
description: DEPRECATED. Use `wiz.issue.source_rules.__typename` instead.
104106
- name: control_description
105107
type: keyword
108+
description: DEPRECATED. Use `wiz.issue.source_rules.description` instead.
106109
- name: cloud_configuration_rule_description
107110
type: keyword
111+
description: DEPRECATED. Use `wiz.issue.source_rules.description` instead.
112+
- name: cloud_event_rule_description
113+
type: keyword
114+
description: DEPRECATED. Use `wiz.issue.source_rules.description` instead.
108115
- name: id
109116
type: keyword
117+
description: DEPRECATED. Use `wiz.issue.source_rules.id` instead.
110118
- name: name
111119
type: keyword
120+
description: DEPRECATED. Use `wiz.issue.source_rules.name` instead.
112121
- name: resolution_recommendation
113122
type: keyword
123+
description: DEPRECATED. Use `wiz.issue.source_rules.resolution_recommendation` instead.
124+
- name: risks
125+
type: keyword
126+
description: DEPRECATED. Use `wiz.issue.source_rules.risks` instead.
127+
- name: security_sub_categories
128+
type: group
129+
fields:
130+
- name: category
131+
type: group
132+
fields:
133+
- name: framework
134+
type: group
135+
fields:
136+
- name: name
137+
type: keyword
138+
description: DEPRECATED. Use `wiz.issue.source_rules.security_sub_categories.category.framework.name` instead.
139+
- name: name
140+
type: keyword
141+
description: DEPRECATED. Use `wiz.issue.source_rules.security_sub_categories.category.name` instead.
142+
- name: title
143+
type: keyword
144+
description: DEPRECATED. Use `wiz.issue.source_rules.security_sub_categories.title` instead.
145+
- name: source_rules
146+
type: nested
147+
fields:
148+
- name: __typename
149+
type: keyword
150+
- name: description
151+
type: keyword
152+
- name: type
153+
type: keyword
154+
- name: source_type
155+
type: keyword
156+
- name: service_type
157+
type: keyword
158+
- name: id
159+
type: keyword
160+
- name: name
161+
type: keyword
162+
- name: resolution_recommendation
163+
type: keyword
164+
- name: remediation_instructions
165+
type: keyword
114166
- name: risks
115167
type: keyword
116168
- name: security_sub_categories

0 commit comments

Comments
 (0)