Skip to content

Commit a627e01

Browse files
authored
[Rules migration][UI] Basic rule migrations UI (elastic#10820) (elastic#200978)
## Summary [Internal link](elastic/security-team#10820) to the feature details This is a very first version of the SIEM rules migrations UI functionality. The main goal is to setup and agree on a folder structure where the feature gonna live. Tests covering feature will follow in a separate PR (see [internal link](elastic/security-team#11232) for more details). The code follows the structure of prebuilt rules feature https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table and hidden behind `siemMigrationsEnabled` feature flag. ### Key UI changes * New "SIEM Rules Migrations." rules management sub-page * Navigation between different "finished" migrations * InMemory table with all the translations within the selected migration * Translation details preview flyout with `Translation` and `Overview` tabs * User cannot modify translations via UI ### Testing locally Enable the flag ``` xpack.securitySolution.enableExperimental: ['siemMigrationsEnabled'] ``` ### Screenshot https://github.com/user-attachments/assets/a5a7e777-c5f8-40b4-be1d-1bd07a2729ac
1 parent 556edb9 commit a627e01

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1705
-0
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2098,6 +2098,7 @@ x-pack/test/security_solution_api_integration/test_suites/sources @elastic/secur
20982098

20992099
/x-pack/plugins/security_solution/server/lib/siem_migrations @elastic/security-threat-hunting
21002100
/x-pack/plugins/security_solution/common/siem_migrations @elastic/security-threat-hunting
2101+
/x-pack/plugins/security_solution/public/siem_migrations @elastic/security-threat-hunting
21012102

21022103
## Security Solution Threat Hunting areas - Threat Hunting Investigations
21032104

packages/deeplinks/security/deep_links.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ export enum SecurityPageName {
6969
rulesAdd = 'rules-add',
7070
rulesCreate = 'rules-create',
7171
rulesLanding = 'rules-landing',
72+
siemMigrationsRules = 'siem_migrations-rules',
7273
/*
7374
* Warning: Computed values are not permitted in an enum with string valued members
7475
* All threat intelligence page names must match `TIPageId` in x-pack/plugins/threat_intelligence/public/common/navigation/types.ts

x-pack/plugins/security_solution/common/constants.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ export const APP_BLOCKLIST_PATH = `${APP_PATH}${BLOCKLIST_PATH}` as const;
138138
export const APP_RESPONSE_ACTIONS_HISTORY_PATH =
139139
`${APP_PATH}${RESPONSE_ACTIONS_HISTORY_PATH}` as const;
140140
export const NOTES_PATH = `${MANAGEMENT_PATH}/notes` as const;
141+
export const SIEM_MIGRATIONS_PATH = '/siem_migrations' as const;
142+
export const SIEM_MIGRATIONS_RULES_PATH = `${SIEM_MIGRATIONS_PATH}/rules` as const;
141143

142144
// cloud logs to exclude from default index pattern
143145
export const EXCLUDE_ELASTIC_CLOUD_INDICES = ['-*elastic-cloud-logs-*'];

x-pack/plugins/security_solution/public/app/translations.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ export const EXCEPTIONS = i18n.translate('xpack.securitySolution.navigation.exce
101101
defaultMessage: 'Shared exception lists',
102102
});
103103

104+
export const SIEM_MIGRATIONS_RULES = i18n.translate(
105+
'xpack.securitySolution.navigation.siemMigrationsRules',
106+
{
107+
defaultMessage: 'SIEM Rules Migrations',
108+
}
109+
);
110+
104111
export const ALERTS = i18n.translate('xpack.securitySolution.navigation.alerts', {
105112
defaultMessage: 'Alerts',
106113
});

x-pack/plugins/security_solution/public/lazy_sub_plugins.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { EntityAnalytics } from './entity_analytics';
2929
import { Assets } from './assets';
3030
import { Investigations } from './investigations';
3131
import { MachineLearning } from './machine_learning';
32+
import { SiemMigrations } from './siem_migrations';
3233

3334
/**
3435
* The classes used to instantiate the sub plugins. These are grouped into a single object for the sake of bundling them in a single dynamic import.
@@ -53,5 +54,6 @@ const subPluginClasses = {
5354
Assets,
5455
Investigations,
5556
MachineLearning,
57+
SiemMigrations,
5658
};
5759
export { subPluginClasses };

x-pack/plugins/security_solution/public/plugin.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,7 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S
245245
assets: new subPluginClasses.Assets(),
246246
investigations: new subPluginClasses.Investigations(),
247247
machineLearning: new subPluginClasses.MachineLearning(),
248+
siemMigrations: new subPluginClasses.SiemMigrations(),
248249
};
249250
}
250251
return this._subPlugins;
@@ -279,6 +280,9 @@ export class Plugin implements IPlugin<PluginSetup, PluginStart, SetupPlugins, S
279280
assets: subPlugins.assets.start(),
280281
investigations: subPlugins.investigations.start(),
281282
machineLearning: subPlugins.machineLearning.start(),
283+
siemMigrations: subPlugins.siemMigrations.start(
284+
this.experimentalFeatures.siemMigrationsEnabled
285+
),
282286
};
283287
}
284288

x-pack/plugins/security_solution/public/rules/links.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import type { LinkItem } from '../common/links';
2929
import { IconConsoleCloud } from '../common/icons/console_cloud';
3030
import { IconRollup } from '../common/icons/rollup';
3131
import { IconDashboards } from '../common/icons/dashboards';
32+
import { siemMigrationsLinks } from '../siem_migrations/links';
3233

3334
export const links: LinkItem = {
3435
id: SecurityPageName.rulesLanding,
@@ -106,6 +107,7 @@ export const links: LinkItem = {
106107
}),
107108
],
108109
},
110+
siemMigrationsLinks,
109111
],
110112
categories: [
111113
{
@@ -116,6 +118,7 @@ export const links: LinkItem = {
116118
SecurityPageName.rules,
117119
SecurityPageName.cloudSecurityPostureBenchmarks,
118120
SecurityPageName.exceptions,
121+
SecurityPageName.siemMigrationsRules,
119122
],
120123
},
121124
{
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
import type { SecuritySubPlugin } from '../app/types';
9+
import { routes } from './routes';
10+
11+
export class SiemMigrations {
12+
public setup() {}
13+
14+
public start(isEnabled = false): SecuritySubPlugin {
15+
return {
16+
routes: isEnabled ? routes : [],
17+
};
18+
}
19+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
module.exports = {
9+
preset: '@kbn/test',
10+
rootDir: '../../../../..',
11+
roots: ['<rootDir>/x-pack/plugins/security_solution/public/siem_migrations'],
12+
coverageDirectory:
13+
'<rootDir>/target/kibana-coverage/jest/x-pack/plugins/security_solution/public/siem_migrations',
14+
coverageReporters: ['text', 'html'],
15+
collectCoverageFrom: [
16+
'<rootDir>/x-pack/plugins/security_solution/public/siem_migrations/**/*.{ts,tsx}',
17+
],
18+
moduleNameMapper: require('../../server/__mocks__/module_name_map'),
19+
};
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
3+
* or more contributor license agreements. Licensed under the Elastic License
4+
* 2.0; you may not use this file except in compliance with the Elastic License
5+
* 2.0.
6+
*/
7+
8+
import { i18n } from '@kbn/i18n';
9+
import {
10+
SecurityPageName,
11+
SERVER_APP_ID,
12+
SIEM_MIGRATIONS_RULES_PATH,
13+
} from '../../common/constants';
14+
import { SIEM_MIGRATIONS_RULES } from '../app/translations';
15+
import type { LinkItem } from '../common/links/types';
16+
import { IconConsoleCloud } from '../common/icons/console_cloud';
17+
18+
export const siemMigrationsLinks: LinkItem = {
19+
id: SecurityPageName.siemMigrationsRules,
20+
title: SIEM_MIGRATIONS_RULES,
21+
description: i18n.translate('xpack.securitySolution.appLinks.siemMigrationsRulesDescription', {
22+
defaultMessage: 'SIEM Rules Migrations.',
23+
}),
24+
landingIcon: IconConsoleCloud,
25+
path: SIEM_MIGRATIONS_RULES_PATH,
26+
capabilities: [`${SERVER_APP_ID}.show`],
27+
skipUrlState: true,
28+
hideTimeline: true,
29+
globalSearchKeywords: [
30+
i18n.translate('xpack.securitySolution.appLinks.siemMigrationsRules', {
31+
defaultMessage: 'SIEM Rules Migrations',
32+
}),
33+
],
34+
experimentalKey: 'siemMigrationsEnabled',
35+
};

0 commit comments

Comments
 (0)