Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Обеспечение безопасности Elastic Stack ›Авторизация пользователей

Отправка запросов от имени других пользователей

Роли Elasticsearch поддерживают привилегию run_as, которая позволяет аутентифицированному пользователю отправлять запросы от имени других пользователей. Например, если ваше внешнее приложение доверяет аутентификации пользователей, Elasticsearch может аутентифицировать внешнее приложение и использовать механизм выполнять как для отправки авторизованных запросов от имени других пользователей без необходимости повторной аутентификации каждого пользователя.

Для использования механизма «выполнять как» (притворяться другим пользователем) первый пользователь (аутентифицирующий пользователь) должен быть аутентифицирован механизмом, поддерживающим делегирование «выполнять как». Второй пользователь (пользователь run_as) должен быть авторизован механизмом, поддерживающим поиск по имени пользователя для делегированного «выполнять как».

Привилегия 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 для любого домена, поддерживающего поиск пользователей. Не все домены поддерживают поиск пользователей. Обратитесь к списку поддерживаемых доменов и убедитесь, что используемый вами домен настроен так, чтобы поддерживать поиск пользователей.

Пользователя run_as необходимо получить из домена — нельзя выполнять действия от имени сервисной учетной записи, API-ключа или токен доступа.

Для отправки запросов от имени других пользователей необходимо иметь привилегию run_as в своих ролях. Например, следующий запрос создаёт роль my_director, которая предоставляет разрешение на отправку запросов от имени пользователей jacknich или redeniro:

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)
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/

Пользователь run_as, переданный в заголовке es-security-runas-user, должен быть доступен в домене, поддерживающем поиск по имени пользователя для делегированной авторизации. Домены, не поддерживающие поиск пользователей, не могут использоваться для делегированной авторизации run_as от других доменов.

Например, домены JWT могут аутентифицировать внешних пользователей, указанных в JWT, и выполнять запросы от имени пользователя run_as в домене native. Elasticsearch получит указанного пользователя runas и выполнит запрос от его имени, используя его роли.

Применение привилегии run_as к ролям

Вы можете применить привилегию run_as при создании ролей с помощью API создания или обновления ролей. Пользователи, которым назначена роль, содержащая привилегию run_as, наследуют все привилегии из своей роли и также могут отправлять запросы от имени указанных пользователей.

Роли для аутентифицирующего пользователя и пользователя run_as не объединяются. Если пользователь аутентифицируется без указания параметра run_as, используются только роли аутентифицированного пользователя. Если пользователь аутентифицируется и его роли включают параметр run_as, используются только роли пользователя run_as.

После успешной аутентификации пользователя в Elasticsearch процесс авторизации определяет, разрешено ли пользователю, стоящему за входящим запросом, выполнить этот запрос. Если у аутентифицированного пользователя есть привилегия run_as в списке разрешений и он указывает заголовок «выполнять как», Elasticsearch отбрасывает аутентифицированного пользователя и связанные с ним роли. Затем он ищет в каждом из настроенных доменов в цепочке доменов до тех пор, пока не найдёт имя пользователя, связанное с пользователем run_as, и использует эти роли для выполнения запросов.

Рассмотрим роль администратора и роль аналитика. Роль администратора имеет более высокие привилегии, но также может захотеть отправлять запросы от имени другого пользователя для тестирования и проверки своих разрешений.

Сначала создадим роль администратора с именем my_admin_role. Эта роль имеет manage привилегии для всего кластера и подмножества индексов. Эта роль также содержит привилегию run_as, которая позволяет любому пользователю с этой ролью отправлять запросы от имени указанного analyst_user.

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)
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 привилегии для подмножества индексов.

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)
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.

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)
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.

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)
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}
}

После этого вы можете аутентифицироваться в Elasticsearch в качестве пользователя admin_user или analyst_user. Однако, пользователь admin_user может по желанию отправлять запросы от имени пользователя analyst_user. Следующий запрос аутентифицируется в Elasticsearch с помощью токена авторизации Basic и отправляет запрос от имени пользователя analyst_user:

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

Ответ указывает, что запрос отправлен пользователем analyst_user, используя роли, назначенные этому пользователю. Когда 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 принадлежат этому домену. Если два пользователя находятся в разных доменах, значения authentication_realm и lookup_realm будут отличаться (например, pki и native).

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/run-as-privilege.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API