Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Serverless][Security Solution][Endpoint] Gate endpoint exceptions on rule details and API changes #165613

Merged
Show file tree
Hide file tree
Changes from 70 commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
126ce01
gate endpoint exceptions on rule details
ashokaditya Sep 1, 2023
8f9bdd5
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 5, 2023
552db79
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 6, 2023
dc51dd2
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 6, 2023
f17fe19
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 6, 2023
e6a5e92
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 7, 2023
82a954e
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 8, 2023
c7fefb3
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 11, 2023
488fa8f
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 12, 2023
36a2165
add endpoint exceptions privileges to authz
ashokaditya Sep 12, 2023
12dcc17
add endpoint exceptions validator
ashokaditya Sep 12, 2023
088c76a
use endpoint exceptions validator in extensions
ashokaditya Sep 12, 2023
fa1e8eb
update initial authz state in test
ashokaditya Sep 13, 2023
bf9577b
Update authz.test.ts
ashokaditya Sep 13, 2023
c44774d
update error class for endpoint exceptions
ashokaditya Sep 14, 2023
793f6e0
use list id const
ashokaditya Sep 14, 2023
c03a8ed
fix type imports
ashokaditya Sep 14, 2023
99cb5f5
fix type import
ashokaditya Sep 14, 2023
bc87d99
show upsell page for exception details
ashokaditya Sep 14, 2023
64a12ec
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 14, 2023
c30e77b
upselling page related capability
ashokaditya Sep 14, 2023
95e5730
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 14, 2023
0dcf24d
Show upsell on endpoint exceptions tab
ashokaditya Sep 14, 2023
637a7e2
[CI] Auto-commit changed files from 'node scripts/precommit_hook.js -…
kibanamachine Sep 14, 2023
52d0bc9
rename
ashokaditya Sep 18, 2023
02eb0a2
only check capabilities and not app feature
ashokaditya Sep 18, 2023
25f934c
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 18, 2023
4b5185e
[CI] Auto-commit changed files from 'node scripts/eslint --no-cache -…
kibanamachine Sep 18, 2023
dc4bb74
rename
ashokaditya Sep 18, 2023
795cc0d
remove redundant method for now
ashokaditya Sep 18, 2023
141ee49
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 19, 2023
0243ad9
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 19, 2023
43a18c5
fix merge duplicate imports
ashokaditya Sep 19, 2023
72fdb54
fix privilege calculations for endpoint expections
ashokaditya Sep 20, 2023
953a7db
[CI] Auto-commit changed files from 'node scripts/lint_ts_projects --…
kibanamachine Sep 20, 2023
41b6ac2
fix types
ashokaditya Sep 20, 2023
b2d94f9
unit tests for `getAuthorizationFromPrivileges`
ashokaditya Sep 20, 2023
1c29f75
fix types
ashokaditya Sep 20, 2023
d8bf3ac
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 20, 2023
e271a74
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 21, 2023
3bf3ca7
add endpoint exceptions to endpoint complete
ashokaditya Sep 21, 2023
ca84a31
tidy up a bit
ashokaditya Sep 21, 2023
de4f2e2
fix typo
ashokaditya Sep 22, 2023
a9751c6
update codeowners file
ashokaditya Sep 22, 2023
a2e89bd
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 22, 2023
48c8179
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 25, 2023
6c47ed8
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
kibanamachine Sep 25, 2023
e8a2cd1
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 25, 2023
723e380
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
kibanamachine Sep 25, 2023
cc75585
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 25, 2023
d6098ba
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 26, 2023
2909e76
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 26, 2023
6c1dbb4
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 26, 2023
eb077cc
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 26, 2023
9fd8d5a
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 27, 2023
b7cbf12
cleanup
ashokaditya Sep 27, 2023
4e6927b
Merge branch 'task/dw-gate-endpoint-exceptions-via-serverless-pli-722…
ashokaditya Sep 27, 2023
8425f83
fix merge error
ashokaditya Sep 27, 2023
ff99429
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
kibanamachine Sep 27, 2023
a11c12e
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 27, 2023
324da8d
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
8f28467
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
kibanamachine Sep 28, 2023
74cf71a
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
4d1e41d
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
f7af9fd
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
08edd3a
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
a1897c0
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
ec06876
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 28, 2023
6a1a811
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
kibanamachine Sep 28, 2023
4552de0
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
kibanamachine Sep 28, 2023
141a413
fix run time error
ashokaditya Sep 29, 2023
688e767
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 29, 2023
76955d2
tidy up
ashokaditya Sep 29, 2023
fe11e51
show exceptions tab for sub feature role with read only permission
ashokaditya Sep 29, 2023
7cffc0e
disable actions for sub feature role
ashokaditya Sep 29, 2023
080c60e
disable edit/delete on rule details tabs
ashokaditya Sep 29, 2023
6e3a96c
unify capability check logic in a hook
ashokaditya Sep 29, 2023
94d78dd
move file
ashokaditya Sep 29, 2023
f5728bd
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 29, 2023
35d0a11
refactor
ashokaditya Sep 29, 2023
71050df
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Sep 30, 2023
864e4ed
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Oct 2, 2023
6ea0aaf
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Oct 2, 2023
67cfaf1
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Oct 2, 2023
3a8e9c2
fix type check error
ashokaditya Oct 2, 2023
71f3a96
use defined const
ashokaditya Oct 2, 2023
823d759
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Oct 2, 2023
fdaf8bb
Merge branch 'main' into task/dw-gate-endpoint-exceptions-via-serverl…
ashokaditya Oct 2, 2023
c3eca1a
fix merge error
ashokaditya Oct 2, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -1332,6 +1332,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib
/x-pack/test/security_solution_endpoint_api_int/ @elastic/security-defend-workflows
/x-pack/test_serverless/shared/lib/security/kibana_roles/ @elastic/security-defend-workflows
/x-pack/plugins/security_solution_serverless/public/upselling/sections/endpoint_management @elastic/security-defend-workflows
/x-pack/plugins/security_solution_serverless/public/upselling/pages/endpoint_management @elastic/security-defend-workflows
/x-pack/plugins/security_solution_serverless/server/endpoint @elastic/security-defend-workflows

## Security Solution sub teams - security-telemetry (Data Engineering)
Expand Down
3 changes: 2 additions & 1 deletion x-pack/packages/security-solution/upselling/service/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export type SectionUpsellings = Partial<Record<UpsellingSectionId, React.Compone
export type UpsellingSectionId =
| 'entity_analytics_panel'
| 'endpointPolicyProtections'
| 'osquery_automated_response_actions';
| 'osquery_automated_response_actions'
| 'ruleDetailsEndpointExceptions';

export type UpsellingMessageId = 'investigation_guide';
110 changes: 110 additions & 0 deletions x-pack/plugins/fleet/common/authz.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,11 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common';
import { TRANSFORM_PLUGIN_ID } from './constants/plugin';

import {
calculateEndpointExceptionsPrivilegesFromCapabilities,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forgot to ask this before: but were fleet changes really necessary for the endpoint exceptions authz?

We normally only have to touch fleet authz for when one of our kibana privileges needs to be used in fleet to allow access to one of the APIs. (right?)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe it was necessary to add this to fleet authz same as we did for endpoint package privileges, as privilege verification is done via fleetAuthz for all endpoint/exception_list artifact APIs.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know about that. We only run our privileges through fleet so that we can enable fleet APIs for kibana features controls that are applicable to endpoint management.

For endpoint exceptions, I don't think they need access to fleet APIs (ex. they don't support the "per policy" functionality), so it should all have been done from within Security Solution? (ex. that's how it works today, prior to RBAC being introduced for serverless).

calculateEndpointExceptionsPrivilegesFromKibanaPrivileges,
calculatePackagePrivilegesFromCapabilities,
calculatePackagePrivilegesFromKibanaPrivileges,
getAuthorizationFromPrivileges,
} from './authz';
import { ENDPOINT_PRIVILEGES } from './constants';

Expand Down Expand Up @@ -74,6 +77,31 @@ describe('fleet authz', () => {
});
});

describe('#calculateEndpointExceptionsPrivilegesFromCapabilities', () => {
it('calculates endpoint exceptions privileges correctly', () => {
const endpointExceptionsCapabilities = {
showEndpointExceptions: false,
crudEndpointExceptions: true,
};

const expected = {
actions: {
showEndpointExceptions: false,
crudEndpointExceptions: true,
},
};

const actual = calculateEndpointExceptionsPrivilegesFromCapabilities({
navLinks: {},
management: {},
catalogue: {},
siem: endpointExceptionsCapabilities,
});

expect(actual).toEqual(expected);
});
});

describe('calculatePackagePrivilegesFromKibanaPrivileges', () => {
it('calculates privileges correctly', () => {
const endpointPrivileges = [
Expand Down Expand Up @@ -111,4 +139,86 @@ describe('fleet authz', () => {
expect(actual).toEqual(expected);
});
});

describe('#calculateEndpointExceptionsPrivilegesFromKibanaPrivileges', () => {
it('calculates endpoint exceptions privileges correctly', () => {
const endpointExceptionsPrivileges = [
{ privilege: `${SECURITY_SOLUTION_ID}-showEndpointExceptions`, authorized: true },
{ privilege: `${SECURITY_SOLUTION_ID}-crudEndpointExceptions`, authorized: false },
{ privilege: `${SECURITY_SOLUTION_ID}-ignoreMe`, authorized: true },
];
const expected = {
actions: {
showEndpointExceptions: true,
crudEndpointExceptions: false,
},
};
const actual = calculateEndpointExceptionsPrivilegesFromKibanaPrivileges(
endpointExceptionsPrivileges
);
expect(actual).toEqual(expected);
});
});

describe('#getAuthorizationFromPrivileges', () => {
it('returns `false` when no `prefix` nor `searchPrivilege`', () => {
expect(
getAuthorizationFromPrivileges({
kibanaPrivileges: [
{
privilege: `${SECURITY_SOLUTION_ID}-ignoreMe`,
authorized: true,
},
],
})
).toEqual(false);
});

it('returns correct Boolean when `prefix` and `searchPrivilege` are given', () => {
const kibanaPrivileges = [
{ privilege: `${SECURITY_SOLUTION_ID}-writeHostIsolationExceptions`, authorized: false },
{ privilege: `${SECURITY_SOLUTION_ID}-writeHostIsolation`, authorized: true },
{ privilege: `${SECURITY_SOLUTION_ID}-ignoreMe`, authorized: false },
];

expect(
getAuthorizationFromPrivileges({
kibanaPrivileges,
prefix: `${SECURITY_SOLUTION_ID}-`,
searchPrivilege: `writeHostIsolation`,
})
).toEqual(true);
});

it('returns correct Boolean when only `prefix` is given', () => {
const kibanaPrivileges = [
{ privilege: `ignore-me-writeHostIsolationExceptions`, authorized: false },
{ privilege: `${SECURITY_SOLUTION_ID}-writeHostIsolation`, authorized: true },
{ privilege: `${SECURITY_SOLUTION_ID}-ignoreMe`, authorized: false },
];

expect(
getAuthorizationFromPrivileges({
kibanaPrivileges,
prefix: `${SECURITY_SOLUTION_ID}-`,
searchPrivilege: `writeHostIsolation`,
})
).toEqual(true);
});

it('returns correct Boolean when only `searchPrivilege` is given', () => {
const kibanaPrivileges = [
{ privilege: `${SECURITY_SOLUTION_ID}-writeHostIsolationExceptions`, authorized: false },
{ privilege: `${SECURITY_SOLUTION_ID}-writeHostIsolation`, authorized: true },
{ privilege: `${SECURITY_SOLUTION_ID}-ignoreMe`, authorized: false },
];

expect(
getAuthorizationFromPrivileges({
kibanaPrivileges,
searchPrivilege: `writeHostIsolation`,
})
).toEqual(true);
});
});
});
110 changes: 88 additions & 22 deletions x-pack/plugins/fleet/common/authz.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import type { Capabilities } from '@kbn/core-capabilities-common';

import { TRANSFORM_PLUGIN_ID } from './constants/plugin';

import { ENDPOINT_PRIVILEGES } from './constants';
import { ENDPOINT_EXCEPTIONS_PRIVILEGES, ENDPOINT_PRIVILEGES } from './constants';

export type TransformPrivilege =
| 'canGetTransform'
Expand Down Expand Up @@ -49,6 +49,13 @@ export interface FleetAuthz {
};
};
};

endpointExceptionsPrivileges?: {
actions: {
crudEndpointExceptions: boolean;
showEndpointExceptions: boolean;
};
};
}

interface CalculateParams {
Expand Down Expand Up @@ -135,19 +142,53 @@ export function calculatePackagePrivilegesFromCapabilities(
};
}

function getAuthorizationFromPrivileges(
export function calculateEndpointExceptionsPrivilegesFromCapabilities(
capabilities: Capabilities | undefined
): FleetAuthz['endpointExceptionsPrivileges'] {
if (!capabilities) {
return;
}

const endpointExceptionsActions = Object.keys(capabilities.siem).reduce<Record<string, boolean>>(
(acc, privilegeName) => {
if (Object.keys(ENDPOINT_EXCEPTIONS_PRIVILEGES).includes(privilegeName)) {
acc[privilegeName] = (capabilities.siem[privilegeName] as boolean) || false;
}
return acc;
},
{}
);

return {
actions: endpointExceptionsActions,
} as FleetAuthz['endpointExceptionsPrivileges'];
}

export function getAuthorizationFromPrivileges({
kibanaPrivileges,
searchPrivilege = '',
prefix = '',
}: {
kibanaPrivileges: Array<{
resource?: string;
privilege: string;
authorized: boolean;
}>,
prefix: string,
searchPrivilege: string
): boolean {
const privilege = kibanaPrivileges.find((p) =>
p.privilege.endsWith(`${prefix}${searchPrivilege}`)
);
return privilege?.authorized || false;
}>;
prefix?: string;
searchPrivilege?: string;
}): boolean {
const privilege = kibanaPrivileges.find((p) => {
if (prefix.length && searchPrivilege.length) {
return p.privilege.endsWith(`${prefix}${searchPrivilege}`);
} else if (prefix.length) {
return p.privilege.endsWith(`${prefix}`);
} else if (searchPrivilege.length) {
return p.privilege.endsWith(`${searchPrivilege}`);
}
return false;
});

return !!privilege?.authorized;
}

export function calculatePackagePrivilegesFromKibanaPrivileges(
Expand All @@ -165,11 +206,11 @@ export function calculatePackagePrivilegesFromKibanaPrivileges(

const endpointActions = Object.entries(ENDPOINT_PRIVILEGES).reduce<PrivilegeMap>(
(acc, [privilege, { appId, privilegeSplit, privilegeName }]) => {
const kibanaPrivilege = getAuthorizationFromPrivileges(
const kibanaPrivilege = getAuthorizationFromPrivileges({
kibanaPrivileges,
`${appId}${privilegeSplit}`,
privilegeName
);
prefix: `${appId}${privilegeSplit}`,
searchPrivilege: privilegeName,
});
acc[privilege] = {
executePackageAction: kibanaPrivilege,
};
Expand All @@ -178,11 +219,11 @@ export function calculatePackagePrivilegesFromKibanaPrivileges(
{}
);

const hasTransformAdmin = getAuthorizationFromPrivileges(
const hasTransformAdmin = getAuthorizationFromPrivileges({
kibanaPrivileges,
`${TRANSFORM_PLUGIN_ID}-`,
`admin`
);
prefix: `${TRANSFORM_PLUGIN_ID}-`,
searchPrivilege: `admin`,
});
const transformActions: {
[key in TransformPrivilege]: {
executePackageAction: boolean;
Expand All @@ -198,11 +239,11 @@ export function calculatePackagePrivilegesFromKibanaPrivileges(
executePackageAction: hasTransformAdmin,
},
canGetTransform: {
executePackageAction: getAuthorizationFromPrivileges(
executePackageAction: getAuthorizationFromPrivileges({
kibanaPrivileges,
`${TRANSFORM_PLUGIN_ID}-`,
`read`
),
prefix: `${TRANSFORM_PLUGIN_ID}-`,
searchPrivilege: `read`,
}),
},
};

Expand All @@ -215,3 +256,28 @@ export function calculatePackagePrivilegesFromKibanaPrivileges(
},
};
}

export function calculateEndpointExceptionsPrivilegesFromKibanaPrivileges(
kibanaPrivileges:
| Array<{
resource?: string;
privilege: string;
authorized: boolean;
}>
| undefined
): FleetAuthz['endpointExceptionsPrivileges'] {
if (!kibanaPrivileges || !kibanaPrivileges.length) {
return;
}
const endpointExceptionsActions = Object.entries(ENDPOINT_EXCEPTIONS_PRIVILEGES).reduce<
Record<string, boolean>
>((acc, [privilege, { appId, privilegeSplit, privilegeName }]) => {
acc[privilege] = getAuthorizationFromPrivileges({
kibanaPrivileges,
searchPrivilege: privilegeName,
});
return acc;
}, {});

return { actions: endpointExceptionsActions } as FleetAuthz['endpointExceptionsPrivileges'];
}
17 changes: 16 additions & 1 deletion x-pack/plugins/fleet/common/constants/authz.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common';

const SECURITY_SOLUTION_APP_ID = 'siem';

interface PrivilegeMapObject {
export interface PrivilegeMapObject {
appId: string;
privilegeSplit: string;
privilegeType: 'ui' | 'api';
Expand Down Expand Up @@ -163,3 +163,18 @@ export const ENDPOINT_PRIVILEGES: Record<string, PrivilegeMapObject> = deepFreez
privilegeName: 'writeExecuteOperations',
},
});

export const ENDPOINT_EXCEPTIONS_PRIVILEGES: Record<string, PrivilegeMapObject> = deepFreeze({
showEndpointExceptions: {
appId: DEFAULT_APP_CATEGORIES.security.id,
privilegeSplit: '-',
privilegeType: 'api',
privilegeName: 'showEndpointExceptions',
},
crudEndpointExceptions: {
appId: DEFAULT_APP_CATEGORIES.security.id,
privilegeSplit: '-',
privilegeType: 'api',
privilegeName: 'crudEndpointExceptions',
},
});
10 changes: 8 additions & 2 deletions x-pack/plugins/fleet/common/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
*/

import type {
PostDeletePackagePoliciesResponse,
AgentPolicy,
NewPackagePolicy,
PackagePolicy,
AgentPolicy,
PostDeletePackagePoliciesResponse,
} from './types';
import type { FleetAuthz } from './authz';
import { dataTypes, ENDPOINT_PRIVILEGES } from './constants';
Expand Down Expand Up @@ -108,6 +108,12 @@ export const createFleetAuthzMock = (): FleetAuthz => {
},
},
},
endpointExceptionsPrivileges: {
actions: {
showEndpointExceptions: true,
crudEndpointExceptions: true,
},
},
};
};

Expand Down
Loading