Skip to content

Commit e59b440

Browse files
[DOCS] Add examples for security user profile and SAML APIs (elastic#3520) (elastic#3532)
(cherry picked from commit 72c9fef) Co-authored-by: Lisa Cawley <[email protected]>
1 parent 807bbd7 commit e59b440

File tree

49 files changed

+699
-174
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+699
-174
lines changed

output/openapi/elasticsearch-openapi.json

Lines changed: 72 additions & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

output/schema/schema.json

Lines changed: 114 additions & 81 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

specification/_doc_ids/table.csv

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -661,9 +661,10 @@ security-api-suggest,https://www.elastic.co/guide/en/elasticsearch/reference/{br
661661
security-api-cross-cluster-key-update,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-api-update-cross-cluster-api-key.html
662662
security-api-update-key,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-api-update-api-key.html
663663
security-api-update-user-data,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-api-update-user-profile-data.html
664-
security-privileges,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-privileges.html
665664
security-api-update-settings,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-api-update-settings.html
666665
security-encrypt-internode,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-basic-setup.html#encrypt-internode-communication
666+
security-privileges,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/security-privileges.html
667+
security-saml-guide,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/saml-guide-stack.html
667668
service-accounts,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/service-accounts.html
668669
set-processor,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/set-processor.html
669670
shape,https://www.elastic.co/guide/en/elasticsearch/reference/{branch}/shape.html

specification/security/_types/GrantType.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ export enum GrantType {
2424
password,
2525
/**
2626
* In this type of grant, you must supply an access token that was created by the Elasticsearch token service.
27+
* If you are activating a user profile, you can alternatively supply a JWT (either a JWT `access_token` or a JWT `id_token`).
2728
*/
2829
access_token
2930
}

specification/security/activate_user_profile/Request.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@ import { RequestBase } from '@_types/Base'
2424
* Activate a user profile.
2525
*
2626
* Create or update a user profile on behalf of another user.
27+
*
28+
* NOTE: The user profile feature is designed only for use by Kibana and Elastic's Observability, Enterprise Search, and Elastic Security solutions.
29+
* Individual users and external applications should not call this API directly.
30+
* The calling application must have either an `access_token` or a combination of `username` and `password` for the user that the profile document is intended for.
31+
* Elastic reserves the right to change or remove this feature in future releases without prior notice.
32+
*
33+
* This API creates or updates a profile document for end users with information that is extracted from the user's authentication object including `username`, `full_name,` `roles`, and the authentication realm.
34+
* For example, in the JWT `access_token` case, the profile user's `username` is extracted from the JWT token claim pointed to by the `claims.principal` setting of the JWT realm that authenticated the token.
35+
*
36+
* When updating a profile document, the API enables the document if it was disabled.
37+
* Any updates do not change existing content for either the `labels` or `data` fields.
2738
* @rest_spec_name security.activate_user_profile
2839
* @availability stack since=8.2.0 stability=stable
2940
* @availability serverless stability=stable visibility=private
@@ -38,9 +49,28 @@ export interface Request extends RequestBase {
3849
}
3950
]
4051
body: {
52+
/**
53+
* The user's Elasticsearch access token or JWT.
54+
* Both `access` and `id` JWT token types are supported and they depend on the underlying JWT realm configuration.
55+
* If you specify the `access_token` grant type, this parameter is required.
56+
* It is not valid with other grant types.
57+
*/
4158
access_token?: string
59+
/**
60+
* The type of grant.
61+
*/
4262
grant_type: GrantType
63+
/**
64+
* The user's password.
65+
* If you specify the `password` grant type, this parameter is required.
66+
* It is not valid with other grant types.
67+
*/
4368
password?: string
69+
/**
70+
* The username that identifies the user.
71+
* If you specify the `password` grant type, this parameter is required.
72+
* It is not valid with other grant types.
73+
*/
4474
username?: string
4575
}
4676
}
Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
11
# summary:
2-
# method_request: POST /_security/user/jacknich
2+
# method_request: POST /_security/profile/_activate
33
description: >
4-
Run `POST /_security/user/jacknich` to create a user.
4+
Run `POST /_security/profile/_activate` to activate a user profile.
55
# type: request
66
value: |-
77
{
8-
"password" : "l0ng-r4nd0m-p@ssw0rd",
9-
"roles" : [ "admin", "other_role1" ],
10-
"full_name" : "Jack Nicholson",
11-
"email" : "[email protected]",
12-
"metadata" : {
13-
"intelligence" : 7
14-
}
8+
"grant_type": "password",
9+
"username" : "jacknich",
10+
"password" : "l0ng-r4nd0m-p@ssw0rd"
1511
}

specification/security/disable_user_profile/Request.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,18 @@ import { Refresh } from '@_types/common'
2525
* Disable a user profile.
2626
*
2727
* Disable user profiles so that they are not visible in user profile searches.
28+
*
29+
* NOTE: The user profile feature is designed only for use by Kibana and Elastic's Observability, Enterprise Search, and Elastic Security solutions.
30+
* Individual users and external applications should not call this API directly.
31+
* Elastic reserves the right to change or remove this feature in future releases without prior notice.
32+
*
33+
* When you activate a user profile, its automatically enabled and visible in user profile searches. You can use the disable user profile API to disable a user profile so it’s not visible in these searches.
34+
* To re-enable a disabled user profile, use the enable user profile API .
2835
* @rest_spec_name security.disable_user_profile
2936
* @availability stack since=8.2.0 stability=stable
3037
* @availability serverless stability=stable visibility=private
3138
* @cluster_privileges manage_user_profile
39+
* @doc_id security-api-disable-user-profile
3240
*/
3341
export interface Request extends RequestBase {
3442
urls: [
@@ -45,9 +53,9 @@ export interface Request extends RequestBase {
4553
}
4654
query_parameters: {
4755
/**
48-
* If 'true', Elasticsearch refreshes the affected shards to make this operation
49-
* visible to search, if 'wait_for' then wait for a refresh to make this operation
50-
* visible to search, if 'false' do nothing with refreshes.
56+
* If 'true', Elasticsearch refreshes the affected shards to make this operation visible to search.
57+
* If 'wait_for', it waits for a refresh to make this operation visible to search.
58+
* If 'false', it does nothing with refreshes.
5159
* @server_default false
5260
*/
5361
refresh?: Refresh

specification/security/enable_user_profile/Request.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,13 @@ import { Refresh } from '@_types/common'
2525
* Enable a user profile.
2626
*
2727
* Enable user profiles to make them visible in user profile searches.
28+
*
29+
* NOTE: The user profile feature is designed only for use by Kibana and Elastic's Observability, Enterprise Search, and Elastic Security solutions.
30+
* Individual users and external applications should not call this API directly.
31+
* Elastic reserves the right to change or remove this feature in future releases without prior notice.
32+
*
33+
* When you activate a user profile, it's automatically enabled and visible in user profile searches.
34+
* If you later disable the user profile, you can use the enable user profile API to make the profile visible in these searches again.
2835
* @rest_spec_name security.enable_user_profile
2936
* @availability stack since=8.2.0 stability=stable
3037
* @availability serverless stability=stable visibility=private
@@ -40,15 +47,16 @@ export interface Request extends RequestBase {
4047
]
4148
path_parts: {
4249
/**
43-
* Unique identifier for the user profile.
50+
* A unique identifier for the user profile.
4451
*/
4552
uid: UserProfileId
4653
}
4754
query_parameters: {
4855
/**
4956
* If 'true', Elasticsearch refreshes the affected shards to make this operation
50-
* visible to search, if 'wait_for' then wait for a refresh to make this operation
51-
* visible to search, if 'false' do nothing with refreshes.
57+
* visible to search.
58+
* If 'wait_for', it waits for a refresh to make this operation visible to search.
59+
* If 'false', nothing is done with refreshes.
5260
* @server_default false
5361
*/
5462
refresh?: Refresh

specification/security/get_user_profile/Request.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,14 @@ import { RequestBase } from '@_types/Base'
2424
* Get a user profile.
2525
*
2626
* Get a user's profile using the unique profile ID.
27+
*
28+
* NOTE: The user profile feature is designed only for use by Kibana and Elastic's Observability, Enterprise Search, and Elastic Security solutions.
29+
* Individual users and external applications should not call this API directly.
30+
* Elastic reserves the right to change or remove this feature in future releases without prior notice.
2731
* @rest_spec_name security.get_user_profile
2832
* @availability stack since=8.2.0 stability=stable
2933
* @availability serverless stability=stable visibility=private
30-
* @cluster_privileges manage_user_profile
34+
* @cluster_privileges read_security
3135
* @doc_id security-api-get-user-profile
3236
*/
3337
export interface Request extends RequestBase {
@@ -45,9 +49,9 @@ export interface Request extends RequestBase {
4549
}
4650
query_parameters: {
4751
/**
48-
* List of filters for the `data` field of the profile document.
49-
* To return all content use `data=*`. To return a subset of content
50-
* use `data=<key>` to retrieve content nested under the specified `<key>`.
52+
* A comma-separated list of filters for the `data` field of the profile document.
53+
* To return all content use `data=*`.
54+
* To return a subset of content use `data=<key>` to retrieve content nested under the specified `<key>`.
5155
* By default returns no `data` content.
5256
*/
5357
data?: string | string[]

specification/security/get_user_profile/Response.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ import { GetUserProfileErrors } from './types'
2222

2323
export class Response {
2424
body: {
25+
/**
26+
* A successful call returns the JSON representation of the user profile and its internal versioning numbers.
27+
* The API returns an empty object if no profile document is found for the provided `uid`.
28+
* The content of the data field is not returned by default to avoid deserializing a potential large payload.
29+
*/
2530
profiles: UserProfileWithMetadata[]
2631
errors?: GetUserProfileErrors
2732
}

specification/security/has_privileges_user_profile/Request.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ import { PrivilegesCheck } from './types'
2525
* Check user profile privileges.
2626
*
2727
* Determine whether the users associated with the specified user profile IDs have all the requested privileges.
28+
*
29+
* NOTE: The user profile feature is designed only for use by Kibana and Elastic's Observability, Enterprise Search, and Elastic Security solutions. Individual users and external applications should not call this API directly.
30+
* Elastic reserves the right to change or remove this feature in future releases without prior notice.
2831
* @rest_spec_name security.has_privileges_user_profile
2932
* @availability stack since=8.3.0 stability=stable
3033
* @availability serverless stability=stable visibility=private
@@ -44,6 +47,9 @@ export interface Request extends RequestBase {
4447
* A list of profile IDs. The privileges are checked for associated users of the profiles.
4548
*/
4649
uids: UserProfileId[]
50+
/**
51+
* An object containing all the privileges to be checked.
52+
*/
4753
privileges: PrivilegesCheck
4854
}
4955
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# summary:
2+
# method_request: POST /_security/profile/_has_privileges
3+
description: >
4+
Run `POST /_security/profile/_has_privileges` to check whether the two users associated with the specified profiles have all the requested set of cluster, index, and application privileges.
5+
# type: request
6+
value: |-
7+
{
8+
"uids": [
9+
"u_LQPnxDxEjIH0GOUoFkZr5Y57YUwSkL9Joiq-g4OCbPc_0",
10+
"u_rzRnxDgEHIH0GOUoFkZr5Y27YUwSk19Joiq=g4OCxxB_1",
11+
"u_does-not-exist_0"
12+
],
13+
"privileges": {
14+
"cluster": [ "monitor", "create_snapshot", "manage_ml" ],
15+
"index" : [
16+
{
17+
"names": [ "suppliers", "products" ],
18+
"privileges": [ "create_doc"]
19+
},
20+
{
21+
"names": [ "inventory" ],
22+
"privileges" : [ "read", "write" ]
23+
}
24+
],
25+
"application": [
26+
{
27+
"application": "inventory_manager",
28+
"privileges" : [ "read", "data:write/inventory" ],
29+
"resources" : [ "product/1852563" ]
30+
}
31+
]
32+
}
33+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# summary:
2+
description: >
3+
A response from `POST /_security/profile/_has_privileges` that indicates only one of the three users has all the privileges and one of them is not found.
4+
# type: response
5+
# response_code:
6+
value: |-
7+
{
8+
"has_privilege_uids": ["u_rzRnxDgEHIH0GOUoFkZr5Y27YUwSk19Joiq=g4OCxxB_1"],
9+
"errors": {
10+
"count": 1,
11+
"details": {
12+
"u_does-not-exist_0": {
13+
"type": "resource_not_found_exception",
14+
"reason": "profile document not found"
15+
}
16+
}
17+
}
18+
}

specification/security/saml_authenticate/Request.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,25 @@ import { Ids } from '@_types/common'
2323
/**
2424
* Authenticate SAML.
2525
*
26-
* Submits a SAML response message to Elasticsearch for consumption.
26+
* Submit a SAML response message to Elasticsearch for consumption.
27+
*
28+
* NOTE: This API is intended for use by custom web applications other than Kibana.
29+
* If you are using Kibana, refer to the documentation for configuring SAML single-sign-on on the Elastic Stack.
30+
*
31+
* The SAML message that is submitted can be:
32+
*
33+
* * A response to a SAML authentication request that was previously created using the SAML prepare authentication API.
34+
* * An unsolicited SAML message in the case of an IdP-initiated single sign-on (SSO) flow.
35+
*
36+
* In either case, the SAML message needs to be a base64 encoded XML document with a root element of `<Response>`.
37+
*
38+
* After successful validation, Elasticsearch responds with an Elasticsearch internal access token and refresh token that can be subsequently used for authentication.
39+
* This API endpoint essentially exchanges SAML responses that indicate successful authentication in the IdP for Elasticsearch access and refresh tokens, which can be used for authentication against Elasticsearch.
2740
* @rest_spec_name security.saml_authenticate
2841
* @availability stack since=7.5.0 stability=stable
2942
* @availability serverless stability=stable visibility=private
3043
* @doc_id security-api-saml-authenticate
44+
* @ext_doc_id security-saml-guide
3145
*/
3246
export interface Request extends RequestBase {
3347
urls: [
@@ -37,9 +51,9 @@ export interface Request extends RequestBase {
3751
}
3852
]
3953
body: {
40-
/** The SAML response as it was sent by the users browser, usually a Base64 encoded XML document. */
54+
/** The SAML response as it was sent by the user's browser, usually a Base64 encoded XML document. */
4155
content: string
42-
/** A json array with all the valid SAML Request Ids that the caller of the API has for the current user. */
56+
/** A JSON array with all the valid SAML Request Ids that the caller of the API has for the current user. */
4357
ids: Ids
4458
/** The name of the realm that should authenticate the SAML response. Useful in cases where many SAML realms are defined. */
4559
realm?: string

specification/security/saml_authenticate/Response.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,25 @@ import { integer } from '@_types/Numeric'
2121

2222
export class Response {
2323
body: {
24+
/**
25+
* The access token that was generated by Elasticsearch.
26+
*/
2427
access_token: string
28+
/**
29+
* The authenticated user's name.
30+
*/
2531
username: string
32+
/**
33+
* The amount of time (in seconds) left until the token expires.
34+
*/
2635
expires_in: integer
36+
/**
37+
* The refresh token that was generated by Elasticsearch.
38+
*/
2739
refresh_token: string
40+
/**
41+
* The name of the realm where the user was authenticated.
42+
*/
2843
realm: string
2944
}
3045
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# summary:
2+
# method_request: POST /_security/saml/authenticate
3+
description: >
4+
Run `POST /_security/saml/authenticate` to exchange a SAML Response indicating a successful authentication at the SAML IdP for an Elasticsearch access token and refresh token to be used in subsequent requests.
5+
# type: request
6+
value: |-
7+
{
8+
"content" : "PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMD.....",
9+
"ids" : ["4fee3b046395c4e751011e97f8900b5273d56685"]
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# summary:
2+
description: A successful response from `POST /_security/saml/authenticate`.
3+
# type: response
4+
# response_code:
5+
value: |-
6+
{
7+
"access_token" : "46ToAxZVaXVVZTVKOVF5YU04ZFJVUDVSZlV3",
8+
"username" : "Bearer",
9+
"expires_in" : 1200,
10+
"refresh_token": "mJdXLtmvTUSpoLwMvdBt_w",
11+
"realm": "saml1"
12+
}

specification/security/saml_complete_logout/Request.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,20 @@ import { Ids } from '@_types/common'
2424
* Logout of SAML completely.
2525
*
2626
* Verifies the logout response sent from the SAML IdP.
27+
*
28+
* NOTE: This API is intended for use by custom web applications other than Kibana.
29+
* If you are using Kibana, refer to the documentation for configuring SAML single-sign-on on the Elastic Stack.
30+
*
31+
* The SAML IdP may send a logout response back to the SP after handling the SP-initiated SAML Single Logout.
32+
* This API verifies the response by ensuring the content is relevant and validating its signature.
33+
* An empty response is returned if the verification process is successful.
34+
* The response can be sent by the IdP with either the HTTP-Redirect or the HTTP-Post binding.
35+
* The caller of this API must prepare the request accordingly so that this API can handle either of them.
2736
* @rest_spec_name security.saml_complete_logout
2837
* @availability stack since=7.14.0 stability=stable
2938
* @availability serverless stability=stable visibility=private
3039
* @doc_id security-api-saml-complete-logout
40+
* @ext_doc_id security-saml-guide
3141
*/
3242
export interface Request extends RequestBase {
3343
urls: [
@@ -39,9 +49,11 @@ export interface Request extends RequestBase {
3949
body: {
4050
/** The name of the SAML realm in Elasticsearch for which the configuration is used to verify the logout response. */
4151
realm: string
42-
/** A json array with all the valid SAML Request Ids that the caller of the API has for the current user. */
52+
/** A JSON array with all the valid SAML Request Ids that the caller of the API has for the current user. */
4353
ids: Ids
44-
/** If the SAML IdP sends the logout response with the HTTP-Redirect binding, this field must be set to the query string of the redirect URI. */
54+
/**
55+
* If the SAML IdP sends the logout response with the HTTP-Redirect binding, this field must be set to the query string of the redirect URI.
56+
*/
4557
query_string?: string
4658
/** If the SAML IdP sends the logout response with the HTTP-Post binding, this field must be set to the value of the SAMLResponse form parameter from the logout response. */
4759
content?: string

0 commit comments

Comments
 (0)