mirror of
https://github.com/elastic/kibana.git
synced 2025-04-23 17:28:26 -04:00
# Backport This will backport the following commits from `main` to `8.15`: - [[Entity Analytics] Remove links to legacy risk scoring docs (#187585)](https://github.com/elastic/kibana/pull/187585) <!--- Backport version: 9.4.3 --> ### Questions ? Please refer to the [Backport tool documentation](https://github.com/sqren/backport) <!--BACKPORT [{"author":{"name":"Mark Hopkin","email":"mark.hopkin@elastic.co"},"sourceCommit":{"committedDate":"2024-07-11T10:43:51Z","message":"[Entity Analytics] Remove links to legacy risk scoring docs (#187585)\n\n## Summary\r\n\r\nRelated to https://github.com/elastic/security-docs/issues/5489. We had\r\na few places where we incorrectly link to the legacy\r\nuser/host risk scoring docs. \r\n\r\nIn deleting the links I found we had two `RiskSummary` components which\r\ncomponents which I have renamed `RiskSummaryPanel` and\r\n`FlyoutRiskSummary` to make life easier.\r\n\r\n<img width=\"770\" alt=\"Screenshot 2024-07-04 at 15 47 14\"\r\nsrc=\"20e26a15
-4975-4165-9c56-bb328c508bee\">\r\n\r\n---------\r\n\r\nCo-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>","sha":"12bd8fe53ac94e36fc40bad167250390111d122f","branchLabelMapping":{"^v8.16.0$":"main","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["release_note:fix","backport:prev-minor","Team:Entity Analytics","v8.16.0"],"title":"[Entity Analytics] Remove links to legacy risk scoring docs","number":187585,"url":"https://github.com/elastic/kibana/pull/187585","mergeCommit":{"message":"[Entity Analytics] Remove links to legacy risk scoring docs (#187585)\n\n## Summary\r\n\r\nRelated to https://github.com/elastic/security-docs/issues/5489. We had\r\na few places where we incorrectly link to the legacy\r\nuser/host risk scoring docs. \r\n\r\nIn deleting the links I found we had two `RiskSummary` components which\r\ncomponents which I have renamed `RiskSummaryPanel` and\r\n`FlyoutRiskSummary` to make life easier.\r\n\r\n<img width=\"770\" alt=\"Screenshot 2024-07-04 at 15 47 14\"\r\nsrc=\"20e26a15
-4975-4165-9c56-bb328c508bee\">\r\n\r\n---------\r\n\r\nCo-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>","sha":"12bd8fe53ac94e36fc40bad167250390111d122f"}},"sourceBranch":"main","suggestedTargetBranches":[],"targetPullRequestStates":[{"branch":"main","label":"v8.16.0","branchLabelMappingKey":"^v8.16.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/187585","number":187585,"mergeCommit":{"message":"[Entity Analytics] Remove links to legacy risk scoring docs (#187585)\n\n## Summary\r\n\r\nRelated to https://github.com/elastic/security-docs/issues/5489. We had\r\na few places where we incorrectly link to the legacy\r\nuser/host risk scoring docs. \r\n\r\nIn deleting the links I found we had two `RiskSummary` components which\r\ncomponents which I have renamed `RiskSummaryPanel` and\r\n`FlyoutRiskSummary` to make life easier.\r\n\r\n<img width=\"770\" alt=\"Screenshot 2024-07-04 at 15 47 14\"\r\nsrc=\"20e26a15
-4975-4165-9c56-bb328c508bee\">\r\n\r\n---------\r\n\r\nCo-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>","sha":"12bd8fe53ac94e36fc40bad167250390111d122f"}}]}] BACKPORT--> Co-authored-by: Mark Hopkin <mark.hopkin@elastic.co>
This commit is contained in:
parent
109901226d
commit
4f933407df
27 changed files with 106 additions and 133 deletions
|
@ -488,8 +488,6 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D
|
|||
ruleUiAdvancedParams: `${SECURITY_SOLUTION_DOCS}rules-ui-create.html#rule-ui-advanced-params`,
|
||||
entityAnalytics: {
|
||||
riskScorePrerequisites: `${SECURITY_SOLUTION_DOCS}ers-requirements.html`,
|
||||
hostRiskScore: `${SECURITY_SOLUTION_DOCS}host-risk-score.html`,
|
||||
userRiskScore: `${SECURITY_SOLUTION_DOCS}user-risk-score.html`,
|
||||
entityRiskScoring: `${SECURITY_SOLUTION_DOCS}entity-risk-scoring.html`,
|
||||
assetCriticality: `${SECURITY_SOLUTION_DOCS}asset-criticality.html`,
|
||||
},
|
||||
|
|
|
@ -360,8 +360,6 @@ export interface DocLinks {
|
|||
readonly ruleUiAdvancedParams: string;
|
||||
readonly entityAnalytics: {
|
||||
readonly riskScorePrerequisites: string;
|
||||
readonly hostRiskScore: string;
|
||||
readonly userRiskScore: string;
|
||||
readonly entityRiskScoring: string;
|
||||
readonly assetCriticality: string;
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@ import type {
|
|||
TimelineEventsDetailsItem,
|
||||
RiskSeverity,
|
||||
} from '../../../../../common/search_strategy';
|
||||
import { RiskSummary } from '../../../../entity_analytics/components/risk_summary';
|
||||
import { RiskSummaryPanel } from '../../../../entity_analytics/components/risk_summary_panel';
|
||||
import { EnrichmentSummary } from './enrichment_summary';
|
||||
import { RiskScoreEntity } from '../../../../../common/search_strategy';
|
||||
import { useHasSecurityCapability } from '../../../../helper_hooks';
|
||||
|
@ -137,7 +137,7 @@ const ThreatSummaryViewComponent: React.FC<{
|
|||
{hasEntityAnalyticsCapability && (
|
||||
<>
|
||||
<EuiFlexItem grow={false}>
|
||||
<RiskSummary
|
||||
<RiskSummaryPanel
|
||||
riskEntity={RiskScoreEntity.host}
|
||||
risk={hostRisk}
|
||||
originalRisk={originalHostRisk}
|
||||
|
@ -145,7 +145,7 @@ const ThreatSummaryViewComponent: React.FC<{
|
|||
</EuiFlexItem>
|
||||
|
||||
<EuiFlexItem grow={false}>
|
||||
<RiskSummary
|
||||
<RiskSummaryPanel
|
||||
riskEntity={RiskScoreEntity.user}
|
||||
risk={userRisk}
|
||||
originalRisk={originalUserRisk}
|
||||
|
|
|
@ -11,7 +11,7 @@ import { useCheckSignalIndex } from '../../../detections/containers/detection_en
|
|||
import type { inputsModel } from '../../../common/store';
|
||||
import { RiskScoreHeaderTitle } from '../risk_score_onboarding/risk_score_header_title';
|
||||
import { HeaderSection } from '../../../common/components/header_section';
|
||||
import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link';
|
||||
import { EntityAnalyticsLearnMoreLink } from '../risk_score_onboarding/entity_analytics_doc_link';
|
||||
import { RiskScoreEnableButton } from '../risk_score_onboarding/risk_score_enable_button';
|
||||
import * as i18n from './translations';
|
||||
|
||||
|
@ -55,7 +55,7 @@ const EnableRiskScoreComponent = ({
|
|||
<>
|
||||
{text.body}
|
||||
{` `}
|
||||
<RiskScoreDocLink riskScoreEntity={entityType} />
|
||||
<EntityAnalyticsLearnMoreLink />
|
||||
</>
|
||||
}
|
||||
actions={
|
||||
|
|
|
@ -25,14 +25,6 @@ export const VIEW_ALL = i18n.translate(
|
|||
}
|
||||
);
|
||||
|
||||
export const LEARN_MORE = (riskEntity?: RiskScoreEntity) =>
|
||||
i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.learnMore', {
|
||||
defaultMessage: 'Learn more about {riskEntity} risk',
|
||||
values: {
|
||||
riskEntity: getRiskEntityTranslation(riskEntity, true),
|
||||
},
|
||||
});
|
||||
|
||||
export const LAST_UPDATED = i18n.translate(
|
||||
'xpack.securitySolution.entityAnalytics.riskDashboard.lastUpdatedTitle',
|
||||
{
|
||||
|
|
|
@ -37,7 +37,7 @@ import {
|
|||
CriticalityLevels,
|
||||
CriticalityModifiers,
|
||||
} from '../../../../common/entity_analytics/asset_criticality';
|
||||
import { RiskScoreDocLink } from '../risk_score_onboarding/risk_score_doc_link';
|
||||
import { EntityAnalyticsLearnMoreLink } from '../risk_score_onboarding/entity_analytics_doc_link';
|
||||
import { BETA } from '../risk_score_onboarding/translations';
|
||||
import { AssetCriticalityBadge } from '../asset_criticality';
|
||||
|
||||
|
@ -262,14 +262,7 @@ export const RiskInformationFlyout = ({ handleOnClose }: { handleOnClose: () =>
|
|||
</SpacedOrderedList>
|
||||
</EuiText>
|
||||
<EuiSpacer size="m" />
|
||||
<RiskScoreDocLink
|
||||
title={
|
||||
<FormattedMessage
|
||||
id="xpack.securitySolution.riskInformation.learnMore"
|
||||
defaultMessage="Learn more about Entity risk"
|
||||
/>
|
||||
}
|
||||
/>
|
||||
<EntityAnalyticsLearnMoreLink />
|
||||
</EuiFlyoutBody>
|
||||
|
||||
<EuiFlyoutFooter>
|
||||
|
|
|
@ -40,6 +40,13 @@ export const RISK_SCORE_TITLE = (riskEntity: RiskScoreEntity) =>
|
|||
},
|
||||
});
|
||||
|
||||
export const RISK_SCORING_TITLE = i18n.translate(
|
||||
'xpack.securitySolution.riskScore.overview.riskScoringTitle',
|
||||
{
|
||||
defaultMessage: 'Entity Risk Scoring',
|
||||
}
|
||||
);
|
||||
|
||||
export const ENTITY_RISK_LEVEL = (riskEntity: RiskScoreEntity) =>
|
||||
i18n.translate('xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle', {
|
||||
defaultMessage: '{riskEntity} risk level',
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
/*
|
||||
* 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 { EuiLink } from '@elastic/eui';
|
||||
import { FormattedMessage } from '@kbn/i18n-react';
|
||||
import React from 'react';
|
||||
import { useKibana } from '../../../common/lib/kibana';
|
||||
|
||||
const EntityAnalyticsLearnMoreLinkComponent = ({ title }: { title?: string | React.ReactNode }) => {
|
||||
const { docLinks } = useKibana().services;
|
||||
const entityAnalyticsLinks = docLinks.links.securitySolution.entityAnalytics;
|
||||
|
||||
return (
|
||||
<EuiLink
|
||||
target="_blank"
|
||||
rel="noopener nofollow noreferrer"
|
||||
href={entityAnalyticsLinks.entityRiskScoring}
|
||||
>
|
||||
{title ? (
|
||||
title
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id="xpack.securitySolution.entityAnalytics.learnMore"
|
||||
defaultMessage="Learn more about entity risk scoring"
|
||||
/>
|
||||
)}
|
||||
</EuiLink>
|
||||
);
|
||||
};
|
||||
|
||||
export const EntityAnalyticsLearnMoreLink = React.memo(EntityAnalyticsLearnMoreLinkComponent);
|
||||
|
||||
EntityAnalyticsLearnMoreLink.displayName = 'EntityAnalyticsLearnMoreLink';
|
|
@ -1,46 +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 { EuiLink } from '@elastic/eui';
|
||||
import React, { useMemo } from 'react';
|
||||
import { RiskScoreEntity } from '../../../../common/search_strategy';
|
||||
import { useKibana } from '../../../common/lib/kibana';
|
||||
import { LEARN_MORE } from '../entity_analytics_risk_score/translations';
|
||||
|
||||
const useLearnMoreLinkForEntity = (riskScoreEntity?: RiskScoreEntity) => {
|
||||
const { docLinks } = useKibana().services;
|
||||
const entityAnalyticsLinks = docLinks.links.securitySolution.entityAnalytics;
|
||||
return useMemo(() => {
|
||||
if (!riskScoreEntity) {
|
||||
return entityAnalyticsLinks.entityRiskScoring;
|
||||
}
|
||||
if (riskScoreEntity === RiskScoreEntity.user) {
|
||||
return entityAnalyticsLinks.userRiskScore;
|
||||
}
|
||||
return entityAnalyticsLinks.hostRiskScore;
|
||||
}, [riskScoreEntity, entityAnalyticsLinks]);
|
||||
};
|
||||
|
||||
const RiskScoreDocLinkComponent = ({
|
||||
riskScoreEntity,
|
||||
title,
|
||||
}: {
|
||||
riskScoreEntity?: RiskScoreEntity;
|
||||
title?: string | React.ReactNode;
|
||||
}) => {
|
||||
const learnMoreLink = useLearnMoreLinkForEntity(riskScoreEntity);
|
||||
|
||||
return (
|
||||
<EuiLink target="_blank" rel="noopener nofollow noreferrer" href={learnMoreLink}>
|
||||
{title ? title : LEARN_MORE(riskScoreEntity)}
|
||||
</EuiLink>
|
||||
);
|
||||
};
|
||||
|
||||
export const RiskScoreDocLink = React.memo(RiskScoreDocLinkComponent);
|
||||
|
||||
RiskScoreDocLink.displayName = 'RiskScoreDocLink';
|
|
@ -36,7 +36,7 @@ const RiskScoreEnableButtonComponent = ({
|
|||
}) => {
|
||||
const spaceId = useSpaceId();
|
||||
const { http, dashboard, ...startServices } = useKibana().services;
|
||||
const { renderDocLink, renderDashboardLink } = useRiskScoreToastContent(riskScoreEntity);
|
||||
const { renderDocLink, renderDashboardLink } = useRiskScoreToastContent();
|
||||
const { fetch, isLoading } = useFetch(REQUEST_NAMES.ENABLE_RISK_SCORE, installRiskScoreModule);
|
||||
const isRiskEngineEnabled = useIsExperimentalFeatureEnabled('riskScoringRoutesEnabled');
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ const RiskScoreRestartButtonComponent = ({
|
|||
);
|
||||
const spaceId = useSpaceId();
|
||||
|
||||
const { renderDocLink } = useRiskScoreToastContent(riskScoreEntity);
|
||||
const { renderDocLink } = useRiskScoreToastContent();
|
||||
const { http, ...startServices } = useKibana().services;
|
||||
|
||||
const onClick = useCallback(async () => {
|
||||
|
|
|
@ -10,21 +10,20 @@ import React, { useCallback, useMemo } from 'react';
|
|||
import styled from 'styled-components';
|
||||
import { FormattedMessage } from '@kbn/i18n-react';
|
||||
|
||||
import type { RiskScoreEntity } from '../../../../common/search_strategy';
|
||||
import { RiskScoreDocLink } from './risk_score_doc_link';
|
||||
import { EntityAnalyticsLearnMoreLink } from './entity_analytics_doc_link';
|
||||
|
||||
const StyledButton = styled(EuiButton)`
|
||||
float: right;
|
||||
`;
|
||||
|
||||
export const useRiskScoreToastContent = (riskScoreEntity: RiskScoreEntity) => {
|
||||
export const useRiskScoreToastContent = () => {
|
||||
const renderDocLink = useCallback(
|
||||
(message: string) => (
|
||||
<>
|
||||
{message} <RiskScoreDocLink riskScoreEntity={riskScoreEntity} />
|
||||
{message} <EntityAnalyticsLearnMoreLink />
|
||||
</>
|
||||
),
|
||||
[riskScoreEntity]
|
||||
[]
|
||||
);
|
||||
const renderDashboardLink = useCallback(
|
||||
(message: string, targetUrl: string) => (
|
||||
|
|
|
@ -10,11 +10,11 @@ import type { Story } from '@storybook/react';
|
|||
import { TestProvider } from '@kbn/expandable-flyout/src/test/provider';
|
||||
import { StorybookProviders } from '../../../common/mock/storybook_providers';
|
||||
import { mockRiskScoreState } from '../../../timelines/components/side_panel/new_user_detail/__mocks__';
|
||||
import { RiskSummary } from './risk_summary';
|
||||
import { FlyoutRiskSummary } from './risk_summary';
|
||||
|
||||
export default {
|
||||
component: RiskSummary,
|
||||
title: 'Components/RiskSummary',
|
||||
component: FlyoutRiskSummary,
|
||||
title: 'Components/FlyoutRiskSummary',
|
||||
};
|
||||
|
||||
export const Default: Story<void> = () => {
|
||||
|
@ -22,7 +22,7 @@ export const Default: Story<void> = () => {
|
|||
<StorybookProviders>
|
||||
<TestProvider>
|
||||
<div style={{ maxWidth: '300px' }}>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
openDetailsPanel={() => {}}
|
||||
riskScoreData={{ ...mockRiskScoreState, data: [] }}
|
||||
queryId={'testQuery'}
|
||||
|
@ -39,7 +39,7 @@ export const PreviewMode: Story<void> = () => {
|
|||
<StorybookProviders>
|
||||
<TestProvider>
|
||||
<div style={{ maxWidth: '300px' }}>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={{ ...mockRiskScoreState, data: [] }}
|
||||
queryId={'testQuery'}
|
||||
recalculatingScore={false}
|
||||
|
|
|
@ -12,7 +12,7 @@ import {
|
|||
import { render } from '@testing-library/react';
|
||||
import React from 'react';
|
||||
import { TestProviders } from '../../../common/mock';
|
||||
import { RiskSummary } from './risk_summary';
|
||||
import { FlyoutRiskSummary } from './risk_summary';
|
||||
import type {
|
||||
LensAttributes,
|
||||
VisualizationEmbeddableProps,
|
||||
|
@ -37,7 +37,7 @@ jest.mock('@kbn/kibana-react-plugin/public', () => {
|
|||
};
|
||||
});
|
||||
|
||||
describe('RiskSummary', () => {
|
||||
describe('FlyoutRiskSummary', () => {
|
||||
beforeEach(() => {
|
||||
mockVisualizationEmbeddable.mockClear();
|
||||
});
|
||||
|
@ -45,7 +45,7 @@ describe('RiskSummary', () => {
|
|||
it('renders risk summary table with alerts only', () => {
|
||||
const { getByTestId, queryByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockHostRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -76,7 +76,7 @@ describe('RiskSummary', () => {
|
|||
|
||||
const { getByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockHostRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -108,7 +108,7 @@ describe('RiskSummary', () => {
|
|||
it('renders risk summary table when riskScoreData is empty', () => {
|
||||
const { getByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={{ ...mockHostRiskScoreState, data: undefined }}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -122,7 +122,7 @@ describe('RiskSummary', () => {
|
|||
it('risk summary header does not render link when riskScoreData is loading', () => {
|
||||
const { queryByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={{ ...mockHostRiskScoreState, data: undefined, loading: true }}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -137,7 +137,7 @@ describe('RiskSummary', () => {
|
|||
it('risk summary header does not render expand icon when in preview mode', () => {
|
||||
const { queryByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={{ ...mockHostRiskScoreState, data: undefined, loading: true }}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -154,7 +154,7 @@ describe('RiskSummary', () => {
|
|||
it('renders visualization embeddable', () => {
|
||||
const { getByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockHostRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -169,7 +169,7 @@ describe('RiskSummary', () => {
|
|||
it('renders updated at', () => {
|
||||
const { getByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockHostRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -184,7 +184,7 @@ describe('RiskSummary', () => {
|
|||
it('builds lens attributes for host risk score', () => {
|
||||
render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockHostRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -211,7 +211,7 @@ describe('RiskSummary', () => {
|
|||
it('builds lens cases attachment metadata for host risk score', () => {
|
||||
render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockHostRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -233,7 +233,7 @@ describe('RiskSummary', () => {
|
|||
it('builds lens cases attachment metadata for user risk score', () => {
|
||||
render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockUserRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
@ -255,7 +255,7 @@ describe('RiskSummary', () => {
|
|||
it('builds lens attributes for user risk score', () => {
|
||||
render(
|
||||
<TestProviders>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={mockUserRiskScoreState}
|
||||
queryId={'testQuery'}
|
||||
openDetailsPanel={() => {}}
|
||||
|
|
|
@ -55,7 +55,7 @@ export interface RiskSummaryProps<T extends RiskScoreEntity> {
|
|||
isPreviewMode?: boolean;
|
||||
}
|
||||
|
||||
const RiskSummaryComponent = <T extends RiskScoreEntity>({
|
||||
const FlyoutRiskSummaryComponent = <T extends RiskScoreEntity>({
|
||||
riskScoreData,
|
||||
recalculatingScore,
|
||||
queryId,
|
||||
|
@ -287,5 +287,5 @@ const RiskSummaryComponent = <T extends RiskScoreEntity>({
|
|||
);
|
||||
};
|
||||
|
||||
export const RiskSummary = React.memo(RiskSummaryComponent);
|
||||
RiskSummary.displayName = 'RiskSummary';
|
||||
export const FlyoutRiskSummary = React.memo(FlyoutRiskSummaryComponent);
|
||||
FlyoutRiskSummary.displayName = 'RiskSummary';
|
||||
|
|
|
@ -9,9 +9,9 @@ import React from 'react';
|
|||
|
||||
import { render } from '@testing-library/react';
|
||||
import { TestProviders } from '../../common/mock';
|
||||
import type { RiskEntity } from './risk_summary';
|
||||
import type { RiskEntity } from './risk_summary_panel';
|
||||
import * as i18n from '../../common/components/event_details/cti_details/translations';
|
||||
import { RiskSummary } from './risk_summary';
|
||||
import { RiskSummaryPanel } from './risk_summary_panel';
|
||||
import { RiskScoreEntity, RiskSeverity } from '../../../common/search_strategy';
|
||||
import { getEmptyValue } from '../../common/components/empty_value';
|
||||
|
||||
|
@ -46,7 +46,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])(
|
|||
|
||||
const { getByText } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary {...props} />
|
||||
<RiskSummaryPanel {...props} />
|
||||
</TestProviders>
|
||||
);
|
||||
|
||||
|
@ -67,7 +67,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])(
|
|||
} as RiskEntity;
|
||||
const { getByTestId } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary {...props} />
|
||||
<RiskSummaryPanel {...props} />
|
||||
</TestProviders>
|
||||
);
|
||||
|
||||
|
@ -86,7 +86,7 @@ describe.each([RiskScoreEntity.host, RiskScoreEntity.user])(
|
|||
} as RiskEntity;
|
||||
const { getByText } = render(
|
||||
<TestProviders>
|
||||
<RiskSummary {...props} />
|
||||
<RiskSummaryPanel {...props} />
|
||||
</TestProviders>
|
||||
);
|
||||
|
|
@ -17,7 +17,7 @@ import { RiskScoreLevel } from './severity/common';
|
|||
import type { RiskSeverity } from '../../../common/search_strategy';
|
||||
import { RiskScoreEntity } from '../../../common/search_strategy';
|
||||
import { getEmptyValue } from '../../common/components/empty_value';
|
||||
import { RiskScoreDocLink } from './risk_score_onboarding/risk_score_doc_link';
|
||||
import { EntityAnalyticsLearnMoreLink } from './risk_score_onboarding/entity_analytics_doc_link';
|
||||
import { RiskScoreHeaderTitle } from './risk_score_onboarding/risk_score_header_title';
|
||||
import type { HostRisk, UserRisk } from '../api/types';
|
||||
|
||||
|
@ -35,7 +35,7 @@ interface UserRiskEntity {
|
|||
|
||||
export type RiskEntity = HostRiskEntity | UserRiskEntity;
|
||||
|
||||
const RiskSummaryComponent: React.FC<RiskEntity> = ({ risk, riskEntity, originalRisk }) => {
|
||||
const RiskSummaryPanelComponent: React.FC<RiskEntity> = ({ risk, riskEntity, originalRisk }) => {
|
||||
const currentRiskScore =
|
||||
riskEntity === RiskScoreEntity.host
|
||||
? risk?.result?.[0]?.host?.risk?.calculated_level
|
||||
|
@ -64,10 +64,7 @@ const RiskSummaryComponent: React.FC<RiskEntity> = ({ risk, riskEntity, original
|
|||
values={{
|
||||
riskEntity,
|
||||
riskScoreDocumentationLink: (
|
||||
<RiskScoreDocLink
|
||||
riskScoreEntity={riskEntity}
|
||||
title={i18n.RISK_SCORE_TITLE(riskEntity)}
|
||||
/>
|
||||
<EntityAnalyticsLearnMoreLink title={i18n.RISK_SCORING_TITLE} />
|
||||
),
|
||||
}}
|
||||
/>
|
||||
|
@ -103,4 +100,4 @@ const RiskSummaryComponent: React.FC<RiskEntity> = ({ risk, riskEntity, original
|
|||
</>
|
||||
);
|
||||
};
|
||||
export const RiskSummary = React.memo(RiskSummaryComponent);
|
||||
export const RiskSummaryPanel = React.memo(RiskSummaryPanelComponent);
|
|
@ -187,7 +187,7 @@ export const HostEntityOverview: React.FC<HostEntityOverviewProps> = ({ hostName
|
|||
<EuiFlexGroup alignItems="flexEnd" gutterSize="none" responsive={false}>
|
||||
<EuiFlexItem grow={false}>{HOST_RISK_LEVEL}</EuiFlexItem>
|
||||
<EuiFlexItem grow={false}>
|
||||
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.host} />
|
||||
<RiskScoreDocTooltip />
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
),
|
||||
|
|
|
@ -187,7 +187,7 @@ export const UserEntityOverview: React.FC<UserEntityOverviewProps> = ({ userName
|
|||
<EuiFlexGroup alignItems="flexEnd" gutterSize="none" responsive={false}>
|
||||
<EuiFlexItem grow={false}>{USER_RISK_LEVEL}</EuiFlexItem>
|
||||
<EuiFlexItem grow={false}>
|
||||
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.user} />
|
||||
<RiskScoreDocTooltip />
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
),
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
import React from 'react';
|
||||
import { EuiHorizontalRule } from '@elastic/eui';
|
||||
import { AssetCriticalityAccordion } from '../../../entity_analytics/components/asset_criticality/asset_criticality_selector';
|
||||
import { RiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
|
||||
import { FlyoutRiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
|
||||
import type { RiskScoreState } from '../../../entity_analytics/api/hooks/use_risk_score';
|
||||
import type { RiskScoreEntity, HostItem } from '../../../../common/search_strategy';
|
||||
import { FlyoutBody } from '../../shared/components/flyout_body';
|
||||
|
@ -49,7 +49,7 @@ export const HostPanelContent = ({
|
|||
<FlyoutBody>
|
||||
{riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && (
|
||||
<>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={riskScoreState}
|
||||
recalculatingScore={recalculatingScore}
|
||||
queryId={HOST_PANEL_RISK_SCORE_QUERY_ID}
|
||||
|
|
|
@ -12,7 +12,7 @@ import { useIsExperimentalFeatureEnabled } from '../../../common/hooks/use_exper
|
|||
import { AssetCriticalityAccordion } from '../../../entity_analytics/components/asset_criticality/asset_criticality_selector';
|
||||
|
||||
import { OBSERVED_USER_QUERY_ID } from '../../../explore/users/containers/users/observed_details';
|
||||
import { RiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
|
||||
import { FlyoutRiskSummary } from '../../../entity_analytics/components/risk_summary_flyout/risk_summary';
|
||||
import type { RiskScoreState } from '../../../entity_analytics/api/hooks/use_risk_score';
|
||||
import { ManagedUser } from '../../../timelines/components/side_panel/new_user_detail/managed_user';
|
||||
import type { ManagedUserData } from '../../../timelines/components/side_panel/new_user_detail/types';
|
||||
|
@ -58,7 +58,7 @@ export const UserPanelContent = ({
|
|||
<FlyoutBody>
|
||||
{riskScoreState.isModuleEnabled && riskScoreState.data?.length !== 0 && (
|
||||
<>
|
||||
<RiskSummary
|
||||
<FlyoutRiskSummary
|
||||
riskScoreData={riskScoreState}
|
||||
recalculatingScore={recalculatingScore}
|
||||
queryId={USER_PANEL_RISK_SCORE_QUERY_ID}
|
||||
|
|
|
@ -8,14 +8,14 @@
|
|||
import { EuiButtonIcon, EuiPopover, EuiPopoverTitle, EuiText } from '@elastic/eui';
|
||||
import React, { useCallback, useState } from 'react';
|
||||
import * as i18n from './translations';
|
||||
import { RiskScoreDocLink } from '../../entity_analytics/components/risk_score_onboarding/risk_score_doc_link';
|
||||
import type { RiskScoreEntity } from '../../../common/entity_analytics/risk_engine';
|
||||
import { EntityAnalyticsLearnMoreLink } from '../../entity_analytics/components/risk_score_onboarding/entity_analytics_doc_link';
|
||||
|
||||
export const RiskScoreInfoTooltip: React.FC<{
|
||||
toolTipContent: React.ReactNode;
|
||||
toolTipTitle?: React.ReactNode;
|
||||
width?: number;
|
||||
}> = ({ toolTipContent, toolTipTitle, width = 270 }) => {
|
||||
anchorPosition?: EuiPopover['props']['anchorPosition'];
|
||||
}> = ({ toolTipContent, toolTipTitle, width = 270, anchorPosition = 'leftCenter' }) => {
|
||||
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
|
||||
|
||||
const onClick = useCallback(() => {
|
||||
|
@ -30,7 +30,7 @@ export const RiskScoreInfoTooltip: React.FC<{
|
|||
<EuiPopover
|
||||
isOpen={isPopoverOpen}
|
||||
closePopover={closePopover}
|
||||
anchorPosition="leftCenter"
|
||||
anchorPosition={anchorPosition}
|
||||
button={
|
||||
<EuiButtonIcon
|
||||
color="text"
|
||||
|
@ -50,9 +50,13 @@ export const RiskScoreInfoTooltip: React.FC<{
|
|||
);
|
||||
};
|
||||
|
||||
export const RiskScoreDocTooltip = ({ riskScoreEntity }: { riskScoreEntity: RiskScoreEntity }) => (
|
||||
export const RiskScoreDocTooltip = ({
|
||||
anchorPosition,
|
||||
}: {
|
||||
anchorPosition?: React.ComponentProps<typeof RiskScoreInfoTooltip>['anchorPosition'];
|
||||
}) => (
|
||||
<RiskScoreInfoTooltip
|
||||
toolTipContent={<RiskScoreDocLink riskScoreEntity={riskScoreEntity} />}
|
||||
width={200} // Magic number to match the width of the doc link
|
||||
anchorPosition={anchorPosition}
|
||||
toolTipContent={<EntityAnalyticsLearnMoreLink />}
|
||||
/>
|
||||
);
|
||||
|
|
|
@ -158,7 +158,7 @@ export const HostOverview = React.memo<HostSummaryProps>(
|
|||
/>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem grow={false}>
|
||||
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.host} />
|
||||
<RiskScoreDocTooltip anchorPosition="upCenter" />
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
),
|
||||
|
|
|
@ -156,7 +156,7 @@ export const UserOverview = React.memo<UserSummaryProps>(
|
|||
/>
|
||||
</EuiFlexItem>
|
||||
<EuiFlexItem grow={false}>
|
||||
<RiskScoreDocTooltip riskScoreEntity={RiskScoreEntity.user} />
|
||||
<RiskScoreDocTooltip anchorPosition="upCenter" />
|
||||
</EuiFlexItem>
|
||||
</EuiFlexGroup>
|
||||
),
|
||||
|
|
|
@ -32727,7 +32727,6 @@
|
|||
"xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "{ errorCount, plural, =1 {Erreur rencontrée} other {Erreurs rencontrées}} :",
|
||||
"xpack.securitySolution.enrichment.noInvestigationEnrichment": "Aucun renseignement supplémentaire sur les menaces n'a été détecté sur la période sélectionnée. Sélectionnez une autre plage temporelle ou {link} afin de collecter des renseignements sur les menaces pour les détecter et les comparer.",
|
||||
"xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} {incompatibleJobCount, plural, =1 {tâche est actuellement indisponible} other {tâches sont actuellement indisponibles}}",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "Découvrez plus d'informations sur les risques {riskEntity}",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "Nom de {riskEntity}",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "Score de risque de {riskEntity}",
|
||||
"xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "Privilèges de cluster manquants : {privileges}.",
|
||||
|
@ -37058,7 +37057,6 @@
|
|||
"xpack.securitySolution.riskInformation.howOftenTitle": "À quelle fréquence le risque est-il calculé ?",
|
||||
"xpack.securitySolution.riskInformation.informationAriaLabel": "Informations",
|
||||
"xpack.securitySolution.riskInformation.introText": "L'analyse de risque des entités détecte les hôtes et les utilisateurs risqués à l'intérieur de votre environnement.",
|
||||
"xpack.securitySolution.riskInformation.learnMore": "Découvrez plus d'informations sur les risques des entités",
|
||||
"xpack.securitySolution.riskInformation.levelHeader": "Niveau de risque",
|
||||
"xpack.securitySolution.riskInformation.riskCalculationStep1": "Uniquement les utilisateurs et les hôtes (entités) de scores associés aux alertes de détection non fermées.",
|
||||
"xpack.securitySolution.riskInformation.riskCalculationStep2": "Génère un score de catégorie \"Alerte\" en regroupant les alertes par identificateur d'entité, afin que les alertes ayant des scores de risque plus élevés contribuent davantage que les alertes dont les scores de risque sont moins élevés.",
|
||||
|
|
|
@ -32700,7 +32700,6 @@
|
|||
"xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "次の{ errorCount, plural, other {件のエラー}}が発生しました:",
|
||||
"xpack.securitySolution.enrichment.noInvestigationEnrichment": "選択した期間内に追加の脅威情報が見つかりませんでした。別の時間枠、または{link}を試して、脅威の検出と照合のための脅威インテリジェンスを収集します。",
|
||||
"xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} {incompatibleJobCount, plural, other {件のジョブ}}が現在使用できません",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "{riskEntity}リスクの詳細",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "{riskEntity}名",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "{riskEntity}リスクレベル",
|
||||
"xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "クラスター権限が不足しています:{privileges}。",
|
||||
|
@ -37033,7 +37032,6 @@
|
|||
"xpack.securitySolution.riskInformation.howOftenTitle": "リスクを計算する頻度",
|
||||
"xpack.securitySolution.riskInformation.informationAriaLabel": "情報",
|
||||
"xpack.securitySolution.riskInformation.introText": "Entity Risk Analyticsは、環境内のリスクのあるホストとユーザーを明らかにします。",
|
||||
"xpack.securitySolution.riskInformation.learnMore": "エンティティリスクの詳細",
|
||||
"xpack.securitySolution.riskInformation.levelHeader": "リスクレベル",
|
||||
"xpack.securitySolution.riskInformation.riskCalculationStep1": "クローズされていない検出アラートに関連付けられたユーザーとホスト(エンティティ)のみスコア付けします。",
|
||||
"xpack.securitySolution.riskInformation.riskCalculationStep2": "エンティティID別にアラートを集約することで、「アラート」カテゴリスコアを生成します。リスクスコアが高いアラートがリスクスコアが低いアラートよりも大きく寄与するように設定されます。",
|
||||
|
|
|
@ -32744,7 +32744,6 @@
|
|||
"xpack.securitySolution.endpointResponseActions.actionError.errorMessage": "遇到以下{ errorCount, plural, other {错误}}:",
|
||||
"xpack.securitySolution.enrichment.noInvestigationEnrichment": "在选定时间范围内未发现其他威胁情报。请尝试不同时间范围,或 {link} 以收集威胁情报用于威胁检测和匹配。",
|
||||
"xpack.securitySolution.entityAnalytics.anomalies.moduleNotCompatibleTitle": "{incompatibleJobCount} 个{incompatibleJobCount, plural, other {作业}}当前不可用",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.learnMore": "详细了解 {riskEntity} 风险",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.nameTitle": "{riskEntity}名称",
|
||||
"xpack.securitySolution.entityAnalytics.riskDashboard.riskLevelTitle": "{riskEntity} 风险级别",
|
||||
"xpack.securitySolution.entityAnalytics.riskEngine.missingClusterPrivilege": "缺少集群权限:{privileges}。",
|
||||
|
@ -37076,7 +37075,6 @@
|
|||
"xpack.securitySolution.riskInformation.howOftenTitle": "多久计算一次风险?",
|
||||
"xpack.securitySolution.riskInformation.informationAriaLabel": "信息",
|
||||
"xpack.securitySolution.riskInformation.introText": "实体风险分析将显示您的环境中存在的有风险主机和用户。",
|
||||
"xpack.securitySolution.riskInformation.learnMore": "详细了解实体风险",
|
||||
"xpack.securitySolution.riskInformation.levelHeader": "风险级别",
|
||||
"xpack.securitySolution.riskInformation.riskCalculationStep1": "仅对与尚未关闭的检测告警关联的用户和主机(实体)评分。",
|
||||
"xpack.securitySolution.riskInformation.riskCalculationStep2": "通过按实体标识符聚合告警来生成“告警”类别分数,从而使风险分数高的告警贡献高于风险分数低的告警。",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue