From c691cda974dfca6fba84184caec2b49da1f51783 Mon Sep 17 00:00:00 2001 From: animehart Date: Wed, 3 Dec 2025 09:01:03 -0800 Subject: [PATCH 1/6] initial push, maybe need to hide it behind flag --- .../shared/deeplinks/security/deep_links.ts | 5 ++ .../translations/translations/fr-FR.json | 1 + .../translations/translations/ja-JP.json | 1 + .../translations/translations/zh-CN.json | 1 + .../public/common/navigation/constants.ts | 2 +- .../plugins/cloud_defend/public/index.ts | 1 + .../security_solution/common/constants.ts | 1 + .../links/sections/icons/ecctl.tsx | 41 +++++++++++++++ .../public/cloud_defend/index.ts | 3 +- .../public/cloud_defend/links.ts | 27 ++++++++++ .../public/cloud_defend/routes.tsx | 51 +++++++++++++++++++ .../public/common/icons/cloud_defend.tsx | 50 ++++++++++++++++++ .../public/management/links.ts | 2 + .../e2e/explore/navigation/navigation.cy.ts | 5 ++ .../cypress/urls/navigation.ts | 1 + 15 files changed, 190 insertions(+), 2 deletions(-) create mode 100644 x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx create mode 100644 x-pack/solutions/security/plugins/security_solution/public/cloud_defend/links.ts create mode 100644 x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx create mode 100644 x-pack/solutions/security/plugins/security_solution/public/common/icons/cloud_defend.tsx diff --git a/src/platform/packages/shared/deeplinks/security/deep_links.ts b/src/platform/packages/shared/deeplinks/security/deep_links.ts index 224a0917475da..7109e8af3bf2f 100644 --- a/src/platform/packages/shared/deeplinks/security/deep_links.ts +++ b/src/platform/packages/shared/deeplinks/security/deep_links.ts @@ -36,6 +36,11 @@ export enum SecurityPageName { cloudSecurityPostureVulnerabilityDashboard = 'cloud_security_posture-vulnerability_dashboard', cloudSecurityPostureFindings = 'cloud_security_posture-findings', cloudSecurityPostureRules = 'cloud_security_posture-rules', + /* + * Warning: Computed values are not permitted in an enum with string valued members + * All cloud defend page names must match `CloudDefendPageId` in x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/types.ts + */ + cloudDefend = 'cloud_defend', cloudDefendPolicies = 'cloud_defend-policies', dashboards = 'dashboards', dataQuality = 'data_quality', diff --git a/x-pack/platform/plugins/private/translations/translations/fr-FR.json b/x-pack/platform/plugins/private/translations/translations/fr-FR.json index d2bf274b492f2..b158bc66fa310 100644 --- a/x-pack/platform/plugins/private/translations/translations/fr-FR.json +++ b/x-pack/platform/plugins/private/translations/translations/fr-FR.json @@ -33395,6 +33395,7 @@ "xpack.securitySolution.appLinks.category.entityAnalytics": "Analyse des entités", "xpack.securitySolution.appLinks.category.investigations": "Investigations", "xpack.securitySolution.appLinks.category.management": "Gestion", + "xpack.securitySolution.appLinks.cloudDefendPoliciesDescription": "Sécurisez les charges de travail conteneurisées dans Kubernetes contre les attaques et les dérives grâce à des politiques d'exécution granulaires et flexibles.", "xpack.securitySolution.appLinks.cloudSecurityPostureBenchmarksDescription": "Voir les règles de benchmark pour la gestion du niveau de sécurité du cloud.", "xpack.securitySolution.appLinks.cloudSecurityPostureDashboardDescription": "Un aperçu des résultats de toutes les intégrations CSP.", "xpack.securitySolution.appLinks.coverageOverviewDashboard": "Couverture MITRE ATT&CK", diff --git a/x-pack/platform/plugins/private/translations/translations/ja-JP.json b/x-pack/platform/plugins/private/translations/translations/ja-JP.json index f36107889a889..e0dd3b176f850 100644 --- a/x-pack/platform/plugins/private/translations/translations/ja-JP.json +++ b/x-pack/platform/plugins/private/translations/translations/ja-JP.json @@ -33431,6 +33431,7 @@ "xpack.securitySolution.appLinks.category.entityAnalytics": "エンティティ分析", "xpack.securitySolution.appLinks.category.investigations": "調査", "xpack.securitySolution.appLinks.category.management": "管理", + "xpack.securitySolution.appLinks.cloudDefendPoliciesDescription": "粒度の高い柔軟なランタイムポリシーによって、Kubernetesのコンテナーワークロードを攻撃とドリフトから保護します。", "xpack.securitySolution.appLinks.cloudSecurityPostureBenchmarksDescription": "Cloud Security Posture Managementのベンチマークルールを表示します。", "xpack.securitySolution.appLinks.cloudSecurityPostureDashboardDescription": "すべてのCSP統合の結果の概要。", "xpack.securitySolution.appLinks.coverageOverviewDashboard": "MITRE ATT&CKの範囲", diff --git a/x-pack/platform/plugins/private/translations/translations/zh-CN.json b/x-pack/platform/plugins/private/translations/translations/zh-CN.json index 0600276a20c12..f49d5f3ed89e1 100644 --- a/x-pack/platform/plugins/private/translations/translations/zh-CN.json +++ b/x-pack/platform/plugins/private/translations/translations/zh-CN.json @@ -33414,6 +33414,7 @@ "xpack.securitySolution.appLinks.category.entityAnalytics": "实体分析", "xpack.securitySolution.appLinks.category.investigations": "调查", "xpack.securitySolution.appLinks.category.management": "管理", + "xpack.securitySolution.appLinks.cloudDefendPoliciesDescription": "通过细粒度、灵活的运行时策略保护 Kubernetes 中的容器工作负载,使其免于受到攻击和出现漂移。", "xpack.securitySolution.appLinks.cloudSecurityPostureBenchmarksDescription": "查看用于云安全态势管理的基准规则。", "xpack.securitySolution.appLinks.cloudSecurityPostureDashboardDescription": "所有 CSP 集成中的结果概述。", "xpack.securitySolution.appLinks.coverageOverviewDashboard": "MITRE ATT&CK 支持", diff --git a/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/constants.ts b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/constants.ts index b8bc0c900c1c9..f063ad0acab7e 100644 --- a/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/constants.ts +++ b/x-pack/solutions/security/plugins/cloud_defend/public/common/navigation/constants.ts @@ -16,7 +16,7 @@ const NAV_ITEMS_NAMES = { }; /** The base path for all cloud defend pages. */ -const CLOUD_DEFEND_BASE_PATH = '/cloud_defend'; +export const CLOUD_DEFEND_BASE_PATH = '/cloud_defend'; export const cloudDefendPages: Record = { policies: { diff --git a/x-pack/solutions/security/plugins/cloud_defend/public/index.ts b/x-pack/solutions/security/plugins/cloud_defend/public/index.ts index cca2e7edecb56..9dcf8bd5b2760 100755 --- a/x-pack/solutions/security/plugins/cloud_defend/public/index.ts +++ b/x-pack/solutions/security/plugins/cloud_defend/public/index.ts @@ -8,6 +8,7 @@ import { CloudDefendPlugin } from './plugin'; export type { CloudDefendSecuritySolutionContext } from './types'; export { getSecuritySolutionLink } from './common/navigation/security_solution_links'; +export { CLOUD_DEFEND_BASE_PATH } from './common/navigation/constants'; export type { CloudDefendPageId } from './common/navigation/types'; // This exports static code and TypeScript types, diff --git a/x-pack/solutions/security/plugins/security_solution/common/constants.ts b/x-pack/solutions/security/plugins/security_solution/common/constants.ts index c7a57adad554f..78a401afee264 100644 --- a/x-pack/solutions/security/plugins/security_solution/common/constants.ts +++ b/x-pack/solutions/security/plugins/security_solution/common/constants.ts @@ -126,6 +126,7 @@ export const NETWORK_PATH = '/network' as const; export const MANAGEMENT_PATH = '/administration' as const; export const COVERAGE_OVERVIEW_PATH = '/rules_coverage_overview' as const; export const THREAT_INTELLIGENCE_PATH = '/threat_intelligence' as const; +export const CLOUD_DEFEND_PATH = '/cloud_defend' as const; export const ENDPOINTS_PATH = `${MANAGEMENT_PATH}/endpoints` as const; export const POLICIES_PATH = `${MANAGEMENT_PATH}/policy` as const; export const ENDPOINT_EXCEPTIONS_PATH = `${MANAGEMENT_PATH}/endpoint_exceptions` as const; diff --git a/x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx b/x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx new file mode 100644 index 0000000000000..994ca883ed2c4 --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { SVGProps } from 'react'; +import React from 'react'; +export const IconEcctl: React.FC> = ({ ...props }) => ( + + + + + + +); + +// eslint-disable-next-line import/no-default-export +export default IconEcctl; diff --git a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/index.ts b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/index.ts index 48b89223de096..4ec2329d36bd5 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/index.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/index.ts @@ -6,11 +6,12 @@ */ import type { SecuritySubPlugin } from '../app/types'; +import { routes } from './routes'; export class CloudDefend { public setup() {} public start(): SecuritySubPlugin { - return { routes: [] }; + return { routes }; } } diff --git a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/links.ts b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/links.ts new file mode 100644 index 0000000000000..cbc0a710a7ba1 --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/links.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { getSecuritySolutionLink } from '@kbn/cloud-defend-plugin/public'; +import { i18n } from '@kbn/i18n'; +import type { SecurityPageName } from '../../common/constants'; +import { SECURITY_FEATURE_ID } from '../../common/constants'; +import type { LinkItem } from '../common/links/types'; +import { IconCloudDefend } from '../common/icons/cloud_defend'; + +const commonLinkProperties: Partial = { + hideTimeline: true, + capabilities: [`${SECURITY_FEATURE_ID}.show`], +}; + +export const cloudDefendLink: LinkItem = { + ...getSecuritySolutionLink('policies'), + description: i18n.translate('xpack.securitySolution.appLinks.cloudDefendPoliciesDescription', { + defaultMessage: + 'Secure container workloads in Kubernetes from attacks and drift through granular and flexible runtime policies.', + }), + landingIcon: IconCloudDefend, + ...commonLinkProperties, +}; diff --git a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx new file mode 100644 index 0000000000000..18bd7641addf3 --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { + CloudDefendPageId, + CloudDefendSecuritySolutionContext, +} from '@kbn/cloud-defend-plugin/public'; +import { CLOUD_DEFEND_BASE_PATH } from '@kbn/cloud-defend-plugin/public'; +import type { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; +import { useKibana } from '../common/lib/kibana'; +import { SecuritySolutionPageWrapper } from '../common/components/page_wrapper'; +import { SpyRoute } from '../common/utils/route/spy_routes'; +import { FiltersGlobal } from '../common/components/filters_global'; +import { PluginTemplateWrapper } from '../common/components/plugin_template_wrapper'; + +// This exists only for the type signature cast +const CloudDefendSpyRoute = ({ pageName, ...rest }: { pageName?: CloudDefendPageId }) => ( + +); + +const cloudDefendSecuritySolutionContext: CloudDefendSecuritySolutionContext = { + getFiltersGlobalComponent: () => FiltersGlobal, + getSpyRouteComponent: () => CloudDefendSpyRoute, +}; + +const CloudDefend = () => { + const { cloudDefend } = useKibana().services; + const CloudDefendRouter = cloudDefend.getCloudDefendRouter(); + + return ( + + + + + + ); +}; + +CloudDefend.displayName = 'CloudDefend'; + +export const routes: SecuritySubPluginRoutes = [ + { + path: CLOUD_DEFEND_BASE_PATH, + component: CloudDefend, + }, +]; diff --git a/x-pack/solutions/security/plugins/security_solution/public/common/icons/cloud_defend.tsx b/x-pack/solutions/security/plugins/security_solution/public/common/icons/cloud_defend.tsx new file mode 100644 index 0000000000000..44cd0f39250b5 --- /dev/null +++ b/x-pack/solutions/security/plugins/security_solution/public/common/icons/cloud_defend.tsx @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { SVGProps } from 'react'; +import React from 'react'; +export const IconCloudDefend: React.FC> = ({ ...props }) => ( + + + + + + + + + + + + + +); diff --git a/x-pack/solutions/security/plugins/security_solution/public/management/links.ts b/x-pack/solutions/security/plugins/security_solution/public/management/links.ts index 50af28062b84c..d6d3293828d3e 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/management/links.ts +++ b/x-pack/solutions/security/plugins/security_solution/public/management/links.ts @@ -46,6 +46,7 @@ import { import { licenseService } from '../common/hooks/use_license'; import type { LinkItem } from '../common/links/types'; import type { StartPlugins } from '../types'; +import { cloudDefendLink } from '../cloud_defend/links'; import { links as notesLink } from '../notes/links'; import { IconConsole } from '../common/icons/console'; import { IconShield } from '../common/icons/shield'; @@ -249,6 +250,7 @@ export const links: LinkItem = { skipUrlState: true, hideTimeline: true, }, + cloudDefendLink, notesLink, ], }; diff --git a/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts b/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts index 54d4acaee43d9..c9b69c322d41e 100644 --- a/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts +++ b/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts @@ -62,6 +62,7 @@ import { DISCOVER_URL, RULES_COVERAGE_URL, OSQUERY_URL, + CLOUD_DEFEND_URL, HOSTS_URL, } from '../../../urls/navigation'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; @@ -330,4 +331,8 @@ describe('Serverless side navigation links', { tags: '@serverless' }, () => { navigateFromHeaderTo(ServerlessHeaders.ENDPOINTS, true); cy.url().should('include', ENDPOINTS_URL); }); + it('navigates to the Cloud defend page', () => { + navigateFromHeaderTo(ServerlessHeaders.CLOUD_DEFEND, true); + cy.url().should('include', CLOUD_DEFEND_URL); + }); }); diff --git a/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts b/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts index 2a1e4c5d02af0..93e349b790148 100644 --- a/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts +++ b/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts @@ -15,6 +15,7 @@ export const DASHBOARDS_URL = '/app/security/dashboards'; export const ASSETS_URL = '/app/security/assets'; export const ENDPOINTS_URL = '/app/security/administration/endpoints'; +export const CLOUD_DEFEND_URL = '/app/security/cloud_defend'; export const POLICIES_URL = '/app/security/administration/policy'; export const TRUSTED_APPS_URL = '/app/security/administration/trusted_apps'; export const EVENT_FILTERS_URL = '/app/security/administration/event_filters'; From 2cfbfcbfb7f81b58f50619dde0f710d945973fd5 Mon Sep 17 00:00:00 2001 From: animehart Date: Wed, 3 Dec 2025 09:49:09 -0800 Subject: [PATCH 2/6] remove test for now --- .../cypress/e2e/explore/navigation/navigation.cy.ts | 5 ----- .../security_solution_cypress/cypress/urls/navigation.ts | 1 - 2 files changed, 6 deletions(-) diff --git a/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts b/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts index c9b69c322d41e..54d4acaee43d9 100644 --- a/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts +++ b/x-pack/solutions/security/test/security_solution_cypress/cypress/e2e/explore/navigation/navigation.cy.ts @@ -62,7 +62,6 @@ import { DISCOVER_URL, RULES_COVERAGE_URL, OSQUERY_URL, - CLOUD_DEFEND_URL, HOSTS_URL, } from '../../../urls/navigation'; import { RULES_MANAGEMENT_URL } from '../../../urls/rules_management'; @@ -331,8 +330,4 @@ describe('Serverless side navigation links', { tags: '@serverless' }, () => { navigateFromHeaderTo(ServerlessHeaders.ENDPOINTS, true); cy.url().should('include', ENDPOINTS_URL); }); - it('navigates to the Cloud defend page', () => { - navigateFromHeaderTo(ServerlessHeaders.CLOUD_DEFEND, true); - cy.url().should('include', CLOUD_DEFEND_URL); - }); }); diff --git a/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts b/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts index 93e349b790148..2a1e4c5d02af0 100644 --- a/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts +++ b/x-pack/solutions/security/test/security_solution_cypress/cypress/urls/navigation.ts @@ -15,7 +15,6 @@ export const DASHBOARDS_URL = '/app/security/dashboards'; export const ASSETS_URL = '/app/security/assets'; export const ENDPOINTS_URL = '/app/security/administration/endpoints'; -export const CLOUD_DEFEND_URL = '/app/security/cloud_defend'; export const POLICIES_URL = '/app/security/administration/policy'; export const TRUSTED_APPS_URL = '/app/security/administration/trusted_apps'; export const EVENT_FILTERS_URL = '/app/security/administration/event_filters'; From 563af9f1492c7ea21820a42d3503733f89f77b71 Mon Sep 17 00:00:00 2001 From: animehart Date: Wed, 3 Dec 2025 10:00:53 -0800 Subject: [PATCH 3/6] removed unused icon --- .../links/sections/icons/ecctl.tsx | 41 ------------------- 1 file changed, 41 deletions(-) delete mode 100644 x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx diff --git a/x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx b/x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx deleted file mode 100644 index 994ca883ed2c4..0000000000000 --- a/x-pack/solutions/security/plugins/security_solution/public/app/solution_navigation/links/sections/icons/ecctl.tsx +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import type { SVGProps } from 'react'; -import React from 'react'; -export const IconEcctl: React.FC> = ({ ...props }) => ( - - - - - - -); - -// eslint-disable-next-line import/no-default-export -export default IconEcctl; From ec73bd6d3e69e355daa75417b33860ee2d608ae8 Mon Sep 17 00:00:00 2001 From: animehart Date: Wed, 3 Dec 2025 13:56:42 -0800 Subject: [PATCH 4/6] comments --- .../public/cloud_defend/routes.tsx | 45 ++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) diff --git a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx index 18bd7641addf3..9748e48703070 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx @@ -10,7 +10,10 @@ import type { CloudDefendPageId, CloudDefendSecuritySolutionContext, } from '@kbn/cloud-defend-plugin/public'; +import { css } from '@emotion/react'; import { CLOUD_DEFEND_BASE_PATH } from '@kbn/cloud-defend-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiEmptyPrompt, EuiFlexGroup } from '@elastic/eui'; import type { SecurityPageName, SecuritySubPluginRoutes } from '../app/types'; import { useKibana } from '../common/lib/kibana'; import { SecuritySolutionPageWrapper } from '../common/components/page_wrapper'; @@ -29,8 +32,48 @@ const cloudDefendSecuritySolutionContext: CloudDefendSecuritySolutionContext = { }; const CloudDefend = () => { - const { cloudDefend } = useKibana().services; + const { cloudDefend, cloud } = useKibana().services; const CloudDefendRouter = cloudDefend.getCloudDefendRouter(); + const isServerless: boolean = cloud?.isServerlessEnabled; + + // Remove this once Cloud Defend Billing works + if (isServerless) { + return ( + + + + + + + } + body={ +

+ +

+ } + /> +
+
+
+ ); + } return ( From 2f3735b2010dba636448faf8ff520e8784b7656b Mon Sep 17 00:00:00 2001 From: animehart Date: Wed, 3 Dec 2025 14:28:20 -0800 Subject: [PATCH 5/6] ci fix --- .../security_solution/public/cloud_defend/routes.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx index 9748e48703070..a7a0d55a0126d 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx @@ -34,7 +34,7 @@ const cloudDefendSecuritySolutionContext: CloudDefendSecuritySolutionContext = { const CloudDefend = () => { const { cloudDefend, cloud } = useKibana().services; const CloudDefendRouter = cloudDefend.getCloudDefendRouter(); - const isServerless: boolean = cloud?.isServerlessEnabled; + const isServerless: boolean = cloud?.isServerlessEnabled ?? false; // Remove this once Cloud Defend Billing works if (isServerless) { @@ -55,7 +55,7 @@ const CloudDefend = () => { title={

@@ -63,7 +63,7 @@ const CloudDefend = () => { body={

From 567aff74aedbc3b14cf386854052f7d63ecf799f Mon Sep 17 00:00:00 2001 From: animehart Date: Wed, 3 Dec 2025 14:37:39 -0800 Subject: [PATCH 6/6] updated title --- .../plugins/security_solution/public/cloud_defend/routes.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx index a7a0d55a0126d..de3e6cd97eb0f 100644 --- a/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx +++ b/x-pack/solutions/security/plugins/security_solution/public/cloud_defend/routes.tsx @@ -64,7 +64,7 @@ const CloudDefend = () => {

}