From 5b69f4943f8fa83310d7b5cbb244fd20d2b1db2e Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Tue, 3 Sep 2024 13:06:59 +0200 Subject: [PATCH 1/6] fix security feature app list --- .../security-solution/features/src/constants.ts | 4 +++- .../features/src/security/kibana_features.ts | 10 +++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/x-pack/packages/security-solution/features/src/constants.ts b/x-pack/packages/security-solution/features/src/constants.ts index 5027a7c8d393b..d8132068a5345 100644 --- a/x-pack/packages/security-solution/features/src/constants.ts +++ b/x-pack/packages/security-solution/features/src/constants.ts @@ -5,8 +5,10 @@ * 2.0. */ -// Same as the plugin id defined by Security Solution +// The Security Solution ID used for the catalog, cases, and API actions export const APP_ID = 'securitySolution' as const; +// The ID of Security Solution UI plugin registered in Kibana +export const APP_UI_ID = 'securitySolutionUI' as const; export const SERVER_APP_ID = 'siem' as const; export const CASES_FEATURE_ID = 'securitySolutionCases' as const; diff --git a/x-pack/packages/security-solution/features/src/security/kibana_features.ts b/x-pack/packages/security-solution/features/src/security/kibana_features.ts index 22a49dec7c914..5441bec16d4ab 100644 --- a/x-pack/packages/security-solution/features/src/security/kibana_features.ts +++ b/x-pack/packages/security-solution/features/src/security/kibana_features.ts @@ -21,6 +21,7 @@ import { import type { BaseKibanaFeatureConfig } from '../types'; import { APP_ID, + APP_UI_ID, SERVER_APP_ID, LEGACY_NOTIFICATIONS_ID, CLOUD_POSTURE_APP_ID, @@ -40,6 +41,9 @@ const SECURITY_RULE_TYPES = [ NEW_TERMS_RULE_TYPE_ID, ]; +// List of apps IDs that are considered part of Security Solution +const app = [APP_UI_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana']; + export const getSecurityBaseKibanaFeature = ({ savedObjects, }: SecurityFeatureParams): BaseKibanaFeatureConfig => ({ @@ -52,7 +56,7 @@ export const getSecurityBaseKibanaFeature = ({ ), order: 1100, category: DEFAULT_APP_CATEGORIES.security, - app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], + app, catalogue: [APP_ID], management: { insightsAndAlerting: ['triggersActions'], @@ -60,7 +64,7 @@ export const getSecurityBaseKibanaFeature = ({ alerting: SECURITY_RULE_TYPES, privileges: { all: { - app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], + app, catalogue: [APP_ID], api: [ APP_ID, @@ -91,7 +95,7 @@ export const getSecurityBaseKibanaFeature = ({ ui: ['show', 'crud'], }, read: { - app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], + app, catalogue: [APP_ID], api: [APP_ID, 'lists-read', 'rac', 'cloud-security-posture-read', 'cloud-defend-read'], savedObject: { From f8bcf243d9196c595eec533b2909e9c0685f6217 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Tue, 3 Sep 2024 15:29:55 +0200 Subject: [PATCH 2/6] update security authorization test --- .../security/platform_security/authorization.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts index 07dbcf7ded031..564f9cc570ffe 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts @@ -183,7 +183,7 @@ export default function ({ getService }: FtrProviderContext) { "api:securitySolution-threat-intelligence", "api:securitySolution-showEndpointExceptions", "api:securitySolution-crudEndpointExceptions", - "app:securitySolution", + "app:securitySolutionUI", "app:csp", "app:cloudDefend", "app:kibana", @@ -1016,7 +1016,7 @@ export default function ({ getService }: FtrProviderContext) { "api:cloud-defend-read", "api:securitySolution-entity-analytics", "api:securitySolution-threat-intelligence", - "app:securitySolution", + "app:securitySolutionUI", "app:csp", "app:cloudDefend", "app:kibana", @@ -1709,7 +1709,7 @@ export default function ({ getService }: FtrProviderContext) { "api:cloud-defend-read", "api:securitySolution-entity-analytics", "api:securitySolution-threat-intelligence", - "app:securitySolution", + "app:securitySolutionUI", "app:csp", "app:cloudDefend", "app:kibana", @@ -2065,7 +2065,7 @@ export default function ({ getService }: FtrProviderContext) { "api:securitySolution-entity-analytics", "api:securitySolution-threat-intelligence", "api:securitySolution-showEndpointExceptions", - "app:securitySolution", + "app:securitySolutionUI", "app:csp", "app:cloudDefend", "app:kibana", From a9084281c677f890498a36984a969083f2012ef2 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Tue, 3 Sep 2024 16:49:21 +0200 Subject: [PATCH 3/6] check Security plugin disabled manually --- .../features/src/constants.ts | 4 +- .../features/src/security/kibana_features.ts | 10 +- .../security_solution/public/plugin.tsx | 178 ++++++++++-------- .../platform_security/authorization.ts | 8 +- 4 files changed, 108 insertions(+), 92 deletions(-) diff --git a/x-pack/packages/security-solution/features/src/constants.ts b/x-pack/packages/security-solution/features/src/constants.ts index d8132068a5345..5027a7c8d393b 100644 --- a/x-pack/packages/security-solution/features/src/constants.ts +++ b/x-pack/packages/security-solution/features/src/constants.ts @@ -5,10 +5,8 @@ * 2.0. */ -// The Security Solution ID used for the catalog, cases, and API actions +// Same as the plugin id defined by Security Solution export const APP_ID = 'securitySolution' as const; -// The ID of Security Solution UI plugin registered in Kibana -export const APP_UI_ID = 'securitySolutionUI' as const; export const SERVER_APP_ID = 'siem' as const; export const CASES_FEATURE_ID = 'securitySolutionCases' as const; diff --git a/x-pack/packages/security-solution/features/src/security/kibana_features.ts b/x-pack/packages/security-solution/features/src/security/kibana_features.ts index 5441bec16d4ab..22a49dec7c914 100644 --- a/x-pack/packages/security-solution/features/src/security/kibana_features.ts +++ b/x-pack/packages/security-solution/features/src/security/kibana_features.ts @@ -21,7 +21,6 @@ import { import type { BaseKibanaFeatureConfig } from '../types'; import { APP_ID, - APP_UI_ID, SERVER_APP_ID, LEGACY_NOTIFICATIONS_ID, CLOUD_POSTURE_APP_ID, @@ -41,9 +40,6 @@ const SECURITY_RULE_TYPES = [ NEW_TERMS_RULE_TYPE_ID, ]; -// List of apps IDs that are considered part of Security Solution -const app = [APP_UI_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana']; - export const getSecurityBaseKibanaFeature = ({ savedObjects, }: SecurityFeatureParams): BaseKibanaFeatureConfig => ({ @@ -56,7 +52,7 @@ export const getSecurityBaseKibanaFeature = ({ ), order: 1100, category: DEFAULT_APP_CATEGORIES.security, - app, + app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], catalogue: [APP_ID], management: { insightsAndAlerting: ['triggersActions'], @@ -64,7 +60,7 @@ export const getSecurityBaseKibanaFeature = ({ alerting: SECURITY_RULE_TYPES, privileges: { all: { - app, + app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], catalogue: [APP_ID], api: [ APP_ID, @@ -95,7 +91,7 @@ export const getSecurityBaseKibanaFeature = ({ ui: ['show', 'crud'], }, read: { - app, + app: [APP_ID, CLOUD_POSTURE_APP_ID, CLOUD_DEFEND_APP_ID, 'kibana'], catalogue: [APP_ID], api: [APP_ID, 'lists-read', 'rac', 'cloud-security-posture-read', 'cloud-defend-read'], savedObject: { diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 991f591773aa7..4ff5f16e6bcd2 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -17,7 +17,7 @@ import type { PluginInitializerContext, Plugin as IPlugin, } from '@kbn/core/public'; -import { DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; +import { AppStatus, DEFAULT_APP_CATEGORIES } from '@kbn/core/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import type { TriggersAndActionsUIPublicPluginSetup } from '@kbn/triggers-actions-ui-plugin/public'; import { getLazyCloudSecurityPosturePliAuthBlockExtension } from './cloud_security_posture/lazy_cloud_security_posture_pli_auth_block_extension'; @@ -204,81 +204,9 @@ export class Plugin implements IPlugin ({ + visibleIn: [], + status: AppStatus.inaccessible, + })); + } + } + + /** + * Registers Fleet extensions. + */ + private registerFleetExtensions(core: CoreStart, plugins: StartPlugins) { + if (!plugins.fleet) { + return; + } + + const { registerExtension } = plugins.fleet; + const registerOptions: FleetUiExtensionGetterOptions = { + coreStart: core, + depsStart: plugins, + services: { + upsellingService: this.contract.upsellingService, + }, + }; + + registerExtension({ + package: 'endpoint', + view: 'package-policy-edit', + Component: getLazyEndpointPolicyEditExtension(registerOptions), + }); + + registerExtension({ + package: 'endpoint', + view: 'package-policy-response', + Component: getLazyEndpointPolicyResponseExtension(registerOptions), + }); + + registerExtension({ + package: 'endpoint', + view: 'package-generic-errors-list', + Component: getLazyEndpointGenericErrorsListExtension(registerOptions), + }); + + registerExtension({ + package: 'endpoint', + view: 'package-policy-create', + Component: getLazyEndpointPolicyCreateExtension(registerOptions), + }); + + registerExtension({ + package: 'endpoint', + view: 'package-policy-create-multi-step', + Component: LazyEndpointPolicyCreateMultiStepExtension, + }); + + registerExtension({ + package: 'endpoint', + view: 'package-detail-custom', + Component: getLazyEndpointPackageCustomExtension(registerOptions), + }); + + registerExtension({ + package: 'endpoint', + view: 'package-detail-assets', + Component: LazyEndpointCustomAssetsExtension, + }); + + registerExtension({ + package: 'endpoint', + view: 'endpoint-agent-tamper-protection', + Component: getLazyEndpointAgentTamperProtectionExtension(registerOptions), + }); + + registerExtension({ + package: 'cloud_security_posture', + view: 'pli-auth-block', + Component: getLazyCloudSecurityPosturePliAuthBlockExtension(registerOptions), + }); + + registerExtension({ + package: 'cribl', + view: 'package-policy-replace-define-step', + Component: LazyCustomCriblExtension, + }); + } + // Lazy loaded dependencies private lazyHelpersForRoutes() { diff --git a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts index 564f9cc570ffe..07dbcf7ded031 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts @@ -183,7 +183,7 @@ export default function ({ getService }: FtrProviderContext) { "api:securitySolution-threat-intelligence", "api:securitySolution-showEndpointExceptions", "api:securitySolution-crudEndpointExceptions", - "app:securitySolutionUI", + "app:securitySolution", "app:csp", "app:cloudDefend", "app:kibana", @@ -1016,7 +1016,7 @@ export default function ({ getService }: FtrProviderContext) { "api:cloud-defend-read", "api:securitySolution-entity-analytics", "api:securitySolution-threat-intelligence", - "app:securitySolutionUI", + "app:securitySolution", "app:csp", "app:cloudDefend", "app:kibana", @@ -1709,7 +1709,7 @@ export default function ({ getService }: FtrProviderContext) { "api:cloud-defend-read", "api:securitySolution-entity-analytics", "api:securitySolution-threat-intelligence", - "app:securitySolutionUI", + "app:securitySolution", "app:csp", "app:cloudDefend", "app:kibana", @@ -2065,7 +2065,7 @@ export default function ({ getService }: FtrProviderContext) { "api:securitySolution-entity-analytics", "api:securitySolution-threat-intelligence", "api:securitySolution-showEndpointExceptions", - "app:securitySolutionUI", + "app:securitySolution", "app:csp", "app:cloudDefend", "app:kibana", From d4315bcd5f7de00184939c5e2b4ca8499026274f Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Wed, 4 Sep 2024 10:00:16 +0200 Subject: [PATCH 4/6] update comments --- x-pack/plugins/security_solution/public/plugin.tsx | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 4ff5f16e6bcd2..15813fac1cf8c 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -205,7 +205,7 @@ export class Plugin implements IPlugin ({ - visibleIn: [], status: AppStatus.inaccessible, + visibleIn: [], })); } } - /** - * Registers Fleet extensions. - */ private registerFleetExtensions(core: CoreStart, plugins: StartPlugins) { if (!plugins.fleet) { return; From d3d970bb33c87976e52fd3610e2f89f812a86d61 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Fri, 27 Sep 2024 17:01:45 +0200 Subject: [PATCH 5/6] fix updater order --- .../security_solution/public/plugin.tsx | 49 +++++++++---------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 15813fac1cf8c..52187ac1601d2 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -205,8 +205,8 @@ export class Plugin implements IPlugin ({ + status: AppStatus.inaccessible, + visibleIn: [], + })); + // no need to register the links updater when the plugin is inaccessible + return; + } + + // Configuration of AppLinks updater registration based on license and capabilities const { appLinks: initialAppLinks, getFilteredLinks, solutionAppLinksSwitcher, } = await this.lazyApplicationLinks(); - const { license$ } = plugins.licensing; - const { capabilities } = core.application; - const { upsellingService, isSolutionNavigationEnabled$ } = this.contract; registerDeepLinksUpdater(this.appUpdater$, isSolutionNavigationEnabled$); - const appLinks$ = new Subject(); - appLinks$.next(initialAppLinks); + const appLinksToUpdate$ = new Subject(); + appLinksToUpdate$.next(initialAppLinks); - appLinks$ + appLinksToUpdate$ .pipe(combineLatestWith(license$, isSolutionNavigationEnabled$)) .subscribe(([appLinks, license, isSolutionNavigationEnabled]) => { const links = isSolutionNavigationEnabled ? solutionAppLinksSwitcher(appLinks) : appLinks; @@ -362,22 +374,7 @@ export class Plugin implements IPlugin ({ - status: AppStatus.inaccessible, - visibleIn: [], - })); - } + appLinksToUpdate$.next(filteredLinks); } private registerFleetExtensions(core: CoreStart, plugins: StartPlugins) { From 6d706d1fe7e90a4e24b25c32525490629b81bda6 Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Fri, 27 Sep 2024 17:13:56 +0200 Subject: [PATCH 6/6] comments added --- x-pack/plugins/security_solution/public/plugin.tsx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/x-pack/plugins/security_solution/public/plugin.tsx b/x-pack/plugins/security_solution/public/plugin.tsx index 52187ac1601d2..a2d7d9805b7a9 100644 --- a/x-pack/plugins/security_solution/public/plugin.tsx +++ b/x-pack/plugins/security_solution/public/plugin.tsx @@ -205,8 +205,7 @@ export class Plugin implements IPlugin { if (!this._subPlugins) { const { subPluginClasses } = await this.lazySubPlugins(); @@ -241,9 +245,6 @@ export class Plugin implements IPlugin