Skip to content

Commit

Permalink
[Fleet] Tighten policy permissions, take II (#97366)
Browse files Browse the repository at this point in the history
Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
  • Loading branch information
Alejandro Fernández Gómez and kibanamachine committed Jun 9, 2021
1 parent e0fb513 commit e82c11e
Show file tree
Hide file tree
Showing 6 changed files with 546 additions and 27 deletions.
6 changes: 3 additions & 3 deletions x-pack/plugins/fleet/common/types/models/agent_policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ export interface FullAgentPolicyInput {
}

export interface FullAgentPolicyOutputPermissions {
[role: string]: {
cluster: string[];
indices: Array<{
[packagePolicyName: string]: {
cluster?: string[];
indices?: Array<{
names: string[];
privileges: string[];
}>;
Expand Down
7 changes: 7 additions & 0 deletions x-pack/plugins/fleet/common/types/models/epm.ts
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ export enum RegistryDataStreamKeys {
ingest_pipeline = 'ingest_pipeline',
elasticsearch = 'elasticsearch',
dataset_is_prefix = 'dataset_is_prefix',
permissions = 'permissions',
}

export interface RegistryDataStream {
Expand All @@ -291,13 +292,19 @@ export interface RegistryDataStream {
[RegistryDataStreamKeys.ingest_pipeline]?: string;
[RegistryDataStreamKeys.elasticsearch]?: RegistryElasticsearch;
[RegistryDataStreamKeys.dataset_is_prefix]?: boolean;
[RegistryDataStreamKeys.permissions]?: RegistryDataStreamPermissions;
}

export interface RegistryElasticsearch {
'index_template.settings'?: object;
'index_template.mappings'?: object;
}

export interface RegistryDataStreamPermissions {
cluster?: string[];
indices?: string[];
}

export type RegistryVarType = 'integer' | 'bool' | 'password' | 'text' | 'yaml' | 'string';
export enum RegistryVarsEntryKeys {
name = 'name',
Expand Down
59 changes: 41 additions & 18 deletions x-pack/plugins/fleet/server/services/agent_policy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ import type {
Output,
} from '../../common';
import { AgentPolicyNameExistsError, HostedAgentPolicyRestrictionRelatedError } from '../errors';
import {
storedPackagePoliciesToAgentPermissions,
DEFAULT_PERMISSIONS,
} from '../services/package_policies_to_agent_permissions';

import { getPackageInfo } from './epm/packages';
import { getAgentsByKuery } from './agents';
Expand Down Expand Up @@ -745,30 +749,49 @@ class AgentPolicyService {
}),
};

const permissions = (await storedPackagePoliciesToAgentPermissions(
soClient,
agentPolicy.package_policies
)) || { _fallback: DEFAULT_PERMISSIONS };

permissions._elastic_agent_checks = {
cluster: DEFAULT_PERMISSIONS.cluster,
};

// TODO fetch this from the elastic agent package
const monitoringOutput = fullAgentPolicy.agent?.monitoring.use_output;
const monitoringNamespace = fullAgentPolicy.agent?.monitoring.namespace;
if (
fullAgentPolicy.agent?.monitoring.enabled &&
monitoringNamespace &&
monitoringOutput &&
fullAgentPolicy.outputs[monitoringOutput]?.type === 'elasticsearch'
) {
const names: string[] = [];
if (fullAgentPolicy.agent.monitoring.logs) {
names.push(`logs-elastic_agent.*-${monitoringNamespace}`);
}
if (fullAgentPolicy.agent.monitoring.metrics) {
names.push(`metrics-elastic_agent.*-${monitoringNamespace}`);
}

permissions._elastic_agent_checks.indices = [
{
names,
privileges: ['auto_configure', 'create_doc'],
},
];
}

// Only add permissions if output.type is "elasticsearch"
fullAgentPolicy.output_permissions = Object.keys(fullAgentPolicy.outputs).reduce<
NonNullable<FullAgentPolicy['output_permissions']>
>((permissions, outputName) => {
>((outputPermissions, outputName) => {
const output = fullAgentPolicy.outputs[outputName];
if (output && output.type === 'elasticsearch') {
permissions[outputName] = {};
permissions[outputName]._fallback = {
cluster: ['monitor'],
indices: [
{
names: [
'logs-*',
'metrics-*',
'traces-*',
'.logs-endpoint.diagnostic.collection-*',
'synthetics-*',
],
privileges: ['auto_configure', 'create_doc'],
},
],
};
outputPermissions[outputName] = permissions;
}
return permissions;
return outputPermissions;
}, {});

// only add settings if not in standalone
Expand Down
8 changes: 2 additions & 6 deletions x-pack/plugins/fleet/server/services/epm/archive/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -224,24 +224,20 @@ export const getEsPackage = async (
);
const dataStreamManifest = safeLoad(soResDataStreamManifest.attributes.data_utf8);
const {
title: dataStreamTitle,
release,
ingest_pipeline: ingestPipeline,
type,
dataset,
streams: manifestStreams,
...dataStreamManifestProps
} = dataStreamManifest;
const streams = parseAndVerifyStreams(manifestStreams, dataStreamPath);

dataStreams.push({
dataset: dataset || `${pkgName}.${dataStreamPath}`,
title: dataStreamTitle,
release,
package: pkgName,
ingest_pipeline: ingestPipeline || 'default',
path: dataStreamPath,
type,
streams,
...dataStreamManifestProps,
});
})
);
Expand Down
Loading

0 comments on commit e82c11e

Please sign in to comment.