Skip to content

Commit 8135adc

Browse files
committed
Revert "Remove saved_query logic for getFilters"
This reverts commit 567afc3.
1 parent 8a0d582 commit 8135adc

File tree

5 files changed

+129
-3
lines changed

5 files changed

+129
-3
lines changed

x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/query.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ export const queryExecutor = async ({
6666
filters: ruleParams.filters,
6767
language: ruleParams.language,
6868
query: ruleParams.query,
69+
savedId: ruleParams.savedId,
70+
services,
6971
index: inputIndex,
7072
lists: exceptionItems,
7173
});

x-pack/plugins/security_solution/server/lib/detection_engine/signals/executors/threshold.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ export const thresholdExecutor = async ({
103103
filters: ruleParams.filters ? ruleParams.filters.concat(bucketFilters) : bucketFilters,
104104
language: ruleParams.language,
105105
query: ruleParams.query,
106+
savedId: ruleParams.savedId,
107+
services,
106108
index: inputIndex,
107109
lists: exceptionItems,
108110
});

x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.test.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ describe('get_filter', () => {
4141
filters: undefined,
4242
language: 'kuery',
4343
query: 'host.name: siem',
44+
savedId: undefined,
45+
services: servicesMock,
4446
index: ['auditbeat-*'],
4547
lists: [],
4648
});
@@ -74,6 +76,8 @@ describe('get_filter', () => {
7476
filters: undefined,
7577
language: undefined,
7678
query: 'host.name: siem',
79+
savedId: undefined,
80+
services: servicesMock,
7781
index: ['auditbeat-*'],
7882
lists: [],
7983
})
@@ -87,6 +91,8 @@ describe('get_filter', () => {
8791
filters: undefined,
8892
language: 'kuery',
8993
query: undefined,
94+
savedId: undefined,
95+
services: servicesMock,
9096
index: ['auditbeat-*'],
9197
lists: [],
9298
})
@@ -100,19 +106,76 @@ describe('get_filter', () => {
100106
filters: undefined,
101107
language: 'kuery',
102108
query: 'host.name: siem',
109+
savedId: undefined,
110+
services: servicesMock,
103111
index: undefined,
104112
lists: [],
105113
})
106114
).rejects.toThrow('query, filters, and index parameter should be defined');
107115
});
108116

117+
test('returns a saved query if given a type of query', async () => {
118+
const filter = await getFilter({
119+
type: 'saved_query',
120+
filters: undefined,
121+
language: undefined,
122+
query: undefined,
123+
savedId: 'some-id',
124+
services: servicesMock,
125+
index: ['auditbeat-*'],
126+
lists: [],
127+
});
128+
expect(filter).toEqual({
129+
bool: {
130+
filter: [
131+
{ bool: { minimum_should_match: 1, should: [{ match: { 'host.name': 'linux' } }] } },
132+
],
133+
must: [],
134+
must_not: [],
135+
should: [],
136+
},
137+
});
138+
});
139+
140+
test('throws on saved query if saved_id is undefined', async () => {
141+
await expect(
142+
getFilter({
143+
type: 'saved_query',
144+
filters: undefined,
145+
language: undefined,
146+
query: undefined,
147+
savedId: undefined,
148+
services: servicesMock,
149+
index: ['auditbeat-*'],
150+
lists: [],
151+
})
152+
).rejects.toThrow('savedId parameter should be defined');
153+
});
154+
155+
test('throws on saved query if index is undefined', async () => {
156+
await expect(
157+
getFilter({
158+
type: 'saved_query',
159+
filters: undefined,
160+
language: undefined,
161+
query: undefined,
162+
savedId: 'some-id',
163+
services: servicesMock,
164+
index: undefined,
165+
lists: [],
166+
})
167+
).rejects.toThrow('savedId parameter should be defined');
168+
});
169+
109170
test('throws on machine learning query', async () => {
110171
await expect(
111172
getFilter({
112173
type: 'machine_learning',
113174
filters: undefined,
114175
language: undefined,
115176
query: undefined,
177+
savedId: 'some-id',
178+
services: servicesMock,
116179
index: undefined,
117180
lists: [],
118181
})
@@ -125,6 +188,8 @@ describe('get_filter', () => {
125188
filters: undefined,
126189
language: 'kuery',
127190
query: 'host.name: siem',
191+
savedId: undefined,
192+
services: servicesMock,
128193
index: ['auditbeat-*'],
129194
lists: [getExceptionListItemSchemaMock()],
130195
});

x-pack/plugins/security_solution/server/lib/detection_engine/signals/get_filter.ts

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,43 @@ import { assertUnreachable } from '../../../../common/utility_types';
1212
import { getQueryFilter } from '../../../../common/detection_engine/get_query_filter';
1313
import {
1414
QueryOrUndefined,
15+
SavedIdOrUndefined,
1516
IndexOrUndefined,
1617
} from '../../../../common/detection_engine/schemas/common/schemas';
18+
import {
19+
AlertInstanceContext,
20+
AlertInstanceState,
21+
AlertServices,
22+
} from '../../../../../alerting/server';
23+
import { PartialFilter } from '../types';
1724
import { QueryFilter } from './types';
1825

1926
interface GetFilterArgs {
2027
type: Type;
2128
filters: unknown | undefined;
2229
language: LanguageOrUndefined;
2330
query: QueryOrUndefined;
31+
savedId: SavedIdOrUndefined;
32+
services: AlertServices<AlertInstanceState, AlertInstanceContext, 'default'>;
2433
index: IndexOrUndefined;
2534
lists: ExceptionListItemSchema[];
2635
}
2736

37+
interface QueryAttributes {
38+
// NOTE: doesn't match Query interface
39+
query: {
40+
query: string;
41+
language: Language;
42+
};
43+
filters: PartialFilter[];
44+
}
45+
2846
export const getFilter = async ({
2947
filters,
3048
index,
3149
language,
50+
savedId,
51+
services,
3252
type,
3353
query,
3454
lists,
@@ -41,13 +61,48 @@ export const getFilter = async ({
4161
}
4262
};
4363

64+
const savedQueryFilter = async () => {
65+
if (savedId != null && index != null) {
66+
try {
67+
// try to get the saved object first
68+
const savedObject = await services.savedObjectsClient.get<QueryAttributes>(
69+
'query',
70+
savedId
71+
);
72+
return getQueryFilter(
73+
savedObject.attributes.query.query,
74+
savedObject.attributes.query.language,
75+
savedObject.attributes.filters,
76+
index,
77+
lists
78+
);
79+
} catch (err) {
80+
// saved object does not exist, so try and fall back if the user pushed
81+
// any additional language, query, filters, etc...
82+
if (query != null && language != null && index != null) {
83+
return getQueryFilter(query, language, filters || [], index, lists);
84+
} else {
85+
// user did not give any additional fall back mechanism for generating a rule
86+
// rethrow error for activity monitoring
87+
throw err;
88+
}
89+
}
90+
} else {
91+
throw new BadRequestError('savedId parameter should be defined');
92+
}
93+
};
94+
4495
switch (type) {
4596
case 'threat_match':
46-
case 'threshold':
47-
case 'query':
48-
case 'saved_query': {
97+
case 'threshold': {
98+
return savedId != null ? savedQueryFilter() : queryFilter();
99+
}
100+
case 'query': {
49101
return queryFilter();
50102
}
103+
case 'saved_query': {
104+
return savedQueryFilter();
105+
}
51106
case 'machine_learning': {
52107
throw new BadRequestError(
53108
'Unsupported Rule of type "machine_learning" supplied to getFilter'

x-pack/plugins/security_solution/server/lib/detection_engine/signals/threat_mapping/create_threat_signal.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ export const createThreatSignal = async ({
5858
filters: [...filters, threatFilter],
5959
language,
6060
query,
61+
savedId,
62+
services,
6163
index: inputIndex,
6264
lists: exceptionItems,
6365
});

0 commit comments

Comments
 (0)