役割マッピングAPIの作成または更新

役割マッピングを作成および更新します。

リクエスト

POST /_security/role_mapping/<name>

PUT /_security/role_mapping/<name>

前提条件

  • このAPIを使用するには、少なくともmanage_securityクラスター権限を持っている必要があります。

説明

役割マッピングは、各ユーザーに割り当てられる役割を定義します。各マッピングには、ユーザーを特定するルールと、そのユーザーに付与される役割のリストがあります。

役割マッピングAPIは、役割マッピングファイルを使用するよりも、役割マッピングを管理するための一般的に推奨される方法です。作成または更新役割マッピングAPIは、役割マッピングファイルで定義された役割マッピングを更新することはできません。

このAPIは役割を作成するものではありません。むしろ、既存の役割にユーザーをマッピングします。役割は、役割の作成または更新APIまたは役割ファイルを使用して作成できます。

詳細については、ユーザーとグループを役割にマッピングするを参照してください。

役割テンプレート

役割マッピングの最も一般的な使用法は、ユーザーの既知の値から固定の役割名へのマッピングを作成することです。たとえば、cn=admin,dc=example,dc=com LDAPグループのすべてのユーザーには、Elasticsearchでsuperuser役割が付与されるべきです。rolesフィールドはこの目的に使用されます。

より複雑なニーズには、Mustacheテンプレートを使用して、ユーザーに付与されるべき役割の名前を動的に決定することが可能です。role_templatesフィールドはこの目的に使用されます。

役割テンプレートを正常に使用するには、関連するスクリプト機能を有効にする必要があります。そうしないと、役割テンプレートを使用して役割マッピングを作成しようとするすべての試みが失敗します。許可されたスクリプトタイプ設定を参照してください。

役割マッピングrulesで利用可能なすべてのユーザーフィールドも役割テンプレートで利用可能です。したがって、ユーザーをそのusernamegroups、または認証されたrealmの名前に基づいて役割に割り当てることが可能です。

デフォルトでは、テンプレートはユーザーに割り当てるべき役割の名前である単一の文字列を生成するように評価されます。テンプレートのformat"json"に設定されている場合、テンプレートは役割名のJSON文字列またはJSON文字列の配列を生成することが期待されます。

パスパラメータ

  • name
  • (文字列) 役割マッピングを識別するための固有の名前。この名前は、APIを介したインタラクションを容易にするための識別子としてのみ使用され、マッピングの動作には影響しません。

リクエストボディ

次のパラメータは、PUTまたはPOSTリクエストのボディに指定でき、役割マッピングの追加に関連しています:

  • enabled
  • (必須、ブール値) enabledfalseに設定されているマッピングは、役割マッピングが実行されるときに無視されます。
  • metadata
  • (オブジェクト) 各ユーザーに割り当てられる役割を定義するのに役立つ追加のメタデータ。metadataオブジェクト内では、_で始まるキーはシステム使用のために予約されています。
  • roles
  • (文字列のリスト) 役割マッピングルールに一致するユーザーに付与される役割名のリスト。rolesまたはrole_templatesのいずれかを正確に指定する必要があります。
  • role_templates
  • (オブジェクトのリスト) 役割マッピングルールに一致するユーザーに付与される役割名を決定するために評価されるMustacheテンプレートのリスト。これらのオブジェクトの形式は以下に定義されています。rolesまたはrole_templatesのいずれかを正確に指定する必要があります。
  • rules
  • (必須、オブジェクト) マッピングによって一致する必要があるユーザーを決定するルール。ルールは、JSON DSLを使用して表現される論理条件です。役割マッピングリソースを参照してください。

次の例では、すべてのユーザーに「user」役割を割り当てます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping1",
  3. roles=[
  4. "user"
  5. ],
  6. enabled=True,
  7. rules={
  8. "field": {
  9. "username": "*"
  10. }
  11. },
  12. metadata={
  13. "version": 1
  14. },
  15. )
  16. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping1",
  3. roles: ["user"],
  4. enabled: true,
  5. rules: {
  6. field: {
  7. username: "*",
  8. },
  9. },
  10. metadata: {
  11. version: 1,
  12. },
  13. });
  14. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping1
  2. {
  3. "roles": [ "user"],
  4. "enabled": true,
  5. "rules": {
  6. "field" : { "username" : "*" }
  7. },
  8. "metadata" : {
  9. "version" : 1
  10. }
  11. }
enabledfalseに設定されているマッピングは、役割マッピングが実行されるときに無視されます。
メタデータはオプションです。

成功した呼び出しは、マッピングが作成または更新されたかどうかを示すJSON構造を返します。

コンソール-結果

  1. {
  2. "role_mapping" : {
  3. "created" : true
  4. }
  5. }
既存のマッピングが更新されると、createdはfalseに設定されます。

次の例では、「user」と「admin」役割を特定のユーザーに割り当てます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping2",
  3. roles=[
  4. "user",
  5. "admin"
  6. ],
  7. enabled=True,
  8. rules={
  9. "field": {
  10. "username": [
  11. "esadmin01",
  12. "esadmin02"
  13. ]
  14. }
  15. },
  16. )
  17. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping2",
  3. roles: ["user", "admin"],
  4. enabled: true,
  5. rules: {
  6. field: {
  7. username: ["esadmin01", "esadmin02"],
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping2
  2. {
  3. "roles": [ "user", "admin" ],
  4. "enabled": true,
  5. "rules": {
  6. "field" : { "username" : [ "esadmin01", "esadmin02" ] }
  7. }
  8. }

次の例では、特定のレルムに対して認証されたユーザーを一致させます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping3",
  3. roles=[
  4. "ldap-user"
  5. ],
  6. enabled=True,
  7. rules={
  8. "field": {
  9. "realm.name": "ldap1"
  10. }
  11. },
  12. )
  13. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping3",
  3. roles: ["ldap-user"],
  4. enabled: true,
  5. rules: {
  6. field: {
  7. "realm.name": "ldap1",
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping3
  2. {
  3. "roles": [ "ldap-user" ],
  4. "enabled": true,
  5. "rules": {
  6. "field" : { "realm.name" : "ldap1" }
  7. }
  8. }

次の例では、ユーザー名がesadminであるか、ユーザーがcn=admin,dc=example,dc=comグループに属する任意のユーザーを一致させます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping4",
  3. roles=[
  4. "superuser"
  5. ],
  6. enabled=True,
  7. rules={
  8. "any": [
  9. {
  10. "field": {
  11. "username": "esadmin"
  12. }
  13. },
  14. {
  15. "field": {
  16. "groups": "cn=admins,dc=example,dc=com"
  17. }
  18. }
  19. ]
  20. },
  21. )
  22. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping4",
  3. roles: ["superuser"],
  4. enabled: true,
  5. rules: {
  6. any: [
  7. {
  8. field: {
  9. username: "esadmin",
  10. },
  11. },
  12. {
  13. field: {
  14. groups: "cn=admins,dc=example,dc=com",
  15. },
  16. },
  17. ],
  18. },
  19. });
  20. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping4
  2. {
  3. "roles": [ "superuser" ],
  4. "enabled": true,
  5. "rules": {
  6. "any": [
  7. {
  8. "field": {
  9. "username": "esadmin"
  10. }
  11. },
  12. {
  13. "field": {
  14. "groups": "cn=admins,dc=example,dc=com"
  15. }
  16. }
  17. ]
  18. }
  19. }

上記の例は、アイデンティティ管理システム(Active DirectoryやSAMLアイデンティティプロバイダーなど)内のグループ名がElasticsearchの役割名と1対1の対応を持たない場合に便利です。役割マッピングは、グループ名役割名にリンクする手段です。

複数のグループがある場合、グループフィールドに配列構文を使用できます。これにより、すべてのグループではなく、任意のグループに一致します:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping4",
  3. roles=[
  4. "superuser"
  5. ],
  6. enabled=True,
  7. rules={
  8. "any": [
  9. {
  10. "field": {
  11. "username": "esadmin"
  12. }
  13. },
  14. {
  15. "field": {
  16. "groups": [
  17. "cn=admins,dc=example,dc=com",
  18. "cn=other,dc=example,dc=com"
  19. ]
  20. }
  21. }
  22. ]
  23. },
  24. )
  25. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping4",
  3. roles: ["superuser"],
  4. enabled: true,
  5. rules: {
  6. any: [
  7. {
  8. field: {
  9. username: "esadmin",
  10. },
  11. },
  12. {
  13. field: {
  14. groups: ["cn=admins,dc=example,dc=com", "cn=other,dc=example,dc=com"],
  15. },
  16. },
  17. ],
  18. },
  19. });
  20. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping4
  2. {
  3. "roles": [ "superuser" ],
  4. "enabled": true,
  5. "rules": {
  6. "any": [
  7. {
  8. "field": {
  9. "username": "esadmin"
  10. }
  11. },
  12. {
  13. "field": {
  14. "groups": [
  15. "cn=admins,dc=example,dc=com",
  16. "cn=other,dc=example,dc=com"
  17. ]
  18. }
  19. }
  20. ]
  21. }
  22. }

ただし、まれにグループの名前がElasticsearchの役割の名前と完全に一致する場合があります。これは、SAMLアイデンティティプロバイダーが独自の「グループマッピング」機能を含み、ユーザーのSAML属性にElasticsearch役割名をリリースするように構成できる場合に発生します。

この場合、グループ名を役割名として扱うテンプレートを使用することが可能です。

注意:これは、提供されたすべてのグループに対して役割を定義するつもりである場合にのみ行うべきです。不要または未定義の役割にユーザーをマッピングすることは非効率的であり、システムのパフォーマンスに悪影響を及ぼす可能性があります。グループのサブセットのみをマッピングする必要がある場合は、明示的なマッピングを使用してこれを行うべきです。

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping5",
  3. role_templates=[
  4. {
  5. "template": {
  6. "source": "{{#tojson}}groups{{/tojson}}"
  7. },
  8. "format": "json"
  9. }
  10. ],
  11. rules={
  12. "field": {
  13. "realm.name": "saml1"
  14. }
  15. },
  16. enabled=True,
  17. )
  18. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping5",
  3. role_templates: [
  4. {
  5. template: {
  6. source: "{{#tojson}}groups{{/tojson}}",
  7. },
  8. format: "json",
  9. },
  10. ],
  11. rules: {
  12. field: {
  13. "realm.name": "saml1",
  14. },
  15. },
  16. enabled: true,
  17. });
  18. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping5
  2. {
  3. "role_templates": [
  4. {
  5. "template": { "source": "{{#tojson}}groups{{/tojson}}" },
  6. "format" : "json"
  7. }
  8. ],
  9. "rules": {
  10. "field" : { "realm.name" : "saml1" }
  11. },
  12. "enabled": true
  13. }
tojsonマスタッシュ関数は、グループ名のリストを有効なJSON配列に変換するために使用されます。
テンプレートがJSON配列を生成するため、形式はjsonに設定する必要があります。

次の例では、特定のLDAPサブツリー内のユーザーを一致させます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping6",
  3. roles=[
  4. "example-user"
  5. ],
  6. enabled=True,
  7. rules={
  8. "field": {
  9. "dn": "*,ou=subtree,dc=example,dc=com"
  10. }
  11. },
  12. )
  13. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping6",
  3. roles: ["example-user"],
  4. enabled: true,
  5. rules: {
  6. field: {
  7. dn: "*,ou=subtree,dc=example,dc=com",
  8. },
  9. },
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping6
  2. {
  3. "roles": [ "example-user" ],
  4. "enabled": true,
  5. "rules": {
  6. "field" : { "dn" : "*,ou=subtree,dc=example,dc=com" }
  7. }
  8. }

次の例では、特定のレルム内の特定のLDAPサブツリー内のユーザーを一致させます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping7",
  3. roles=[
  4. "ldap-example-user"
  5. ],
  6. enabled=True,
  7. rules={
  8. "all": [
  9. {
  10. "field": {
  11. "dn": "*,ou=subtree,dc=example,dc=com"
  12. }
  13. },
  14. {
  15. "field": {
  16. "realm.name": "ldap1"
  17. }
  18. }
  19. ]
  20. },
  21. )
  22. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping7",
  3. roles: ["ldap-example-user"],
  4. enabled: true,
  5. rules: {
  6. all: [
  7. {
  8. field: {
  9. dn: "*,ou=subtree,dc=example,dc=com",
  10. },
  11. },
  12. {
  13. field: {
  14. "realm.name": "ldap1",
  15. },
  16. },
  17. ],
  18. },
  19. });
  20. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping7
  2. {
  3. "roles": [ "ldap-example-user" ],
  4. "enabled": true,
  5. "rules": {
  6. "all": [
  7. { "field" : { "dn" : "*,ou=subtree,dc=example,dc=com" } },
  8. { "field" : { "realm.name" : "ldap1" } }
  9. ]
  10. }
  11. }

ルールはより複雑で、ワイルドカードマッチングを含むことができます。たとえば、次のマッピングは、すべての条件が満たされる任意のユーザーに一致します:

  • Distinguished Nameがパターン*,ou=admin,dc=example,dc=comに一致するか、ユーザー名がes-adminであるか、ユーザー名がes-systemである
  • cn=people,dc=example,dc=comグループのユーザー
  • ユーザーがterminated_dateを持たない

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping8",
  3. roles=[
  4. "superuser"
  5. ],
  6. enabled=True,
  7. rules={
  8. "all": [
  9. {
  10. "any": [
  11. {
  12. "field": {
  13. "dn": "*,ou=admin,dc=example,dc=com"
  14. }
  15. },
  16. {
  17. "field": {
  18. "username": [
  19. "es-admin",
  20. "es-system"
  21. ]
  22. }
  23. }
  24. ]
  25. },
  26. {
  27. "field": {
  28. "groups": "cn=people,dc=example,dc=com"
  29. }
  30. },
  31. {
  32. "except": {
  33. "field": {
  34. "metadata.terminated_date": None
  35. }
  36. }
  37. }
  38. ]
  39. },
  40. )
  41. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping8",
  3. roles: ["superuser"],
  4. enabled: true,
  5. rules: {
  6. all: [
  7. {
  8. any: [
  9. {
  10. field: {
  11. dn: "*,ou=admin,dc=example,dc=com",
  12. },
  13. },
  14. {
  15. field: {
  16. username: ["es-admin", "es-system"],
  17. },
  18. },
  19. ],
  20. },
  21. {
  22. field: {
  23. groups: "cn=people,dc=example,dc=com",
  24. },
  25. },
  26. {
  27. except: {
  28. field: {
  29. "metadata.terminated_date": null,
  30. },
  31. },
  32. },
  33. ],
  34. },
  35. });
  36. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping8
  2. {
  3. "roles": [ "superuser" ],
  4. "enabled": true,
  5. "rules": {
  6. "all": [
  7. {
  8. "any": [
  9. {
  10. "field": {
  11. "dn": "*,ou=admin,dc=example,dc=com"
  12. }
  13. },
  14. {
  15. "field": {
  16. "username": [ "es-admin", "es-system" ]
  17. }
  18. }
  19. ]
  20. },
  21. {
  22. "field": {
  23. "groups": "cn=people,dc=example,dc=com"
  24. }
  25. },
  26. {
  27. "except": {
  28. "field": {
  29. "metadata.terminated_date": null
  30. }
  31. }
  32. }
  33. ]
  34. }
  35. }

テンプレート化された役割は、すべてのユーザーをそれぞれのカスタム役割に自動的にマッピングするために使用できます。役割自体は、役割APIを通じて定義するか、カスタム役割プロバイダーを使用して定義できます。

この例では、「cloud-saml」レルムを使用して認証するすべてのユーザーが、"saml_user"役割と、_user_で接頭辞が付けられたユーザー名の役割に自動的にマッピングされます。たとえば、ユーザーnwongにはsaml_userおよび_user_nwong役割が割り当てられます。

Python

  1. resp = client.security.put_role_mapping(
  2. name="mapping9",
  3. rules={
  4. "field": {
  5. "realm.name": "cloud-saml"
  6. }
  7. },
  8. role_templates=[
  9. {
  10. "template": {
  11. "source": "saml_user"
  12. }
  13. },
  14. {
  15. "template": {
  16. "source": "_user_{{username}}"
  17. }
  18. }
  19. ],
  20. enabled=True,
  21. )
  22. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "mapping9",
  3. rules: {
  4. field: {
  5. "realm.name": "cloud-saml",
  6. },
  7. },
  8. role_templates: [
  9. {
  10. template: {
  11. source: "saml_user",
  12. },
  13. },
  14. {
  15. template: {
  16. source: "_user_{{username}}",
  17. },
  18. },
  19. ],
  20. enabled: true,
  21. });
  22. console.log(response);

コンソール

  1. POST /_security/role_mapping/mapping9
  2. {
  3. "rules": { "field": { "realm.name": "cloud-saml" } },
  4. "role_templates": [
  5. { "template": { "source" : "saml_user" } },
  6. { "template": { "source" : "_user_{{username}}" } }
  7. ],
  8. "enabled": true
  9. }
同じ役割マッピングでrolesrole_templatesの両方を指定することはできないため、置換なしのテンプレートを使用して「固定名」役割を適用できます。