他のユーザーの代理でリクエストを送信する

Elasticsearchのロールは、認証されたユーザーが他のユーザーの代理でリクエストを送信できるrun_as権限をサポートしています。たとえば、外部アプリケーションがユーザーを認証することが信頼されている場合、Elasticsearchは外部アプリケーションを認証し、run asメカニズムを使用して、各ユーザーを再認証することなく他のユーザーとして承認されたリクエストを発行できます。

他のユーザーとして「実行する」(なりすます)には、最初のユーザー(認証ユーザー)がrun-as委任をサポートするメカニズムによって認証される必要があります。2番目のユーザー(run_asユーザー)は、ユーザー名による委任されたrun-asルックアップをサポートするメカニズムによって承認される必要があります。

  1. - 認証ユーザー
  2. 認証ユーザーに対して、次のレルム(およびAPIキー)はすべて`````run_as`````委任をサポートします:`````native``````````file`````Active DirectoryJWTKerberosLDAP、およびPKI
  3. サービストークン、Elasticsearchトークンサービス、SAML 2.0、およびOIDC 1.0`````run_as`````委任をサポートしていません。
  4. - `````run_as`````ユーザー
  5. Elasticsearchは、ユーザーのルックアップをサポートする任意のレルムに対して`````run_as`````をサポートしています。すべてのレルムがユーザーのルックアップをサポートしているわけではありません。[サポートされているレルム](/read/elasticsearch-8-15/399ff51b09ced7f7.md)のリストを参照し、使用したいレルムがユーザーのルックアップをサポートするように構成されていることを確認してください。
  6. `````run_as`````ユーザーは[レルム](/read/elasticsearch-8-15/58097a11df692e4a.md)から取得する必要があります - [サービスアカウント](/read/elasticsearch-8-15/30f68cf630606510.md)、[APIキー](9521ab5b40b75eb9.md#token-authentication-api-key)、または[アクセストークン](9521ab5b40b75eb9.md#token-authentication-access-token)として実行することはできません。
  7. 他のユーザーの代理でリクエストを送信するには、[ロール](/read/elasticsearch-8-15/e0fc3d2fadc5af96.md)に`````run_as`````権限を持っている必要があります。たとえば、次のリクエストは、`````jacknich`````または`````redeniro`````の代理でリクエストを送信する権限を付与する`````my_director`````ロールを作成します。
  8. #### Python
  9. ``````python
  10. resp = client.security.put_role(
  11. name="my_director",
  12. refresh=True,
  13. cluster=[
  14. "manage"
  15. ],
  16. indices=[
  17. {
  18. "names": [
  19. "index1",
  20. "index2"
  21. ],
  22. "privileges": [
  23. "manage"
  24. ]
  25. }
  26. ],
  27. run_as=[
  28. "jacknich",
  29. "rdeniro"
  30. ],
  31. metadata={
  32. "version": 1
  33. },
  34. )
  35. print(resp)
  36. `

Js

  1. const response = await client.security.putRole({
  2. name: "my_director",
  3. refresh: "true",
  4. cluster: ["manage"],
  5. indices: [
  6. {
  7. names: ["index1", "index2"],
  8. privileges: ["manage"],
  9. },
  10. ],
  11. run_as: ["jacknich", "rdeniro"],
  12. metadata: {
  13. version: 1,
  14. },
  15. });
  16. console.log(response);

コンソール

  1. POST /_security/role/my_director?refresh=true
  2. {
  3. "cluster": ["manage"],
  4. "indices": [
  5. {
  6. "names": [ "index1", "index2" ],
  7. "privileges": [ "manage" ]
  8. }
  9. ],
  10. "run_as": [ "jacknich", "rdeniro" ],
  11. "metadata" : {
  12. "version" : 1
  13. }
  14. }

他のユーザーとしてリクエストを送信するには、es-security-runas-userリクエストヘッダーでユーザーを指定します。たとえば:

  1. curl -H "es-security-runas-user: jacknich" -u es-admin -X GET http://localhost:9200/
  1. たとえば、JWTレルムはJWTで指定された外部ユーザーを認証し、`````run_as`````ユーザーとして`````native`````レルムでリクエストを実行できます。Elasticsearchは指定された`````runas`````ユーザーを取得し、そのユーザーのロールを使用してリクエストを実行します。
  2. ## run_as権限をロールに適用する
  3. ロールを作成する際に[ロールの作成または更新API](/read/elasticsearch-8-15/1ad9f529ffc71727.md)を使用して`````run_as`````権限を適用できます。`````run_as`````権限を含むロールが割り当てられたユーザーは、そのロールからすべての権限を継承し、指定されたユーザーの代理でリクエストを送信することもできます。
  4. 認証ユーザーと`````run_as`````ユーザーのロールはマージされません。ユーザーが`````run_as`````パラメータを指定せずに認証されると、認証されたユーザーのロールのみが使用されます。ユーザーが認証され、そのロールに`````run_as`````パラメータが含まれている場合、`````run_as`````ユーザーのロールのみが使用されます。
  5. ユーザーがElasticsearchに正常に認証されると、承認プロセスが、受信リクエストの背後にいるユーザーがそのリクエストを実行することを許可されているかどうかを判断します。認証されたユーザーが権限リストに`````run_as`````権限を持ち、run-asヘッダーを指定すると、Elasticsearchは認証されたユーザーと関連するロールを*破棄*します。その後、`````run_as`````ユーザーに関連付けられたユーザー名が見つかるまで、レルムチェーン内の各構成されたレルムを調べ、そのロールを使用してリクエストを実行します。
  6. 管理者ロールとアナリストロールを考えてみましょう。管理者ロールはより高い権限を持っていますが、他のユーザーとしてリクエストを送信してその権限をテストおよび検証したい場合もあります。
  7. まず、`````my_admin_role`````という名前の管理者ロールを作成します。このロールは、クラスタ全体および一部のインデックスに対して`````manage````` [権限](/read/elasticsearch-8-15/bb0cb02ec6b02154.md)を持っています。このロールには、指定された`````analyst_user`````の代理でリクエストを送信できる`````run_as`````権限も含まれています。
  8. #### Python
  9. ``````python
  10. resp = client.security.put_role(
  11. name="my_admin_role",
  12. refresh=True,
  13. cluster=[
  14. "manage"
  15. ],
  16. indices=[
  17. {
  18. "names": [
  19. "index1",
  20. "index2"
  21. ],
  22. "privileges": [
  23. "manage"
  24. ]
  25. }
  26. ],
  27. applications=[
  28. {
  29. "application": "myapp",
  30. "privileges": [
  31. "admin",
  32. "read"
  33. ],
  34. "resources": [
  35. "*"
  36. ]
  37. }
  38. ],
  39. run_as=[
  40. "analyst_user"
  41. ],
  42. metadata={
  43. "version": 1
  44. },
  45. )
  46. print(resp)
  47. `

Js

  1. const response = await client.security.putRole({
  2. name: "my_admin_role",
  3. refresh: "true",
  4. cluster: ["manage"],
  5. indices: [
  6. {
  7. names: ["index1", "index2"],
  8. privileges: ["manage"],
  9. },
  10. ],
  11. applications: [
  12. {
  13. application: "myapp",
  14. privileges: ["admin", "read"],
  15. resources: ["*"],
  16. },
  17. ],
  18. run_as: ["analyst_user"],
  19. metadata: {
  20. version: 1,
  21. },
  22. });
  23. console.log(response);

コンソール

  1. POST /_security/role/my_admin_role?refresh=true
  2. {
  3. "cluster": ["manage"],
  4. "indices": [
  5. {
  6. "names": [ "index1", "index2" ],
  7. "privileges": [ "manage" ]
  8. }
  9. ],
  10. "applications": [
  11. {
  12. "application": "myapp",
  13. "privileges": [ "admin", "read" ],
  14. "resources": [ "*" ]
  15. }
  16. ],
  17. "run_as": [ "analyst_user" ],
  18. "metadata" : {
  19. "version" : 1
  20. }
  21. }

次に、my_analyst_roleという名前のアナリストロールを作成します。このロールは、より制限されたmonitorクラスタ権限とmanage権限を一部のインデックスに持っています。

Python

  1. resp = client.security.put_role(
  2. name="my_analyst_role",
  3. refresh=True,
  4. cluster=[
  5. "monitor"
  6. ],
  7. indices=[
  8. {
  9. "names": [
  10. "index1",
  11. "index2"
  12. ],
  13. "privileges": [
  14. "manage"
  15. ]
  16. }
  17. ],
  18. applications=[
  19. {
  20. "application": "myapp",
  21. "privileges": [
  22. "read"
  23. ],
  24. "resources": [
  25. "*"
  26. ]
  27. }
  28. ],
  29. metadata={
  30. "version": 1
  31. },
  32. )
  33. print(resp)

Js

  1. const response = await client.security.putRole({
  2. name: "my_analyst_role",
  3. refresh: "true",
  4. cluster: ["monitor"],
  5. indices: [
  6. {
  7. names: ["index1", "index2"],
  8. privileges: ["manage"],
  9. },
  10. ],
  11. applications: [
  12. {
  13. application: "myapp",
  14. privileges: ["read"],
  15. resources: ["*"],
  16. },
  17. ],
  18. metadata: {
  19. version: 1,
  20. },
  21. });
  22. console.log(response);

コンソール

  1. POST /_security/role/my_analyst_role?refresh=true
  2. {
  3. "cluster": [ "monitor"],
  4. "indices": [
  5. {
  6. "names": [ "index1", "index2" ],
  7. "privileges": ["manage"]
  8. }
  9. ],
  10. "applications": [
  11. {
  12. "application": "myapp",
  13. "privileges": [ "read" ],
  14. "resources": [ "*" ]
  15. }
  16. ],
  17. "metadata" : {
  18. "version" : 1
  19. }
  20. }

管理者ユーザーを作成し、my_admin_roleという名前のロールを割り当てます。このロールにより、このユーザーはanalyst_userとしてリクエストを送信できます。

Python

  1. resp = client.security.put_user(
  2. username="admin_user",
  3. refresh=True,
  4. password="l0ng-r4nd0m-p@ssw0rd",
  5. roles=[
  6. "my_admin_role"
  7. ],
  8. full_name="Eirian Zola",
  9. metadata={
  10. "intelligence": 7
  11. },
  12. )
  13. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "admin_user",
  3. refresh: "true",
  4. password: "l0ng-r4nd0m-p@ssw0rd",
  5. roles: ["my_admin_role"],
  6. full_name: "Eirian Zola",
  7. metadata: {
  8. intelligence: 7,
  9. },
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/user/admin_user?refresh=true
  2. {
  3. "password": "l0ng-r4nd0m-p@ssw0rd",
  4. "roles": [ "my_admin_role" ],
  5. "full_name": "Eirian Zola",
  6. "metadata": { "intelligence" : 7}
  7. }

アナリストユーザーを作成し、my_analyst_roleという名前のロールを割り当てることもできます。

Python

  1. resp = client.security.put_user(
  2. username="analyst_user",
  3. refresh=True,
  4. password="l0nger-r4nd0mer-p@ssw0rd",
  5. roles=[
  6. "my_analyst_role"
  7. ],
  8. full_name="Monday Jaffe",
  9. metadata={
  10. "innovation": 8
  11. },
  12. )
  13. print(resp)

Js

  1. const response = await client.security.putUser({
  2. username: "analyst_user",
  3. refresh: "true",
  4. password: "l0nger-r4nd0mer-p@ssw0rd",
  5. roles: ["my_analyst_role"],
  6. full_name: "Monday Jaffe",
  7. metadata: {
  8. innovation: 8,
  9. },
  10. });
  11. console.log(response);

コンソール

  1. POST /_security/user/analyst_user?refresh=true
  2. {
  3. "password": "l0nger-r4nd0mer-p@ssw0rd",
  4. "roles": [ "my_analyst_role" ],
  5. "full_name": "Monday Jaffe",
  6. "metadata": { "innovation" : 8}
  7. }

その後、admin_userまたはanalyst_userとしてElasticsearchに認証できます。ただし、admin_userはオプションでanalyst_userの代理でリクエストを送信できます。次のリクエストは、Basic承認トークンを使用してElasticsearchに認証し、analyst_userとしてリクエストを送信します:

  1. curl -s -X GET -H "Authorization: Basic YWRtaW5fdXNlcjpsMG5nLXI0bmQwbS1wQHNzdzByZA==" -H "es-security-runas-user: analyst_user" https://localhost:9200/_security/_authenticate

レスポンスは、analyst_userがこのリクエストを送信したことを示しており、そのユーザーに割り当てられたmy_analyst_roleを使用しています。admin_userがリクエストを送信したとき、Elasticsearchはそのユーザーを認証し、そのロールを破棄し、run_asユーザーのロールを使用しました。

  1. {"username":"analyst_user","roles":["my_analyst_role"],"full_name":"Monday Jaffe","email":null,
  2. "metadata":{"innovation":8},"enabled":true,"authentication_realm":{"name":"native",
  3. "type":"native"},"lookup_realm":{"name":"native","type":"native"},"authentication_type":"realm"}
  4. %

レスポンス内のauthentication_realmlookup_realmは、nativeレルムを両方とも指定しています。なぜなら、admin_useranalyst_userの両方がそのレルムに属しているからです。2人のユーザーが異なるレルムにいる場合、authentication_realmlookup_realmの値は異なります(pkinativeなど)。