x-pack/solutions/security/plugins/security_solution/server/plugin.ts (674 lines of code) (raw):

/* * 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 { Observable } from 'rxjs'; import { QUERY_RULE_TYPE_ID, SAVED_QUERY_RULE_TYPE_ID } from '@kbn/securitysolution-rules'; import type { Logger } from '@kbn/core/server'; import { SavedObjectsClient } from '@kbn/core/server'; import type { UsageCounter } from '@kbn/usage-collection-plugin/server'; import { ECS_COMPONENT_TEMPLATE_NAME } from '@kbn/alerting-plugin/server'; import { mappingFromFieldMap } from '@kbn/alerting-plugin/common'; import type { IRuleDataClient } from '@kbn/rule-registry-plugin/server'; import { Dataset } from '@kbn/rule-registry-plugin/server'; import type { ListPluginSetup } from '@kbn/lists-plugin/server'; import type { ILicense } from '@kbn/licensing-plugin/server'; import type { NewPackagePolicy, UpdatePackagePolicy } from '@kbn/fleet-plugin/common'; import { FLEET_ENDPOINT_PACKAGE } from '@kbn/fleet-plugin/common'; import { registerEntityStoreDataViewRefreshTask } from './lib/entity_analytics/entity_store/tasks/data_view_refresh/data_view_refresh_task'; import { ensureIndicesExistsForPolicies } from './endpoint/migrations/ensure_indices_exists_for_policies'; import { CompleteExternalResponseActionsTask } from './endpoint/lib/response_actions'; import { registerAgentRoutes } from './endpoint/routes/agent'; import { endpointPackagePoliciesStatsSearchStrategyProvider } from './search_strategy/endpoint_package_policies_stats'; import { turnOffPolicyProtectionsIfNotSupported } from './endpoint/migrations/turn_off_policy_protections'; import { endpointSearchStrategyProvider } from './search_strategy/endpoint'; import { getScheduleNotificationResponseActionsService } from './lib/detection_engine/rule_response_actions/schedule_notification_response_actions'; import { siemGuideId, getSiemGuideConfig } from '../common/guided_onboarding/siem_guide_config'; import { createEqlAlertType, createEsqlAlertType, createIndicatorMatchAlertType, createMlAlertType, createNewTermsAlertType, createQueryAlertType, createThresholdAlertType, } from './lib/detection_engine/rule_types'; import { initRoutes } from './routes'; import { registerLimitedConcurrencyRoutes } from './routes/limited_concurrency'; import { ManifestTask } from './endpoint/lib/artifacts'; import { CheckMetadataTransformsTask } from './endpoint/lib/metadata'; import { initSavedObjects } from './saved_objects'; import { AppClientFactory } from './client'; import type { ConfigType } from './config'; import { createConfig } from './config'; import { initUiSettings } from './ui_settings'; import { registerDeprecations } from './deprecations'; import { APP_ID, APP_UI_ID, CASE_ATTACHMENT_ENDPOINT_TYPE_ID, DEFAULT_ALERTS_INDEX, SERVER_APP_ID, } from '../common/constants'; import { registerEndpointRoutes } from './endpoint/routes/metadata'; import { registerPolicyRoutes } from './endpoint/routes/policy'; import { registerActionRoutes } from './endpoint/routes/actions'; import { registerEndpointSuggestionsRoutes } from './endpoint/routes/suggestions'; import { EndpointArtifactClient, ManifestManager, securityWorkflowInsightsService, } from './endpoint/services'; import { EndpointAppContextService } from './endpoint/endpoint_app_context_services'; import type { EndpointAppContext } from './endpoint/types'; import { initUsageCollectors } from './usage'; import type { SecuritySolutionRequestHandlerContext } from './types'; import { securitySolutionSearchStrategyProvider } from './search_strategy/security_solution'; import type { ITelemetryEventsSender } from './lib/telemetry/sender'; import { type IAsyncTelemetryEventsSender } from './lib/telemetry/async_sender.types'; import { TelemetryEventsSender } from './lib/telemetry/sender'; import { DEFAULT_QUEUE_CONFIG, DEFAULT_RETRY_CONFIG, AsyncTelemetryEventsSender, } from './lib/telemetry/async_sender'; import type { ITelemetryReceiver } from './lib/telemetry/receiver'; import { TelemetryReceiver } from './lib/telemetry/receiver'; import { licenseService } from './lib/license'; import { PolicyWatcher } from './endpoint/lib/policy/license_watch'; import previewPolicy from './lib/detection_engine/routes/index/preview_policy.json'; import type { IRuleMonitoringService } from './lib/detection_engine/rule_monitoring'; import { createRuleMonitoringService } from './lib/detection_engine/rule_monitoring'; // eslint-disable-next-line no-restricted-imports import { isLegacyNotificationRuleExecutor, legacyRulesNotificationRuleType, } from './lib/detection_engine/rule_actions_legacy'; import { createSecurityRuleTypeWrapper, securityRuleTypeFieldMap, } from './lib/detection_engine/rule_types/create_security_rule_type_wrapper'; import { RequestContextFactory } from './request_context_factory'; import type { ISecuritySolutionPlugin, PluginInitializerContext, SecuritySolutionPluginCoreSetupDependencies, SecuritySolutionPluginCoreStartDependencies, SecuritySolutionPluginSetup, SecuritySolutionPluginSetupDependencies, SecuritySolutionPluginStart, SecuritySolutionPluginStartDependencies, } from './plugin_contract'; import { featureUsageService } from './endpoint/services/feature_usage'; import { setIsElasticCloudDeployment } from './lib/telemetry/helpers'; import { artifactService } from './lib/telemetry/artifact'; import { events } from './lib/telemetry/event_based/events'; import { endpointFieldsProvider } from './search_strategy/endpoint_fields'; import { ENDPOINT_FIELDS_SEARCH_STRATEGY, ENDPOINT_PACKAGE_POLICIES_STATS_STRATEGY, ENDPOINT_SEARCH_STRATEGY, } from '../common/endpoint/constants'; import { ProductFeaturesService } from './lib/product_features_service/product_features_service'; import { registerRiskScoringTask } from './lib/entity_analytics/risk_score/tasks/risk_scoring_task'; import { registerEntityStoreFieldRetentionEnrichTask } from './lib/entity_analytics/entity_store/tasks'; import { registerProtectionUpdatesNoteRoutes } from './endpoint/routes/protection_updates_note'; import { latestRiskScoreIndexPattern, allRiskScoreIndexPattern, } from '../common/entity_analytics/risk_engine'; import { isEndpointPackageV2 } from '../common/endpoint/utils/package_v2'; import { assistantTools } from './assistant/tools'; import { turnOffAgentPolicyFeatures } from './endpoint/migrations/turn_off_agent_policy_features'; import { getCriblPackagePolicyPostCreateOrUpdateCallback } from './security_integrations'; import { scheduleEntityAnalyticsMigration } from './lib/entity_analytics/migrations'; import { SiemMigrationsService } from './lib/siem_migrations/siem_migrations_service'; import { TelemetryConfigProvider } from '../common/telemetry_config/telemetry_config_provider'; import { TelemetryConfigWatcher } from './endpoint/lib/policy/telemetry_watch'; import { registerPrivilegeMonitoringTask } from './lib/entity_analytics/privilege_monitoring/tasks/privilege_monitoring_task'; export type { SetupPlugins, StartPlugins, PluginSetup, PluginStart } from './plugin_contract'; export class Plugin implements ISecuritySolutionPlugin { private readonly pluginContext: PluginInitializerContext; private readonly config: ConfigType; private readonly logger: Logger; private readonly appClientFactory: AppClientFactory; private readonly productFeaturesService: ProductFeaturesService; private readonly ruleMonitoringService: IRuleMonitoringService; private readonly endpointAppContextService = new EndpointAppContextService(); private readonly siemMigrationsService: SiemMigrationsService; private readonly telemetryReceiver: ITelemetryReceiver; private readonly telemetryEventsSender: ITelemetryEventsSender; private readonly asyncTelemetryEventsSender: IAsyncTelemetryEventsSender; private lists: ListPluginSetup | undefined; // TODO: can we create ListPluginStart? private licensing$!: Observable<ILicense>; private policyWatcher?: PolicyWatcher; private telemetryConfigProvider: TelemetryConfigProvider; private telemetryWatcher?: TelemetryConfigWatcher; private manifestTask: ManifestTask | undefined; private completeExternalResponseActionsTask: CompleteExternalResponseActionsTask; private checkMetadataTransformsTask: CheckMetadataTransformsTask | undefined; private telemetryUsageCounter?: UsageCounter; private endpointContext: EndpointAppContext; constructor(context: PluginInitializerContext) { const serverConfig = createConfig(context); this.pluginContext = context; this.config = serverConfig; this.logger = context.logger.get(); this.appClientFactory = new AppClientFactory(); this.productFeaturesService = new ProductFeaturesService( this.logger, this.config.experimentalFeatures ); this.siemMigrationsService = new SiemMigrationsService( this.config, this.pluginContext.logger, this.pluginContext.env.packageInfo.version ); this.ruleMonitoringService = createRuleMonitoringService(this.config, this.logger); this.telemetryEventsSender = new TelemetryEventsSender(this.logger); this.asyncTelemetryEventsSender = new AsyncTelemetryEventsSender(this.logger); this.telemetryReceiver = new TelemetryReceiver(this.logger); this.telemetryConfigProvider = new TelemetryConfigProvider(); this.endpointContext = { logFactory: this.pluginContext.logger, service: this.endpointAppContextService, config: (): Promise<ConfigType> => Promise.resolve(this.config), get serverConfig() { return serverConfig; }, experimentalFeatures: this.config.experimentalFeatures, }; this.completeExternalResponseActionsTask = new CompleteExternalResponseActionsTask({ endpointAppContext: this.endpointContext, }); this.logger.debug('plugin initialized'); } public setup( core: SecuritySolutionPluginCoreSetupDependencies, plugins: SecuritySolutionPluginSetupDependencies ): SecuritySolutionPluginSetup { this.logger.debug('plugin setup'); const { appClientFactory, productFeaturesService, pluginContext, config, logger } = this; const experimentalFeatures = config.experimentalFeatures; initSavedObjects(core.savedObjects); initUiSettings(core.uiSettings, experimentalFeatures, config.enableUiSettingsValidations); productFeaturesService.init(plugins.features); events.forEach((eventConfig) => { core.analytics.registerEventType(eventConfig); }); this.ruleMonitoringService.setup(core, plugins); registerDeprecations({ core, config: this.config, logger: this.logger }); if (experimentalFeatures.riskScoringPersistence) { registerRiskScoringTask({ getStartServices: core.getStartServices, kibanaVersion: pluginContext.env.packageInfo.version, logger: this.logger, auditLogger: plugins.security?.audit.withoutRequest, taskManager: plugins.taskManager, telemetry: core.analytics, entityAnalyticsConfig: config.entityAnalytics, experimentalFeatures, }); } scheduleEntityAnalyticsMigration({ getStartServices: core.getStartServices, taskManager: plugins.taskManager, logger: this.logger, auditLogger: plugins.security?.audit.withoutRequest, kibanaVersion: pluginContext.env.packageInfo.version, }).catch((err) => { logger.error(`Error scheduling entity analytics migration: ${err}`); }); if (!experimentalFeatures.entityStoreDisabled) { registerEntityStoreFieldRetentionEnrichTask({ getStartServices: core.getStartServices, logger: this.logger, telemetry: core.analytics, taskManager: plugins.taskManager, experimentalFeatures, }); registerEntityStoreDataViewRefreshTask({ getStartServices: core.getStartServices, appClientFactory, logger: this.logger, telemetry: core.analytics, taskManager: plugins.taskManager, auditLogger: plugins.security?.audit.withoutRequest, entityStoreConfig: config.entityAnalytics.entityStore, experimentalFeatures, kibanaVersion: pluginContext.env.packageInfo.version, }); } registerPrivilegeMonitoringTask({ getStartServices: core.getStartServices, taskManager: plugins.taskManager, logger: this.logger, telemetry: core.analytics, kibanaVersion: pluginContext.env.packageInfo.version, experimentalFeatures, }); const requestContextFactory = new RequestContextFactory({ config, logger, core, plugins, endpointAppContextService: this.endpointAppContextService, ruleMonitoringService: this.ruleMonitoringService, siemMigrationsService: this.siemMigrationsService, kibanaVersion: pluginContext.env.packageInfo.version, kibanaBranch: pluginContext.env.packageInfo.branch, buildFlavor: pluginContext.env.packageInfo.buildFlavor, productFeaturesService, }); productFeaturesService.registerApiAccessControl(core.http); const router = core.http.createRouter<SecuritySolutionRequestHandlerContext>(); core.http.registerRouteHandlerContext<SecuritySolutionRequestHandlerContext, typeof APP_ID>( APP_ID, (context, request) => requestContextFactory.create(context, request) ); this.endpointAppContextService.setup({ securitySolutionRequestContextFactory: requestContextFactory, cloud: plugins.cloud, loggerFactory: this.pluginContext.logger, telemetry: core.analytics, httpServiceSetup: core.http, }); initUsageCollectors({ core, eventLogIndex: plugins.eventLog.getIndexPattern(), signalsIndex: DEFAULT_ALERTS_INDEX, ml: plugins.ml, usageCollection: plugins.usageCollection, logger, riskEngineIndexPatterns: { all: allRiskScoreIndexPattern, latest: latestRiskScoreIndexPattern, }, legacySignalsIndex: config.signalsIndex, }); this.telemetryUsageCounter = plugins.usageCollection?.createUsageCounter(APP_ID); plugins.cases.attachmentFramework.registerExternalReference({ id: CASE_ATTACHMENT_ENDPOINT_TYPE_ID, }); const { ruleDataService } = plugins.ruleRegistry; let ruleDataClient: IRuleDataClient | null = null; let previewRuleDataClient: IRuleDataClient | null = null; const ruleDataServiceOptions = { feature: SERVER_APP_ID, registrationContext: 'security', dataset: Dataset.alerts, componentTemplateRefs: [ECS_COMPONENT_TEMPLATE_NAME], componentTemplates: [ { name: 'mappings', mappings: mappingFromFieldMap(securityRuleTypeFieldMap, false), }, ], secondaryAlias: config.signalsIndex, }; ruleDataClient = ruleDataService.initializeIndex(ruleDataServiceOptions); const previewIlmPolicy = previewPolicy.policy; const isServerless = this.pluginContext.env.packageInfo.buildFlavor === 'serverless'; previewRuleDataClient = ruleDataService.initializeIndex({ ...ruleDataServiceOptions, additionalPrefix: '.preview', ilmPolicy: previewIlmPolicy, secondaryAlias: undefined, }); const securityRuleTypeOptions = { lists: plugins.lists, docLinks: core.docLinks, actions: plugins.actions, logger: this.logger, config: this.config, publicBaseUrl: core.http.basePath.publicBaseUrl, ruleDataClient, ruleExecutionLoggerFactory: this.ruleMonitoringService.createRuleExecutionLogClientForExecutors, version: pluginContext.env.packageInfo.version, experimentalFeatures: config.experimentalFeatures, alerting: plugins.alerting, analytics: core.analytics, isServerless, eventsTelemetry: this.telemetryEventsSender, licensing: plugins.licensing, scheduleNotificationResponseActionsService: getScheduleNotificationResponseActionsService({ endpointAppContextService: this.endpointAppContextService, osqueryCreateActionService: plugins.osquery?.createActionService, }), }; const securityRuleTypeWrapper = createSecurityRuleTypeWrapper(securityRuleTypeOptions); plugins.alerting.registerType(securityRuleTypeWrapper(createEqlAlertType())); if (!experimentalFeatures.esqlRulesDisabled) { plugins.alerting.registerType(securityRuleTypeWrapper(createEsqlAlertType())); } plugins.alerting.registerType( securityRuleTypeWrapper( createQueryAlertType({ id: SAVED_QUERY_RULE_TYPE_ID, name: 'Saved Query Rule', }) ) ); plugins.alerting.registerType(securityRuleTypeWrapper(createIndicatorMatchAlertType())); plugins.alerting.registerType(securityRuleTypeWrapper(createMlAlertType(plugins.ml))); plugins.alerting.registerType( securityRuleTypeWrapper( createQueryAlertType({ id: QUERY_RULE_TYPE_ID, name: 'Custom Query Rule', }) ) ); plugins.alerting.registerType(securityRuleTypeWrapper(createThresholdAlertType())); plugins.alerting.registerType(securityRuleTypeWrapper(createNewTermsAlertType())); // TODO We need to get the endpoint routes inside of initRoutes initRoutes( router, config, plugins.encryptedSavedObjects?.canEncrypt === true, plugins.security, this.telemetryEventsSender, plugins.ml, ruleDataService, logger, ruleDataClient, core.getStartServices, securityRuleTypeOptions, previewRuleDataClient, this.telemetryReceiver, isServerless, core.docLinks, this.endpointContext ); registerEndpointRoutes(router, this.endpointContext); registerEndpointSuggestionsRoutes( router, plugins.unifiedSearch.autocomplete.getInitializerContextConfig().create(), this.endpointContext ); registerLimitedConcurrencyRoutes(core); registerPolicyRoutes(router, this.endpointContext); registerProtectionUpdatesNoteRoutes(router, this.endpointContext); registerActionRoutes( router, this.endpointContext, plugins.encryptedSavedObjects?.canEncrypt === true ); registerAgentRoutes(router, this.endpointContext); if (plugins.alerting != null) { const ruleNotificationType = legacyRulesNotificationRuleType({ logger }); if (isLegacyNotificationRuleExecutor(ruleNotificationType)) { plugins.alerting.registerType(ruleNotificationType); } } const exceptionListsSetupEnabled = () => { return plugins.taskManager && plugins.lists; }; if (exceptionListsSetupEnabled()) { this.lists = plugins.lists; this.manifestTask = new ManifestTask({ endpointAppContext: this.endpointContext, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion taskManager: plugins.taskManager!, }); } if (plugins.taskManager) { this.completeExternalResponseActionsTask.setup({ taskManager: plugins.taskManager }); } core .getStartServices() .then(async ([coreStart, depsStart]) => { appClientFactory.setup({ getSpaceId: depsStart.spaces?.spacesService?.getSpaceId, config, kibanaVersion: pluginContext.env.packageInfo.version, kibanaBranch: pluginContext.env.packageInfo.branch, buildFlavor: pluginContext.env.packageInfo.buildFlavor, }); const endpointFieldsStrategy = endpointFieldsProvider( this.endpointAppContextService, depsStart.data.indexPatterns ); plugins.data.search.registerSearchStrategy( ENDPOINT_FIELDS_SEARCH_STRATEGY, endpointFieldsStrategy ); const endpointPackagePoliciesStatsStrategy = endpointPackagePoliciesStatsSearchStrategyProvider(this.endpointAppContextService); plugins.data.search.registerSearchStrategy( ENDPOINT_PACKAGE_POLICIES_STATS_STRATEGY, endpointPackagePoliciesStatsStrategy ); const securitySolutionSearchStrategy = securitySolutionSearchStrategyProvider( depsStart.data, this.endpointContext, depsStart.spaces?.spacesService?.getSpaceId, ruleDataClient ); plugins.data.search.registerSearchStrategy( 'securitySolutionSearchStrategy', securitySolutionSearchStrategy ); const endpointSearchStrategy = endpointSearchStrategyProvider( depsStart.data, this.endpointContext ); plugins.data.search.registerSearchStrategy( ENDPOINT_SEARCH_STRATEGY, endpointSearchStrategy ); /** * Register a config for the security guide */ plugins.guidedOnboarding?.registerGuideConfig(siemGuideId, getSiemGuideConfig()); this.siemMigrationsService.setup({ esClusterClient: coreStart.elasticsearch.client }); }) .catch(() => {}); // it shouldn't reject, but just in case setIsElasticCloudDeployment(plugins.cloud.isCloudEnabled ?? false); this.asyncTelemetryEventsSender.setup( DEFAULT_RETRY_CONFIG, DEFAULT_QUEUE_CONFIG, this.telemetryReceiver, plugins.telemetry, this.telemetryUsageCounter, core.analytics ); this.telemetryEventsSender.setup( this.telemetryReceiver, plugins.telemetry, plugins.taskManager, this.telemetryUsageCounter, this.asyncTelemetryEventsSender ); this.checkMetadataTransformsTask = new CheckMetadataTransformsTask({ endpointAppContext: this.endpointContext, core, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion taskManager: plugins.taskManager!, }); featureUsageService.setup(plugins.licensing); securityWorkflowInsightsService.setup({ kibanaVersion: pluginContext.env.packageInfo.version, logger: this.logger, isFeatureEnabled: config.experimentalFeatures.defendInsights, endpointContext: this.endpointContext.service, }); return { setProductFeaturesConfigurator: productFeaturesService.setProductFeaturesConfigurator.bind(productFeaturesService), experimentalFeatures: { ...config.experimentalFeatures }, }; } public start( core: SecuritySolutionPluginCoreStartDependencies, plugins: SecuritySolutionPluginStartDependencies ): SecuritySolutionPluginStart { const { config, logger, productFeaturesService } = this; this.ruleMonitoringService.start(core, plugins); const savedObjectsClient = new SavedObjectsClient(core.savedObjects.createInternalRepository()); const registerIngestCallback = plugins.fleet?.registerExternalCallback; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const exceptionListClient = this.lists!.getExceptionListClient( savedObjectsClient, 'kibana', // execution of Lists plugin server extension points callbacks should be turned off // here because most of the uses of this client will be in contexts where some endpoint // validations (specifically those around authz) can not be done (due ot the lack of a `KibanaRequest` // from where authz can be derived) false ); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const fleetStartServices = plugins.fleet!; const { packageService } = fleetStartServices; this.licensing$ = plugins.licensing.license$; this.telemetryConfigProvider.start(plugins.telemetry.isOptedIn$); // Assistant Tool and Feature Registration plugins.elasticAssistant.registerTools(APP_UI_ID, assistantTools); const features = { assistantModelEvaluation: config.experimentalFeatures.assistantModelEvaluation, advancedEsqlGeneration: config.experimentalFeatures.advancedEsqlGeneration, }; plugins.elasticAssistant.registerFeatures(APP_UI_ID, features); plugins.elasticAssistant.registerFeatures('management', features); const manifestManager = new ManifestManager({ savedObjectsClient, exceptionListClient, artifactClient: new EndpointArtifactClient( fleetStartServices.createArtifactsClient('endpoint') ), packagePolicyService: fleetStartServices.packagePolicyService, logger: this.pluginContext.logger.get('ManifestManager'), experimentalFeatures: config.experimentalFeatures, packagerTaskPackagePolicyUpdateBatchSize: config.packagerTaskPackagePolicyUpdateBatchSize, esClient: core.elasticsearch.client.asInternalUser, productFeaturesService, }); this.endpointAppContextService.start({ fleetStartServices, security: core.security, alerting: plugins.alerting, config, cases: plugins.cases, manifestManager, licenseService, telemetryConfigProvider: this.telemetryConfigProvider, exceptionListsClient: exceptionListClient, registerListsServerExtension: this.lists?.registerExtension, featureUsageService, experimentalFeatures: config.experimentalFeatures, esClient: core.elasticsearch.client.asInternalUser, productFeaturesService, savedObjectsServiceStart: core.savedObjects, connectorActions: plugins.actions, spacesService: plugins.spaces?.spacesService, }); if (this.lists && plugins.taskManager && plugins.fleet) { // Exceptions, Artifacts and Manifests start const taskManager = plugins.taskManager; plugins.fleet .fleetSetupCompleted() .then(async () => { logger.info('Dependent plugin setup complete'); if (this.manifestTask) { logger.info('Starting ManifestTask'); await this.manifestTask.start({ taskManager, }); } else { logger.error(new Error('User artifacts task not available.')); } const fleetServices = this.endpointAppContextService.getInternalFleetServices(); await turnOffPolicyProtectionsIfNotSupported( core.elasticsearch.client.asInternalUser, fleetServices, productFeaturesService, logger ); await turnOffAgentPolicyFeatures(fleetServices, productFeaturesService, logger); // Ensure policies have backing DOT indices (We don't need to `await` this. // It can run in the background) ensureIndicesExistsForPolicies(this.endpointAppContextService).catch(() => {}); }) .catch(() => {}); // License related start licenseService.start(this.licensing$); featureUsageService.start(plugins.licensing); this.policyWatcher = new PolicyWatcher( plugins.fleet.packagePolicyService, core.savedObjects, core.elasticsearch, logger ); this.policyWatcher.start(licenseService); this.telemetryWatcher = new TelemetryConfigWatcher( plugins.fleet.packagePolicyService, core.elasticsearch, this.endpointAppContextService ); this.telemetryWatcher.start(this.telemetryConfigProvider); } if (plugins.taskManager) { this.completeExternalResponseActionsTask .start({ taskManager: plugins.taskManager, esClient: core.elasticsearch.client.asInternalUser, }) .catch(() => {}); // it shouldn't refuse, but just in case } this.telemetryReceiver .start( core, (type: string) => core.savedObjects.getIndexForType(type), DEFAULT_ALERTS_INDEX, this.endpointAppContextService, exceptionListClient, packageService ) .catch(() => {}); artifactService.start(this.telemetryReceiver).catch(() => {}); this.asyncTelemetryEventsSender.start(plugins.telemetry); this.telemetryEventsSender.start( plugins.telemetry, plugins.taskManager, this.telemetryReceiver ); securityWorkflowInsightsService .start({ esClient: core.elasticsearch.client.asInternalUser, registerDefendInsightsCallback: plugins.elasticAssistant.registerCallback, }) .catch(() => {}); const endpointPkgInstallationPromise = this.endpointContext.service .getInternalFleetServices() .packages.getInstallation(FLEET_ENDPOINT_PACKAGE); Promise.all([endpointPkgInstallationPromise, plugins.fleet?.fleetSetupCompleted()]) .then(async ([endpointPkgInstallation]) => { if (plugins.taskManager) { if ( endpointPkgInstallation?.version && isEndpointPackageV2(endpointPkgInstallation.version) ) { return; } await this.checkMetadataTransformsTask?.start({ taskManager: plugins.taskManager }); } }) .catch(() => {}); // it shouldn't reject, but just in case if (registerIngestCallback) { registerIngestCallback( 'packagePolicyCreate', async (packagePolicy: NewPackagePolicy): Promise<NewPackagePolicy> => { await getCriblPackagePolicyPostCreateOrUpdateCallback( core.elasticsearch.client.asInternalUser, packagePolicy, this.logger ); return packagePolicy; } ); registerIngestCallback( 'packagePolicyUpdate', async (packagePolicy: UpdatePackagePolicy): Promise<UpdatePackagePolicy> => { await getCriblPackagePolicyPostCreateOrUpdateCallback( core.elasticsearch.client.asInternalUser, packagePolicy, this.logger ); return packagePolicy; } ); } return {}; } public stop() { this.logger.debug('Stopping plugin'); this.asyncTelemetryEventsSender.stop().catch(() => {}); this.telemetryEventsSender.stop(); this.endpointAppContextService.stop(); this.policyWatcher?.stop(); this.telemetryWatcher?.stop(); this.completeExternalResponseActionsTask.stop().catch(() => {}); this.siemMigrationsService.stop(); securityWorkflowInsightsService.stop(); licenseService.stop(); } }