Spec-Zone.ru › Elasticsearch 8
›Руководство по Elasticsearch [8.17] ›Защита Elastic Stack ›Аутентификация пользователей

Аутентификация пользователей с помощью PKI

Вы можете настроить Elasticsearch для использования сертификатов инфраструктуры открытых ключей (PKI) для аутентификации пользователей. В этом случае клиенты, подключающиеся напрямую к Elasticsearch, должны представить сертификаты X.509. Сначала сертификаты должны быть приняты для аутентификации на уровне SSL/TLS в Elasticsearch. Затем они могут быть дополнительно проверены сферой PKI. См. Аутентификацию PKI для клиентов, подключающихся напрямую к Elasticsearch.

Вы также можете использовать сертификаты PKI для аутентификации в Kibana, однако это требует дополнительной настройки. В Elasticsearch эта настройка позволяет Kibana выступать в качестве прокси для аутентификации SSL/TLS и отправлять клиентские сертификаты в Elasticsearch для дальнейшей проверки сферой PKI. См. Аутентификацию PKI для клиентов, подключающихся к Kibana.

Аутентификация PKI для клиентов, подключающихся напрямую к Elasticsearch

Для использования PKI в Elasticsearch необходимо настроить сферу PKI, включить аутентификацию клиентов на нужных сетевых уровнях (транспорт или http) и сопоставить уникальные имена (DN) из поля Subject в сертификатах пользователей с ролями. Сопоставления создаются в файле сопоставлений ролей или с помощью API сопоставлений ролей.

  1. Добавьте конфигурацию сферы для сферы pki в elasticsearch.yml в пространстве имен xpack.security.authc.realms.pki. Вы должны явно установить атрибут order. См. настройки сферы PKI для всех параметров, которые вы можете установить для сферы pki.

    Например, следующий фрагмент показывает самую базовую конфигурацию сферы pki:

    xpack:
      security:
        authc:
          realms:
            pki:
              pki1:
                order: 1

    С этой конфигурацией любой сертификат, которому доверяет уровень SSL/TLS Elasticsearch, принимается для аутентификации. Имя пользователя — это общее имя (CN), извлеченное из DN в поле Subject сертификата конечного узла. Эта конфигурация недостаточна для разрешения аутентификации PKI в Kibana; необходимы дополнительные шаги.

    При настройке сфер в elasticsearch.yml используются только указанные вами сферы для аутентификации. Если вы также хотите использовать сферы native или file, вы должны включить их в цепочке сфер.

  2. Необязательно: имя пользователя определяется с помощью username_pattern. Если вы хотите использовать что-то другое, помимо CN Subject DN, как имя пользователя, вы можете указать регулярное выражение для извлечения нужного имени пользователя. Регулярное выражение применяется к Subject DN.

    Например, регулярное выражение в следующей конфигурации извлекает адрес электронной почты из Subject DN:

    xpack:
      security:
        authc:
          realms:
            pki:
              pki1:
                order: 1
                username_pattern: "EMAILADDRESS=(.*?)(?:,|$)"

    Если регулярное выражение слишком строгое и не соответствует Subject DN сертификата клиента, то сфера не выполняет аутентификацию сертификата.

  3. Необязательно: если вы хотите, чтобы те же пользователи также проходили аутентификацию с помощью сертификатов при подключении к Kibana, вы должны настроить сферу PKI Elasticsearch для разрешения делегирования. См. Аутентификацию PKI для клиентов, подключающихся к Kibana.
  4. Перезапустите Elasticsearch, так как конфигурация сферы не перезагружается автоматически. Если вы следуете последующим шагам, вы можете выполнить перезапуск в последнюю очередь.
  5. Включить SSL/TLS.
  6. Включите аутентификацию клиентов на нужных сетевых уровнях (транспорт или http).

    Для использования PKI при подключении клиентов напрямую к Elasticsearch необходимо включить SSL/TLS с аутентификацией клиентов. То есть, вы должны установить xpack.security.transport.ssl.client_authentication и xpack.security.http.ssl.client_authentication на значение optional или required. Если значение настройки равно optional, клиенты без сертификатов могут аутентифицироваться с помощью других данных.

    При подключении клиентов напрямую к Elasticsearch и отсутствии прокси-аутентификации, сфера PKI опирается на настройки TLS сетевого интерфейса узла. Сфера может быть настроена более строго, чем основное сетевое подключение. То есть, можно настроить узел таким образом, что некоторые подключения принимаются сетевым интерфейсом, но затем не проходят аутентификацию в сфере PKI. Однако обратное невозможно. Сфера PKI не может пройти аутентификацию подключения, которое было отклонено сетевым интерфейсом.

    В частности, это означает:

    • Транспортный или http-интерфейс должен запрашивать клиентские сертификаты, установив client_authentication на значение optional или required.
    • Интерфейс должен доверять сертификату, представленному клиентом, настроив либо пути truststore или certificate_authorities, или установив verification_mode на значение none.
    • Поддерживаемые протоколы интерфейса должны быть совместимы с протоколами, используемыми клиентом.

    Для объяснения этих настроек см. Общие настройки TLS.

    Соответствующий сетевой интерфейс (транспорт или http) должен быть настроен на доверие любому сертификату, который будет использоваться в рамках сферы PKI. Однако можно настроить сферу PKI так, чтобы она доверяла только подмножеству сертификатов, принятых сетевым интерфейсом. Это полезно, когда уровень SSL/TLS доверяет клиентам с сертификатами, подписанными другим центром сертификации, отличным от того, который подписывает сертификаты ваших пользователей.

    Для настройки сферы PKI со своим хранилищем доверенных сертификатов укажите параметр truststore.path. Путь должен находиться в каталоге конфигурации Elasticsearch (ES_PATH_CONF). Например:

    xpack:
      security:
        authc:
          realms:
            pki:
              pki1:
                order: 1
                truststore:
                  path: "pki1_truststore.jks"

    Если хранилище доверенных сертификатов защищено паролем, пароль должен быть настроен, добавив соответствующую настройку secure_password в хранилище ключей Elasticsearch. Например, следующая команда добавляет пароль для примера сферы выше:

    bin/elasticsearch-keystore add \
    xpack.security.authc.realms.pki.pki1.truststore.secure_password

    Параметр certificate_authorities может использоваться как альтернатива настройке truststore.path, когда файлы сертификатов имеют формат PEM. Настройка принимает список. Два параметра взаимоисключают друг друга, они не могут использоваться одновременно.

  7. Настройка ролей для пользователей PKI.

    Вы настраиваете роли для пользователей PKI с помощью API сопоставлений ролей или с помощью файла, хранящегося на каждом узле. Обе конфигурации объединяются. Когда пользователь проходит аутентификацию в сфере PKI, привилегии для этого пользователя являются объединением всех привилегий, определенных ролями, которым сопоставлен пользователь.

    Пользователь идентифицируется по уникальному имени (DN) в его сертификате. Например, следующая конфигурация сопоставления назначает John Doe роль user с помощью API сопоставления ролей:

    resp = client.security.put_role_mapping(
        name="users",
        roles=[
            "user"
        ],
        rules={
            "field": {
                "dn": "cn=John Doe,ou=example,o=com"
            }
        },
        enabled=True,
    )
    print(resp)
    const response = await client.security.putRoleMapping({
      name: "users",
      roles: ["user"],
      rules: {
        field: {
          dn: "cn=John Doe,ou=example,o=com",
        },
      },
      enabled: true,
    });
    console.log(response);
    PUT /_security/role_mapping/users
    {
      "roles" : [ "user" ],
      "rules" : { "field" : {
        "dn" : "cn=John Doe,ou=example,o=com" 
      } },
      "enabled": true
    }

    Уникальное имя (DN) пользователя PKI.

    В качестве альтернативы используйте файл сопоставления ролей. Например:

    user: 
      - "cn=John Doe,ou=example,o=com" 

    Название роли.

    Уникальное имя (DN) пользователя PKI.

    Путь к файлу по умолчанию — ES_PATH_CONF/role_mapping.yml. Вы можете указать другой путь (который должен находиться в ES_PATH_CONF) с помощью настройки сферы files.role_mapping (например, xpack.security.authc.realms.pki.pki1.files.role_mapping).

    Уникальное имя (DN) пользователя PKI соответствует соглашениям X.500 об именовании, которые помещают наиболее специфические поля (например, cn или uid) в начале имени и наиболее общие поля (например, o или dc) — в конце. Некоторые инструменты, такие как openssl, могут выводить имя субъекта в другом формате.

    Один из способов определения правильного DN для сертификата — использование API authenticate API (использование соответствующего сертификата PKI в качестве средства аутентификации) и проверка поля metadata в результате. Уникальное имя пользователя будет добавлено под ключом pki_dn. Вы также можете использовать API аутентификации для проверки вашего сопоставления ролей.

    Дополнительную информацию можно найти в разделе Сопоставление пользователей и групп с ролями.

    Сфера PKI поддерживает сферы авторизации как альтернативу сопоставлению ролей.

Аутентификация PKI для клиентов, подключающихся к Kibana

По умолчанию, домен PKI полагается на сетевой интерфейс узла для выполнения рукопожатия SSL/TLS и извлечения сертификата клиента. Это поведение требует, чтобы клиенты подключались непосредственно к Elasticsearch, чтобы их SSL-соединение завершалось узлом Elasticsearch. Если аутентификация SSL/TLS должна выполняться Kibana, домен PKI должен быть настроен для разрешения делегирования.

В частности, когда клиенты, представляющие сертификаты X.509, подключаются к Kibana, Kibana выполняет аутентификацию SSL/TLS. Затем Kibana пересылает цепочку сертификатов клиента (вызывая API Elasticsearch) для дальнейшей проверки доменами PKI, которые были настроены для делегирования.

Для разрешения делегирования аутентификации для конкретного домена PKI Elasticsearch начните с настройки домена для обычного случая, как описано в разделе Аутентификация PKI для клиентов, подключающихся напрямую к Elasticsearch. В этом случае, когда вы включаете TLS, обязательно зашифровать HTTP-взаимодействия клиента.

Вы также должны явно настроить truststore (или, эквивалентно certificate_authorities), даже если это та же конфигурация доверия, которую вы настроили на сетевом уровне. Настройки xpack.security.authc.token.enabled и delegation.enabled также должны быть true. Например:

xpack:
  security:
    authc:
      token.enabled: true
      realms:
        pki:
          pki1:
            order: 1
            delegation.enabled: true
            truststore:
              path: "pki1_truststore.jks"

После перезапуска Elasticsearch этот домен сможет проверять делегированную аутентификацию PKI. Затем вы должны настроить Kibana для разрешения аутентификации по сертификату PKI.

Домен PKI с delegation.enabled по-прежнему работает без изменений для клиентов, подключающихся напрямую к Elasticsearch. Пользователи с прямой аутентификацией и пользователи, которые прошли аутентификацию PKI путем делегирования в Kibana, оба следуют тем же правилам сопоставления ролей или конфигурациям авторизационных доменов.

Однако, если вы используете API сопоставления ролей, вы можете различать пользователей, которые прошли аутентификацию путем делегирования, и пользователей, которые прошли аутентификацию напрямую. У первых есть дополнительные поля pki_delegated_by_user и pki_delegated_by_realm в метаданных пользователя. В стандартной настройке, где аутентификация делегирована Kibana, значения этих полей являются kibana и reserved соответственно. Например, следующая настройка правил сопоставления ролей назначает роль role_for_pki1_direct всем пользователям, которые прошли аутентификацию напрямую с помощью домена pki1, подключившись к Elasticsearch вместо подключения через Kibana:

resp = client.security.put_role_mapping(
    name="direct_pki_only",
    roles=[
        "role_for_pki1_direct"
    ],
    rules={
        "all": [
            {
                "field": {
                    "realm.name": "pki1"
                }
            },
            {
                "field": {
                    "metadata.pki_delegated_by_user": None
                }
            }
        ]
    },
    enabled=True,
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "direct_pki_only",
  roles: ["role_for_pki1_direct"],
  rules: {
    all: [
      {
        field: {
          "realm.name": "pki1",
        },
      },
      {
        field: {
          "metadata.pki_delegated_by_user": null,
        },
      },
    ],
  },
  enabled: true,
});
console.log(response);
PUT /_security/role_mapping/direct_pki_only
{
  "roles" : [ "role_for_pki1_direct" ],
  "rules" : {
    "all": [
      {
        "field": {"realm.name": "pki1"}
      },
      {
        "field": {
          "metadata.pki_delegated_by_user": null 
        }
      }
    ]
  },
  "enabled": true
}

Если это поле метаданных установлено (то есть, оно не null), пользователь прошел аутентификацию в сценарии делегирования.

© 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/pki-realm.html

Spec-Zone.ru

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