Skip to content

Commit 187d13f

Browse files
orestisflviduni94
authored andcommitted
Conditionally add agentless index permissions (elastic#203810)
## Summary Adds necessary permissions to write to the `agentless-*` index. See: - Elasticsearch PR: elastic/elasticsearch#118644 - Context: elastic/security-team#11104 As part of elastic/security-team#11104, we need to write integration data that needs to be persistent. The implementation we are working on, uses Elasticsearch as the storage mechanism for this data. Normally, integrations write to data streams instead of normal ES indices. However, data streams cannot provide a generic implementation for our use case and thus we need a normal ES index. This PR grants permissions from the fleet service account to the agentless integrations to write to `agentless-*` ES indices. In `x-pack/plugins/fleet/server/services/agent_policies/package_policies_to_agent_permissions.ts` there are other examples of other integrations that need ES index permissions so there is prior art in doing this. The difference with this PR however, is that we need to conditionally merge the extra `agentless-*` permissions with any potential existing data stream permissions since we are dealing with arbitrary agentless integrations.
1 parent 9b89baf commit 187d13f

File tree

1 file changed

+28
-7
lines changed

1 file changed

+28
-7
lines changed

x-pack/platform/plugins/shared/fleet/server/services/agent_policies/package_policies_to_agent_permissions.ts

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@ export const ELASTIC_CONNECTORS_INDEX_PERMISSIONS = [
5252
'view_index_metadata',
5353
];
5454

55+
export const AGENTLESS_INDEX_PERMISSIONS = [
56+
'read',
57+
'write',
58+
'monitor',
59+
'create_index',
60+
'auto_configure',
61+
'maintenance',
62+
'view_index_metadata',
63+
];
64+
5565
export function storedPackagePoliciesToAgentPermissions(
5666
packageInfoCache: Map<string, PackageInfo>,
5767
agentPolicyNamespace: string,
@@ -173,13 +183,10 @@ export function storedPackagePoliciesToAgentPermissions(
173183
}
174184
// namespace is either the package policy's or the agent policy one
175185
const namespace = packagePolicy?.namespace || agentPolicyNamespace;
176-
return [
177-
packagePolicy.id,
178-
{
179-
indices: dataStreamsForPermissions.map((ds) => getDataStreamPrivileges(ds, namespace)),
180-
...clusterRoleDescriptor,
181-
},
182-
];
186+
return maybeAddAgentlessPermissions(packagePolicy, {
187+
indices: dataStreamsForPermissions.map((ds) => getDataStreamPrivileges(ds, namespace)),
188+
...clusterRoleDescriptor,
189+
});
183190
});
184191

185192
return Object.fromEntries(permissionEntries);
@@ -244,6 +251,20 @@ function universalProfilingPermissions(packagePolicyId: string): [string, Securi
244251
];
245252
}
246253

254+
function maybeAddAgentlessPermissions(
255+
packagePolicy: PackagePolicy,
256+
existing: SecurityRoleDescriptor
257+
): [string, SecurityRoleDescriptor] {
258+
if (!packagePolicy.supports_agentless) {
259+
return [packagePolicy.id, existing];
260+
}
261+
existing.indices!.push({
262+
names: ['agentless-*'],
263+
privileges: AGENTLESS_INDEX_PERMISSIONS,
264+
});
265+
return [packagePolicy.id, existing];
266+
}
267+
247268
function apmPermissions(packagePolicyId: string): [string, SecurityRoleDescriptor] {
248269
return [
249270
packagePolicyId,

0 commit comments

Comments
 (0)