他のユーザーの代理でリクエストを送信する
Elasticsearchのロールは、認証されたユーザーが他のユーザーの代理でリクエストを送信できるrun_as
権限をサポートしています。たとえば、外部アプリケーションがユーザーを認証することが信頼されている場合、Elasticsearchは外部アプリケーションを認証し、run asメカニズムを使用して、各ユーザーを再認証することなく他のユーザーとして承認されたリクエストを発行できます。
他のユーザーとして「実行する」(なりすます)には、最初のユーザー(認証ユーザー)がrun-as委任をサポートするメカニズムによって認証される必要があります。2番目のユーザー(run_as
ユーザー)は、ユーザー名による委任されたrun-asルックアップをサポートするメカニズムによって承認される必要があります。
- 認証ユーザー
認証ユーザーに対して、次のレルム(およびAPIキー)はすべて`````run_as`````委任をサポートします:`````native`````、`````file`````、Active Directory、JWT、Kerberos、LDAP、およびPKI。
サービストークン、Elasticsearchトークンサービス、SAML 2.0、およびOIDC 1.0は`````run_as`````委任をサポートしていません。
- `````run_as`````ユーザー
Elasticsearchは、ユーザーのルックアップをサポートする任意のレルムに対して`````run_as`````をサポートしています。すべてのレルムがユーザーのルックアップをサポートしているわけではありません。[サポートされているレルム](/read/elasticsearch-8-15/399ff51b09ced7f7.md)のリストを参照し、使用したいレルムがユーザーのルックアップをサポートするように構成されていることを確認してください。
`````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)として実行することはできません。
他のユーザーの代理でリクエストを送信するには、[ロール](/read/elasticsearch-8-15/e0fc3d2fadc5af96.md)に`````run_as`````権限を持っている必要があります。たとえば、次のリクエストは、`````jacknich`````または`````redeniro`````の代理でリクエストを送信する権限を付与する`````my_director`````ロールを作成します。
#### Python
``````python
resp = client.security.put_role(
name="my_director",
refresh=True,
cluster=[
"manage"
],
indices=[
{
"names": [
"index1",
"index2"
],
"privileges": [
"manage"
]
}
],
run_as=[
"jacknich",
"rdeniro"
],
metadata={
"version": 1
},
)
print(resp)
`
Js
const response = await client.security.putRole({
name: "my_director",
refresh: "true",
cluster: ["manage"],
indices: [
{
names: ["index1", "index2"],
privileges: ["manage"],
},
],
run_as: ["jacknich", "rdeniro"],
metadata: {
version: 1,
},
});
console.log(response);
コンソール
POST /_security/role/my_director?refresh=true
{
"cluster": ["manage"],
"indices": [
{
"names": [ "index1", "index2" ],
"privileges": [ "manage" ]
}
],
"run_as": [ "jacknich", "rdeniro" ],
"metadata" : {
"version" : 1
}
}
他のユーザーとしてリクエストを送信するには、es-security-runas-user
リクエストヘッダーでユーザーを指定します。たとえば:
curl -H "es-security-runas-user: jacknich" -u es-admin -X GET http://localhost:9200/
たとえば、JWTレルムはJWTで指定された外部ユーザーを認証し、`````run_as`````ユーザーとして`````native`````レルムでリクエストを実行できます。Elasticsearchは指定された`````runas`````ユーザーを取得し、そのユーザーのロールを使用してリクエストを実行します。
## run_as権限をロールに適用する
ロールを作成する際に[ロールの作成または更新API](/read/elasticsearch-8-15/1ad9f529ffc71727.md)を使用して`````run_as`````権限を適用できます。`````run_as`````権限を含むロールが割り当てられたユーザーは、そのロールからすべての権限を継承し、指定されたユーザーの代理でリクエストを送信することもできます。
認証ユーザーと`````run_as`````ユーザーのロールはマージされません。ユーザーが`````run_as`````パラメータを指定せずに認証されると、認証されたユーザーのロールのみが使用されます。ユーザーが認証され、そのロールに`````run_as`````パラメータが含まれている場合、`````run_as`````ユーザーのロールのみが使用されます。
ユーザーがElasticsearchに正常に認証されると、承認プロセスが、受信リクエストの背後にいるユーザーがそのリクエストを実行することを許可されているかどうかを判断します。認証されたユーザーが権限リストに`````run_as`````権限を持ち、run-asヘッダーを指定すると、Elasticsearchは認証されたユーザーと関連するロールを*破棄*します。その後、`````run_as`````ユーザーに関連付けられたユーザー名が見つかるまで、レルムチェーン内の各構成されたレルムを調べ、そのロールを使用してリクエストを実行します。
管理者ロールとアナリストロールを考えてみましょう。管理者ロールはより高い権限を持っていますが、他のユーザーとしてリクエストを送信してその権限をテストおよび検証したい場合もあります。
まず、`````my_admin_role`````という名前の管理者ロールを作成します。このロールは、クラスタ全体および一部のインデックスに対して`````manage````` [権限](/read/elasticsearch-8-15/bb0cb02ec6b02154.md)を持っています。このロールには、指定された`````analyst_user`````の代理でリクエストを送信できる`````run_as`````権限も含まれています。
#### Python
``````python
resp = client.security.put_role(
name="my_admin_role",
refresh=True,
cluster=[
"manage"
],
indices=[
{
"names": [
"index1",
"index2"
],
"privileges": [
"manage"
]
}
],
applications=[
{
"application": "myapp",
"privileges": [
"admin",
"read"
],
"resources": [
"*"
]
}
],
run_as=[
"analyst_user"
],
metadata={
"version": 1
},
)
print(resp)
`
Js
const response = await client.security.putRole({
name: "my_admin_role",
refresh: "true",
cluster: ["manage"],
indices: [
{
names: ["index1", "index2"],
privileges: ["manage"],
},
],
applications: [
{
application: "myapp",
privileges: ["admin", "read"],
resources: ["*"],
},
],
run_as: ["analyst_user"],
metadata: {
version: 1,
},
});
console.log(response);
コンソール
POST /_security/role/my_admin_role?refresh=true
{
"cluster": ["manage"],
"indices": [
{
"names": [ "index1", "index2" ],
"privileges": [ "manage" ]
}
],
"applications": [
{
"application": "myapp",
"privileges": [ "admin", "read" ],
"resources": [ "*" ]
}
],
"run_as": [ "analyst_user" ],
"metadata" : {
"version" : 1
}
}
次に、my_analyst_role
という名前のアナリストロールを作成します。このロールは、より制限されたmonitor
クラスタ権限とmanage
権限を一部のインデックスに持っています。
Python
resp = client.security.put_role(
name="my_analyst_role",
refresh=True,
cluster=[
"monitor"
],
indices=[
{
"names": [
"index1",
"index2"
],
"privileges": [
"manage"
]
}
],
applications=[
{
"application": "myapp",
"privileges": [
"read"
],
"resources": [
"*"
]
}
],
metadata={
"version": 1
},
)
print(resp)
Js
const response = await client.security.putRole({
name: "my_analyst_role",
refresh: "true",
cluster: ["monitor"],
indices: [
{
names: ["index1", "index2"],
privileges: ["manage"],
},
],
applications: [
{
application: "myapp",
privileges: ["read"],
resources: ["*"],
},
],
metadata: {
version: 1,
},
});
console.log(response);
コンソール
POST /_security/role/my_analyst_role?refresh=true
{
"cluster": [ "monitor"],
"indices": [
{
"names": [ "index1", "index2" ],
"privileges": ["manage"]
}
],
"applications": [
{
"application": "myapp",
"privileges": [ "read" ],
"resources": [ "*" ]
}
],
"metadata" : {
"version" : 1
}
}
管理者ユーザーを作成し、my_admin_role
という名前のロールを割り当てます。このロールにより、このユーザーはanalyst_user
としてリクエストを送信できます。
Python
resp = client.security.put_user(
username="admin_user",
refresh=True,
password="l0ng-r4nd0m-p@ssw0rd",
roles=[
"my_admin_role"
],
full_name="Eirian Zola",
metadata={
"intelligence": 7
},
)
print(resp)
Js
const response = await client.security.putUser({
username: "admin_user",
refresh: "true",
password: "l0ng-r4nd0m-p@ssw0rd",
roles: ["my_admin_role"],
full_name: "Eirian Zola",
metadata: {
intelligence: 7,
},
});
console.log(response);
コンソール
POST /_security/user/admin_user?refresh=true
{
"password": "l0ng-r4nd0m-p@ssw0rd",
"roles": [ "my_admin_role" ],
"full_name": "Eirian Zola",
"metadata": { "intelligence" : 7}
}
アナリストユーザーを作成し、my_analyst_role
という名前のロールを割り当てることもできます。
Python
resp = client.security.put_user(
username="analyst_user",
refresh=True,
password="l0nger-r4nd0mer-p@ssw0rd",
roles=[
"my_analyst_role"
],
full_name="Monday Jaffe",
metadata={
"innovation": 8
},
)
print(resp)
Js
const response = await client.security.putUser({
username: "analyst_user",
refresh: "true",
password: "l0nger-r4nd0mer-p@ssw0rd",
roles: ["my_analyst_role"],
full_name: "Monday Jaffe",
metadata: {
innovation: 8,
},
});
console.log(response);
コンソール
POST /_security/user/analyst_user?refresh=true
{
"password": "l0nger-r4nd0mer-p@ssw0rd",
"roles": [ "my_analyst_role" ],
"full_name": "Monday Jaffe",
"metadata": { "innovation" : 8}
}
その後、admin_user
またはanalyst_user
としてElasticsearchに認証できます。ただし、admin_user
はオプションでanalyst_user
の代理でリクエストを送信できます。次のリクエストは、Basic
承認トークンを使用してElasticsearchに認証し、analyst_user
としてリクエストを送信します:
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
ユーザーのロールを使用しました。
{"username":"analyst_user","roles":["my_analyst_role"],"full_name":"Monday Jaffe","email":null,
"metadata":{"innovation":8},"enabled":true,"authentication_realm":{"name":"native",
"type":"native"},"lookup_realm":{"name":"native","type":"native"},"authentication_type":"realm"}
%
レスポンス内のauthentication_realm
とlookup_realm
は、native
レルムを両方とも指定しています。なぜなら、admin_user
とanalyst_user
の両方がそのレルムに属しているからです。2人のユーザーが異なるレルムにいる場合、authentication_realm
とlookup_realm
の値は異なります(pki
やnative
など)。