kibana/dev_docs/key_concepts
Elena Shostak 6be0e84cb1
[8.x] [Hardening] Kibana Feature API Privileges Names (#208067) (#209321)
# Backport

This will backport the following commits from `main` to `8.x`:
- [[Hardening] Kibana Feature API Privileges Names
(#208067)](https://github.com/elastic/kibana/pull/208067)

<!--- Backport version: 9.6.4 -->

### Questions ?
Please refer to the [Backport tool
documentation](https://github.com/sorenlouv/backport)

<!--BACKPORT [{"author":{"name":"Elena
Shostak","email":"165678770+elena-shostak@users.noreply.github.com"},"sourceCommit":{"committedDate":"2025-02-03T14:22:29Z","message":"[Hardening]
Kibana Feature API Privileges Names (#208067)\n\n## Summary\r\n\r\nAs
part of our effort to harden API action definitions and
enforce\r\nstandards this PR adds an utility `ApiPrivileges`
class.\r\nIt is supposed to be used for both feature registration and
API route\r\ndefinition to construct the privilege
name.\r\n```ts\r\nplugins.features.registerKibanaFeature({\r\n
privileges: {\r\n all: {\r\n app: [...],\r\n catalogue: [...],\r\n api:
[ApiPrivileges.manage('subject_name')],\r\n ...\r\n },\r\n read: {\r\n
...\r\n api: [ApiPrivileges.read('subject_name')],\r\n ...\r\n },\r\n
},\r\n})\r\n....\r\n\r\n// route definition\r\nrouter.get(\r\n {\r\n
path: 'api_path',\r\n security: {\r\n authz: {\r\n requiredPrivileges:
[ApiPrivileges.manage('subject_name')],\r\n },\r\n },\r\n },\r\n async
(ctx, req, res) =>
{}\r\n);\r\n```\r\n\r\n`require_kibana_feature_privileges_naming` eslint
rule has been added to\r\nshow warning if the API privilege name doesn't
satisfy the naming\r\nconvention.\r\n\r\n### Naming convention\r\n\r\n-
API privilege should start with valid `ApiOperation`:
`manage`,\r\n`read`, `update`, `delete`, `create`\r\n- API privilege
should use `_` as separator\r\n\r\n `read-entity-a`\r\n
`delete_entity-a`\r\n `entity_manage`\r\n `read_entity_a`\r\n
`delete_entity_a`\r\n `manage_entity`\r\n\r\n> [!IMPORTANT] \r\n>
Serverless ZDT update scenario:\r\n>\r\n> - version N has an endpoint
protected with the `old_privilege_read`.\r\n> - version N+1 has the same
endpoint protected with a new\r\n`read_privilege`.\r\n> \r\n> There
might be a short period between the time the UI pod N+1 passes\r\nSO
migrations and updates privileges and the time it's marked
as\r\nready-to-handle-requests by k8s, and when UI pod N is
terminated.\r\n>\r\n> After discussion with @legrego and @azasypkin we
decided to ignore it\r\ndue to the perceived risk-to-cost ratio:\r\n> 1.
The time window users might be affected is very narrow because
we\r\nregister privileges late in the Kibana startup flow (e.g., after
SO\r\nmigrations).\r\n> 2. The transient 403 errors users might get
won't result in session\r\ntermination and shouldn't lead to data
loss.\r\n> 3. The roll-out will be performed in batches over the course
of\r\nmultiple weeks and implemented by different teams. This means the
impact\r\nper release shouldn't be significant.\r\n\r\n###
Checklist\r\n\r\n-
[x]\r\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\r\nwas
added for features that require explanation or tutorials\r\n- [x] [Unit
or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n__Relates:
https://github.com/elastic/kibana/issues/198716__\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"504510b92b0e92cbc173f0de517c506d2f54d536","branchLabelMapping":{"^v9.1.0$":"main","^v8.19.0$":"8.x","^v(\\d+).(\\d+).\\d+$":"$1.$2"}},"sourcePullRequest":{"labels":["Team:Security","release_note:skip","Feature:Hardening","backport:prev-minor","Team:Obs
AI
Assistant","backport:version","v9.1.0","v8.19.0"],"title":"[Hardening]
Kibana Feature API Privileges
Names","number":208067,"url":"https://github.com/elastic/kibana/pull/208067","mergeCommit":{"message":"[Hardening]
Kibana Feature API Privileges Names (#208067)\n\n## Summary\r\n\r\nAs
part of our effort to harden API action definitions and
enforce\r\nstandards this PR adds an utility `ApiPrivileges`
class.\r\nIt is supposed to be used for both feature registration and
API route\r\ndefinition to construct the privilege
name.\r\n```ts\r\nplugins.features.registerKibanaFeature({\r\n
privileges: {\r\n all: {\r\n app: [...],\r\n catalogue: [...],\r\n api:
[ApiPrivileges.manage('subject_name')],\r\n ...\r\n },\r\n read: {\r\n
...\r\n api: [ApiPrivileges.read('subject_name')],\r\n ...\r\n },\r\n
},\r\n})\r\n....\r\n\r\n// route definition\r\nrouter.get(\r\n {\r\n
path: 'api_path',\r\n security: {\r\n authz: {\r\n requiredPrivileges:
[ApiPrivileges.manage('subject_name')],\r\n },\r\n },\r\n },\r\n async
(ctx, req, res) =>
{}\r\n);\r\n```\r\n\r\n`require_kibana_feature_privileges_naming` eslint
rule has been added to\r\nshow warning if the API privilege name doesn't
satisfy the naming\r\nconvention.\r\n\r\n### Naming convention\r\n\r\n-
API privilege should start with valid `ApiOperation`:
`manage`,\r\n`read`, `update`, `delete`, `create`\r\n- API privilege
should use `_` as separator\r\n\r\n `read-entity-a`\r\n
`delete_entity-a`\r\n `entity_manage`\r\n `read_entity_a`\r\n
`delete_entity_a`\r\n `manage_entity`\r\n\r\n> [!IMPORTANT] \r\n>
Serverless ZDT update scenario:\r\n>\r\n> - version N has an endpoint
protected with the `old_privilege_read`.\r\n> - version N+1 has the same
endpoint protected with a new\r\n`read_privilege`.\r\n> \r\n> There
might be a short period between the time the UI pod N+1 passes\r\nSO
migrations and updates privileges and the time it's marked
as\r\nready-to-handle-requests by k8s, and when UI pod N is
terminated.\r\n>\r\n> After discussion with @legrego and @azasypkin we
decided to ignore it\r\ndue to the perceived risk-to-cost ratio:\r\n> 1.
The time window users might be affected is very narrow because
we\r\nregister privileges late in the Kibana startup flow (e.g., after
SO\r\nmigrations).\r\n> 2. The transient 403 errors users might get
won't result in session\r\ntermination and shouldn't lead to data
loss.\r\n> 3. The roll-out will be performed in batches over the course
of\r\nmultiple weeks and implemented by different teams. This means the
impact\r\nper release shouldn't be significant.\r\n\r\n###
Checklist\r\n\r\n-
[x]\r\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\r\nwas
added for features that require explanation or tutorials\r\n- [x] [Unit
or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n__Relates:
https://github.com/elastic/kibana/issues/198716__\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"504510b92b0e92cbc173f0de517c506d2f54d536"}},"sourceBranch":"main","suggestedTargetBranches":["8.x"],"targetPullRequestStates":[{"branch":"main","label":"v9.1.0","branchLabelMappingKey":"^v9.1.0$","isSourceBranch":true,"state":"MERGED","url":"https://github.com/elastic/kibana/pull/208067","number":208067,"mergeCommit":{"message":"[Hardening]
Kibana Feature API Privileges Names (#208067)\n\n## Summary\r\n\r\nAs
part of our effort to harden API action definitions and
enforce\r\nstandards this PR adds an utility `ApiPrivileges`
class.\r\nIt is supposed to be used for both feature registration and
API route\r\ndefinition to construct the privilege
name.\r\n```ts\r\nplugins.features.registerKibanaFeature({\r\n
privileges: {\r\n all: {\r\n app: [...],\r\n catalogue: [...],\r\n api:
[ApiPrivileges.manage('subject_name')],\r\n ...\r\n },\r\n read: {\r\n
...\r\n api: [ApiPrivileges.read('subject_name')],\r\n ...\r\n },\r\n
},\r\n})\r\n....\r\n\r\n// route definition\r\nrouter.get(\r\n {\r\n
path: 'api_path',\r\n security: {\r\n authz: {\r\n requiredPrivileges:
[ApiPrivileges.manage('subject_name')],\r\n },\r\n },\r\n },\r\n async
(ctx, req, res) =>
{}\r\n);\r\n```\r\n\r\n`require_kibana_feature_privileges_naming` eslint
rule has been added to\r\nshow warning if the API privilege name doesn't
satisfy the naming\r\nconvention.\r\n\r\n### Naming convention\r\n\r\n-
API privilege should start with valid `ApiOperation`:
`manage`,\r\n`read`, `update`, `delete`, `create`\r\n- API privilege
should use `_` as separator\r\n\r\n `read-entity-a`\r\n
`delete_entity-a`\r\n `entity_manage`\r\n `read_entity_a`\r\n
`delete_entity_a`\r\n `manage_entity`\r\n\r\n> [!IMPORTANT] \r\n>
Serverless ZDT update scenario:\r\n>\r\n> - version N has an endpoint
protected with the `old_privilege_read`.\r\n> - version N+1 has the same
endpoint protected with a new\r\n`read_privilege`.\r\n> \r\n> There
might be a short period between the time the UI pod N+1 passes\r\nSO
migrations and updates privileges and the time it's marked
as\r\nready-to-handle-requests by k8s, and when UI pod N is
terminated.\r\n>\r\n> After discussion with @legrego and @azasypkin we
decided to ignore it\r\ndue to the perceived risk-to-cost ratio:\r\n> 1.
The time window users might be affected is very narrow because
we\r\nregister privileges late in the Kibana startup flow (e.g., after
SO\r\nmigrations).\r\n> 2. The transient 403 errors users might get
won't result in session\r\ntermination and shouldn't lead to data
loss.\r\n> 3. The roll-out will be performed in batches over the course
of\r\nmultiple weeks and implemented by different teams. This means the
impact\r\nper release shouldn't be significant.\r\n\r\n###
Checklist\r\n\r\n-
[x]\r\n[Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html)\r\nwas
added for features that require explanation or tutorials\r\n- [x] [Unit
or
functional\r\ntests](https://www.elastic.co/guide/en/kibana/master/development-tests.html)\r\nwere
updated or added to match the most common scenarios\r\n\r\n__Relates:
https://github.com/elastic/kibana/issues/198716__\r\n\r\n---------\r\n\r\nCo-authored-by:
kibanamachine
<42973632+kibanamachine@users.noreply.github.com>\r\nCo-authored-by:
Elastic Machine
<elasticmachine@users.noreply.github.com>","sha":"504510b92b0e92cbc173f0de517c506d2f54d536"}},{"branch":"8.x","label":"v8.19.0","branchLabelMappingKey":"^v8.19.0$","isSourceBranch":false,"state":"NOT_CREATED"},{"url":"https://github.com/elastic/kibana/pull/209315","number":209315,"branch":"9.0","state":"OPEN"}]}]
BACKPORT-->
2025-02-03 11:51:36 -05:00
..
performance [8.x] SKA: Update broken references and URLs (#206836) (#208479) 2025-01-28 10:09:09 +01:00
anatomy_of_a_plugin.mdx async-import plugins in the server side (#170856) 2023-11-15 00:55:56 -07:00
api_authorization.mdx [8.x] [Hardening] Kibana Feature API Privileges Names (#208067) (#209321) 2025-02-03 11:51:36 -05:00
audit_logging.mdx [api-docs] follow the correct schema for frontmatter (#138348) 2022-08-10 17:17:50 -05:00
building_blocks.mdx [8.x] [Discover] Rename Saved Search to Discover Session (#202217) (#204818) 2024-12-19 21:38:57 +11:00
data_views.mdx [api-docs] follow the correct schema for frontmatter (#138348) 2022-08-10 17:17:50 -05:00
embeddables.mdx [8.x] SKA: Update broken references and URLs (#206836) (#208479) 2025-01-28 10:09:09 +01:00
encrypted_saved_objects.mdx Implements 'Key concepts' developer documentation for Encrypted Saved Objects (#184334) 2024-06-07 14:34:58 +02:00
feature_privileges.mdx [8.x] [Docs] Update feature privilege docs to reflect new route authorization (#201017) (#201042) 2024-11-20 21:21:32 +00:00
kibana_platform_plugin_intro.mdx [api-docs] follow the correct schema for frontmatter (#138348) 2022-08-10 17:17:50 -05:00
kibana_system_user.mdx [8.x] [Docs] Security Route Configuration (#193994) (#197218) 2024-10-22 12:01:38 +00:00
navigation.mdx [8.x] SKA: Update broken references and URLs (#206836) (#208479) 2025-01-28 10:09:09 +01:00
persistable_state.mdx [8.x] SKA: Update broken references and URLs (#206836) (#208479) 2025-01-28 10:09:09 +01:00
saved_objects.mdx Updates internal dev docs for Saved Objects (#178058) 2024-03-07 08:16:28 -07:00