ユーザーとグループをロールにマッピングする

ロールマッピングは、nativeおよびfileを除くすべてのレルムでサポートされています。

ネイティブおよびファイルレルムは、ユーザーに直接ロールを割り当てます。ネイティブレルムはuser management APIsを使用します。ファイルレルムはFile-based role managementを使用します。

ロールは、Role mapping API(推奨)またはRole mapping fileを通じてマッピングできます。

PKI、LDAP、AD、Kerberos、OpenID Connect、JWT、およびSAMLレルムはRole mapping APIをサポートしています。PKI、LDAP、およびADレルムのみがRole mapping filesをサポートしています。

PKI、LDAP、AD、Kerberos、OpenID Connect、JWT、およびSAMLレルムは、delegated authorizationもサポートしています。レルムのためにロールをマッピングするか、委任された認可を使用するかのいずれかを選択できます。両方を同時に使用することはできません。

ロールマッピングを使用するには、ロールとロールマッピングルールを作成します。ロールマッピングルールは、レルム名、レルムタイプ、ユーザー名、グループ、他のユーザーメタデータ、またはそれらの値の組み合わせに基づくことができます。

anonymous accessが有効になっている場合、匿名ユーザーのロールは他のすべてのユーザーにも割り当てられます。

APIを通じて作成されたロールマッピングルールとロールマッピングファイルがある場合、ルールは組み合わされます。単一のユーザーがAPIを通じてマッピングされたロールと、ロールマッピングファイルに基づいて割り当てられた他のロールを持つことが可能です。ロールマッピングはAPIを介して定義するか、filesを通じて管理できます。これらの2つのロールマッピングソースはElasticsearchのセキュリティ機能内で組み合わされるため、単一のユーザーがAPIを通じてマッピングされたロールと、ファイルを通じてマッピングされた他のロールを持つことが可能です。

ロールが割り当てられていないユーザーは、いかなるアクションにも権限がありません。言い換えれば、認証はできるかもしれませんが、ロールはありません。ロールがないということは特権がないということであり、特権がないということはリクエストを行う権限がないということです。

ロールマッピングを使用してユーザーにロールを割り当てる場合、ロールは存在しなければなりません。ロールのソースは2つあります。利用可能なロールは、role management APIsを使用して追加するか、roles fileで定義する必要があります。いずれのロールマッピング方法も、いずれのロール管理方法を使用できます。たとえば、ロールマッピングAPIを使用する場合、API管理ロールとファイル管理ロールの両方にユーザーをマッピングできます(ファイルベースのロールマッピングについても同様です)。

ロールマッピングAPIの使用

ロールマッピングは、add role mapping APIを通じて定義できます。

ロールマッピングファイルの使用

ファイルベースのロールマッピングを使用するには、YAMLファイルにマッピングを構成し、それをクラスター内の各ノードにコピーする必要があります。PuppetやChefなどのツールが役立ちます。

デフォルトでは、ロールマッピングはES_PATH_CONF/role_mapping.ymlに保存され、ES_PATH_CONFES_HOME/config(zip/tarインストール)または/etc/elasticsearch(パッケージインストール)です。別の場所を指定するには、files.role_mapping設定をActive DirectoryLDAP、およびPKIレルム設定でelasticsearch.ymlに構成します。

ロールマッピングファイル内では、セキュリティロールがキーで、グループとユーザーが値です。マッピングは多対多の関係を持つことができます。グループにロールをマッピングすると、そのグループ内のユーザーのロールは、そのグループに割り当てられたロールとそのユーザーに割り当てられたロールの組み合わせになります。

デフォルトでは、Elasticsearchは5秒ごとにロールマッピングファイルの変更をチェックします。このデフォルトの動作は、resource.reload.interval.high設定をelasticsearch.ymlファイルで変更することで変更できます。これはElasticsearchの一般的な設定であるため、その値を変更するとシステム内の他のスケジュールに影響を与える可能性があります。

ロールマッピングAPIはロールマッピングを管理するための推奨方法ですが、role_mapping.ymlファイルの使用は、いくつかのユースケースで便利になります:

  • 1. 誰も(Elasticsearchノードに物理的にアクセスできる管理者を除く)が変更できない固定ロールマッピングを定義したい場合。
  • 2. クラスター管理が外部レルムのユーザーに依存し、これらのユーザーがクラスターがREDのときでもロールをマッピングされる必要がある場合。たとえば、LDAPまたはPKIを介して認証され、修正アクションを実行できるように管理者ロールが割り当てられる管理者。

ただし、role_mapping.ymlファイルは最小限の管理機能として提供されており、すべてのユースケースのロールを定義するために使用されることを意図していません。

ロールマッピングAPIを使用してロールマッピングファイルに定義されたロールを表示、編集、または削除することはできません。

レルム固有の詳細

Active DirectoryおよびLDAPレルム

ロールマッピングでユーザーとグループを指定するには、Distinguished Names(DN)を使用します。DNは、ユーザーまたはグループを一意に識別する文字列です。たとえば、"cn=John Doe,cn=contractors,dc=example,dc=com"です。

Elasticsearchのセキュリティ機能は、Active Directoryセキュリティグループのみをサポートしています。配布グループをロールにマッピングすることはできません。

たとえば、次のスニペットは、ファイルベースの方法を使用してadminsグループをmonitoringロールにマッピングし、John Doeユーザー、usersグループ、およびadminsグループをuserロールにマッピングします。

Yaml

  1. monitoring:
  2. - "cn=admins,dc=example,dc=com"
  3. user:
  4. - "cn=John Doe,cn=contractors,dc=example,dc=com"
  5. - "cn=users,dc=example,dc=com"
  6. - "cn=admins,dc=example,dc=com"
ロールの名前。
LDAPグループまたはActive Directoryセキュリティグループの識別名。
LDAPまたはActive Directoryユーザーの識別名。

ロールマッピングAPIを使用して、次のように同等のマッピングを定義できます:

Python

  1. resp = client.security.put_role_mapping(
  2. name="admins",
  3. roles=[
  4. "monitoring",
  5. "user"
  6. ],
  7. rules={
  8. "field": {
  9. "groups": "cn=admins,dc=example,dc=com"
  10. }
  11. },
  12. enabled=True,
  13. )
  14. print(resp)

Js

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

Console

  1. PUT /_security/role_mapping/admins
  2. {
  3. "roles" : [ "monitoring", "user" ],
  4. "rules" : { "field" : { "groups" : "cn=admins,dc=example,dc=com" } },
  5. "enabled": true
  6. }

Python

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

Js

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

Console

  1. PUT /_security/role_mapping/basic_users
  2. {
  3. "roles" : [ "user" ],
  4. "rules" : { "any" : [
  5. { "field" : { "dn" : "cn=John Doe,cn=contractors,dc=example,dc=com" } },
  6. { "field" : { "groups" : "cn=users,dc=example,dc=com" } }
  7. ] },
  8. "enabled": true
  9. }

PKIレルム

PKIレルムはユーザーをロールにマッピングすることをサポートしていますが、PKIレルムにはグループの概念がないため、グループをマッピングすることはできません。

これはファイルベースのマッピングを使用した例です:

Yaml

  1. monitoring:
  2. - "cn=Admin,ou=example,o=com"
  3. user:
  4. - "cn=John Doe,ou=example,o=com"

次の例は、APIを使用して同等のマッピングを作成します:

Python

  1. resp = client.security.put_role_mapping(
  2. name="admin_user",
  3. roles=[
  4. "monitoring"
  5. ],
  6. rules={
  7. "field": {
  8. "dn": "cn=Admin,ou=example,o=com"
  9. }
  10. },
  11. enabled=True,
  12. )
  13. print(resp)

Js

  1. const response = await client.security.putRoleMapping({
  2. name: "admin_user",
  3. roles: ["monitoring"],
  4. rules: {
  5. field: {
  6. dn: "cn=Admin,ou=example,o=com",
  7. },
  8. },
  9. enabled: true,
  10. });
  11. console.log(response);

Console

  1. PUT /_security/role_mapping/admin_user
  2. {
  3. "roles" : [ "monitoring" ],
  4. "rules" : { "field" : { "dn" : "cn=Admin,ou=example,o=com" } },
  5. "enabled": true
  6. }

Python

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

Js

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

Console

  1. PUT /_security/role_mapping/basic_user
  2. {
  3. "roles" : [ "user" ],
  4. "rules" : { "field" : { "dn" : "cn=John Doe,ou=example,o=com" } },
  5. "enabled": true
  6. }