Skip to content

Commit 0cceba7

Browse files
abhishekbhatia1710kibanamachinetiansivive
authored
[Security Solution][Entity Analytics][Risk Score] Add Risk Scoring Alert Filtering - Frontend Implementation (#238004)
## Summary This PR implements the frontend user interface for Risk Scoring Alert Filtering in Entity Analytics. Users can now create and manage KQL-based filters to target specific entity types (Users, Hosts, Services) during risk score calculations. ## Design Implementation - Based on the [Figma mockups](https://www.figma.com/design/IKQr6HbQPAdFws9i7Ikcx9/-8.15-9.2--Entity-Analytics?node-id=7131-49715&t=8Z3JSBzT4pZ2HkXZ-0), this implementation provides: - KQL Search Bar with field suggestions - Filter Management with visual chips and entity targeting - Save Functionality with persistent storage ## User Interface ### Filter Creation Flow - User types in KQL search bar (e.g., user.name: "root") - Field suggestions appear as they type - Press Enter to create a filter chip - Select target entities (Users, Hosts, Services) - Click "Save changes" to persist filters ### Filter Management - Remove Individual Filters: Cross button on each filter chip - Remove Entire Filter: Cross button at the end of each filter row - Visual Feedback: Green values, proper spacing, and clear hierarchy Screenshot : <img width="1913" height="881" alt="image" src="https://github.com/user-attachments/assets/69c375d5-e3de-41ae-bd36-2dd6ca24fe9e" /> <img width="1918" height="930" alt="image" src="https://github.com/user-attachments/assets/b5c6cf31-e8bc-404d-aec8-6c929d0ce2f4" /> ### Checklist Check the PR satisfies following conditions. Reviewers should verify this PR satisfies this list as well. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/src/platform/packages/shared/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] The PR description includes the appropriate Release Notes section, and the correct `release_note:*` label is applied per the [guidelines](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) - [ ] Review the [backport guidelines](https://docs.google.com/document/d/1VyN5k91e5OVumlc0Gb9RPa3h1ewuPE705nRtioPiTvY/edit?usp=sharing) and apply applicable `backport:*` labels. --------- Co-authored-by: kibanamachine <[email protected]> Co-authored-by: Tiago Vila Verde <[email protected]>
1 parent 4c51aea commit 0cceba7

25 files changed

+2228
-236
lines changed

x-pack/solutions/security/plugins/security_solution/public/entity_analytics/api/api.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import type {
3535
SearchPrivilegesIndicesResponse,
3636
UpdateEntitySourceResponse,
3737
UploadAssetCriticalityRecordsResponse,
38+
ConfigureRiskEngineSavedObjectRequestBodyInput,
3839
} from '../../../common/api/entity_analytics';
3940
import {
4041
API_VERSIONS,
@@ -440,7 +441,9 @@ export const useEntityAnalyticsRoutes = () => {
440441
method: 'DELETE',
441442
});
442443

443-
const updateSavedObjectConfiguration = (params: {}) =>
444+
const updateSavedObjectConfiguration = (
445+
params: ConfigureRiskEngineSavedObjectRequestBodyInput
446+
) =>
444447
http.fetch(RISK_ENGINE_CONFIGURE_SO_URL, {
445448
version: API_VERSIONS.public.v1,
446449
method: 'PUT',

x-pack/solutions/security/plugins/security_solution/public/entity_analytics/api/hooks/use_configure_risk_engine_saved_object.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@ import type { UseMutationOptions } from '@kbn/react-query';
99
import { useMutation } from '@kbn/react-query';
1010
import type { TaskManagerUnavailableResponse } from '../../../../common/api/entity_analytics/common';
1111
import { useEntityAnalyticsRoutes } from '../api';
12-
import type { ConfigureRiskEngineSavedObjectResponse } from '../../../../common/api/entity_analytics/risk_engine/engine_configure_saved_object_route.gen';
12+
import type {
13+
ConfigureRiskEngineSavedObjectRequestBody,
14+
ConfigureRiskEngineSavedObjectResponse,
15+
} from '../../../../common/api/entity_analytics/risk_engine/engine_configure_saved_object_route.gen';
1316

1417
interface ConfigureRiskEngineParams {
1518
includeClosedAlerts: boolean;
1619
range: { start: string; end: string };
1720
enableResetToZero: boolean;
21+
filters?: ConfigureRiskEngineSavedObjectRequestBody['filters'];
1822
}
1923

2024
export const useConfigureSORiskEngineMutation = (
@@ -35,6 +39,7 @@ export const useConfigureSORiskEngineMutation = (
3539
exclude_alert_statuses: params.includeClosedAlerts ? [] : ['closed'],
3640
range: params.range,
3741
enable_reset_to_zero: params.enableResetToZero,
42+
filters: params.filters,
3843
});
3944
return { risk_engine_saved_object_configured: true };
4045
}, options);

x-pack/solutions/security/plugins/security_solution/public/entity_analytics/api/hooks/use_preview_risk_scores.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,39 @@ import type { RiskScoresPreviewRequest } from '../../../../common/api/entity_ana
1010
import { useEntityAnalyticsRoutes } from '../api';
1111

1212
export type UseRiskScorePreviewParams = Omit<RiskScoresPreviewRequest, 'data_view_id'> & {
13-
data_view_id?: string;
13+
data_view_id?: RiskScoresPreviewRequest['data_view_id'];
1414
};
1515

1616
export const useRiskScorePreview = ({
1717
data_view_id: dataViewId,
1818
range,
1919
filter,
2020
exclude_alert_statuses: excludeAlertStatuses,
21+
filters,
22+
...otherParams
2123
}: UseRiskScorePreviewParams) => {
2224
const { fetchRiskScorePreview } = useEntityAnalyticsRoutes();
25+
const serializedOtherParams = otherParams ? JSON.stringify(otherParams) : null;
2326

2427
return useQuery(
25-
['POST', 'FETCH_PREVIEW_RISK_SCORE', range, filter, excludeAlertStatuses],
28+
[
29+
'POST',
30+
'FETCH_PREVIEW_RISK_SCORE',
31+
range,
32+
filter,
33+
excludeAlertStatuses,
34+
filters,
35+
serializedOtherParams,
36+
],
2637
async ({ signal }) => {
2738
if (!dataViewId) {
2839
return;
2940
}
3041

31-
const params: RiskScoresPreviewRequest = { data_view_id: dataViewId };
42+
const params: RiskScoresPreviewRequest = {
43+
data_view_id: dataViewId,
44+
...otherParams,
45+
};
3246
if (range) {
3347
const startTime = dateMath.parse(range.start)?.utc().toISOString();
3448
const endTime = dateMath
@@ -54,6 +68,10 @@ export const useRiskScorePreview = ({
5468
params.exclude_alert_statuses = excludeAlertStatuses;
5569
}
5670

71+
if (filters && filters.length > 0) {
72+
params.filters = filters;
73+
}
74+
5775
const response = await fetchRiskScorePreview({ signal, params });
5876

5977
return response;

0 commit comments

Comments
 (0)