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

Настройка единого входа с помощью OpenID Connect в Elastic Stack

Elastic Stack поддерживает единый вход (SSO) с помощью OpenID Connect через Kibana с использованием Elasticsearch в качестве бэкэнд-службы, которая содержит большую часть функциональности. Kibana и Elasticsearch вместе представляют собой OpenID Connect Relying Party (RP), который поддерживает поток авторизации по коду и неявный поток, как определено в спецификации OpenID Connect.

Данное руководство предполагает, что у вас есть провайдер OpenID Connect, в котором будет зарегистрирована Elastic Stack Relying Party.

Поддержка OpenID Connect в Kibana разработана с учётом того, что это будет основной метод аутентификации пользователей для данного экземпляра Kibana. Раздел Настройка Kibana описывает, что это подразумевает и как можно настроить его для поддержки других областей, если необходимо.

Провайдер OpenID Connect

Провайдер OpenID Connect (OP) — это сущность в OpenID Connect, которая отвечает за аутентификацию пользователя и предоставление необходимых токенов с информацией об аутентификации и пользователе для использования Relying Parties.

Для того, чтобы Elastic Stack мог использовать ваш провайдер OpenID Connect для аутентификации, необходимо установить доверительные отношения между OP и RP. В провайдере OpenID Connect это означает регистрацию RP в качестве клиента. OpenID Connect определяет протокол динамической регистрации клиентов, но он обычно ориентирован на регистрацию клиентов в реальном времени, а не на процесс установления доверия для единого входа через разные домены безопасности. Все OP также позволят ручную регистрацию RP как клиента, через пользовательский интерфейс или (реже) через использование метаданных.

Процесс регистрации Elastic Stack RP будет отличаться от OP к OP, и целесообразно следовать соответствующей документации провайдера. Информация о RP, которую обычно нужно предоставить для регистрации, следующая:

  • Relying Party Name: Условный идентификатор для Relying Party. Ни спецификация, ни реализация Elastic Stack не накладывают никаких ограничений на это значение.
  • Redirect URI: Это URI, по которому OP перенаправит браузер пользователя после аутентификации. Соответствующее значение будет зависеть от вашей настройки и от того, находится ли Kibana за прокси-сервером или балансировщиком нагрузки. Обычно это ${kibana-url}/api/security/oidc/callback (для потока авторизации по коду) или ${kibana-url}/api/security/oidc/implicit (для неявного потока), где ${kibana-url} — базовый URL вашего экземпляра Kibana. Вы также можете встретить это как Callback URI.

По завершении процесса регистрации OP назначит идентификатор клиента и секрет клиента для RP (Elastic Stack) для использования. Обратите внимание на эти два значения, так как они будут использоваться в конфигурации Elasticsearch.

Настройка Elasticsearch для аутентификации OpenID Connect

Ниже приведён обзор шагов настройки для включения аутентификации OpenID Connect в Elasticsearch:

  1. Включить SSL/TLS для HTTP
  2. Включить службу токенов
  3. Создать одну или несколько областей OpenID Connect
  4. Настроить сопоставления ролей

Включить TLS для HTTP

Если ваш кластер Elasticsearch работает в режиме производства, необходимо настроить HTTP-интерфейс для использования SSL/TLS перед включением аутентификации OpenID Connect.

Дополнительную информацию см. в разделе Зашифровать HTTP-взаимодействие с Elasticsearch.

Включить службу токенов

Реализация OpenID Connect в Elasticsearch использует службу токенов Elasticsearch. Эта служба автоматически включается при настройке TLS на HTTP-интерфейсе и может быть явно настроена, включив следующее в ваш файл elasticsearch.yml:

xpack.security.authc.token.enabled: true

Создать область OpenID Connect

Аутентификация на основе OpenID Connect включена путём настройки соответствующей области в цепочке аутентификации для Elasticsearch.

Эта область имеет несколько обязательных настроек и ряд дополнительных. Доступные настройки подробно описаны в настройках области OpenID Connect. В этом руководстве будут рассмотрены наиболее распространённые настройки.

Создайте область OpenID Connect (тип области - oidc) в своём файле elasticsearch.yml, подобно тому, что показано ниже:

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

xpack.security.authc.realms.oidc.oidc1:
  order: 2
  rp.client_id: "the_client_id"
  rp.response_type: code
  rp.redirect_uri: "https://kibana.example.org:5601/api/security/oidc/callback"
  op.issuer: "https://op.example.org"
  op.authorization_endpoint: "https://op.example.org/oauth2/v1/authorize"
  op.token_endpoint: "https://op.example.org/oauth2/v1/token"
  op.jwkset_path: oidc/jwkset.json
  op.userinfo_endpoint: "https://op.example.org/oauth2/v1/userinfo"
  op.endsession_endpoint: "https://op.example.org/oauth2/v1/logout"
  rp.post_logout_redirect_uri: "https://kibana.example.org:5601/security/logged_out"
  claims.principal: sub
  claims.groups: "http://example.info/claims/groups"

Используемые в примере значения конфигурации:

xpack.security.authc.realms.oidc.oidc1
Это определяет новую oidc область аутентификации с именем "oidc1". См. Области для получения дополнительной информации об областях.
order
Вы должны определить уникальный порядок каждой области в вашей цепочке аутентификации. Рекомендуется разместить область OpenID Connect внизу вашей цепочки аутентификации (то есть, чтобы у неё был наибольший порядок).
rp.client_id
Эта, обычно неявная, произвольная строка — это идентификатор клиента, который был назначен Elastic Stack RP поставщиком услуг (OP) при регистрации.
rp.response_type

Это идентификатор, который контролирует, какой поток аутентификации OpenID Connect поддерживает этот RP, а также какой поток RP запрашивает OP. Доступные значения:

  • code, что означает, что RP хочет использовать поток Authorization Code. Если ваш OP поддерживает поток Authorization Code, вы должны выбрать его вместо Implicit Flow.
  • id_token token, что означает, что RP хочет использовать Implicit flow и также запросить у OP токен доступа oAuth2, который мы можем потенциально использовать для последующих запросов (UserInfo). Это следует выбрать, если OP предлагает в своей конфигурации конечную точку UserInfo или если вы знаете, что необходимые утверждения для сопоставления ролей недоступны в токенах ID.
  • id_token, что означает, что RP хочет использовать Implicit flow, но не заинтересован в получении токена oAuth2. Выберите это, если уверены, что все необходимые утверждения будут содержаться в токенах ID, или если OP не предоставляет конечную точку UserInfo.
rp.redirect_uri
URI перенаправления, куда OP перенаправит браузер после аутентификации. Он должен быть точно таким же, как тот, что настроен с OP при регистрации, и обычно будет ${kibana-url}/api/security/oidc/callback, где ${kibana-url} — базовый URL вашего экземпляра Kibana.
op.issuer
Верифицируемый идентификатор вашего поставщика OpenID Connect. Идентификатор издателя обычно представляет собой URL-адрес, чувствительный к регистру. Значение для этой настройки должно быть предоставлено вашим поставщиком OpenID Connect.
op.authorization_endpoint
URL-адрес конечной точки авторизации в OP. Здесь браузер пользователя будет перенаправлен для начала процесса аутентификации. Значение для этой настройки должно быть предоставлено вашим поставщиком OpenID Connect.
op.token_endpoint
URL-адрес конечной точки токена в поставщике OpenID Connect. Это конечная точка, куда Elasticsearch отправит запрос для обмена кодом на токен ID. Эта настройка необязательна при использовании потока implicit. Значение для этой настройки должно быть предоставлено вашим поставщиком OpenID Connect.
op.jwkset_path
Путь к файлу или URL, содержащему JSON Web Key Set с ключами, которые поставщик OpenID Connect использует для подписи токенов и ответов утверждений. Если задан путь, он разрешается относительно каталога конфигурации Elasticsearch. Elasticsearch автоматически отслеживает изменения в этом файле и перезагружает конфигурацию при его обновлении. Ваш поставщик OpenID Connect должен предоставить вам этот файл или URL, где он доступен.
op.userinfo_endpoint
(Необязательно) URL конечной точки UserInfo в поставщике OpenID Connect. Это конечная точка OP, которая может быть запрошена для получения дополнительной информации о пользователе, если это требуется. Значение для этой настройки должно быть предоставлено вашим поставщиком OpenID Connect.
op.endsession_endpoint
(Необязательно) URL-адрес конечной точки End Session в поставщике OpenID Connect. Это конечная точка, куда браузер пользователя будет перенаправлен после локального выхода, если область настроена для RP-инициативного Single Logout, и OP его поддерживает. Значение для этой настройки должно быть предоставлено вашим поставщиком OpenID Connect.
rp.post_logout_redirect_uri
(Необязательно) URI перенаправления, куда поставщик OpenID Connect должен перенаправить пользователя после успешного Single Logout (если op.endsession_endpoint выше также задан). Это должно быть установлено на значение, которое не вызовет новую аутентификацию OpenID Connect, например, ${kibana-url}/security/logged_out или ${kibana-url}/login?msg=LOGGED_OUT, где ${kibana-url} — базовый URL вашего экземпляра Kibana.
claims.principal
См. Сопоставление утверждений.
claims.groups
См. Сопоставление утверждений.

Последний фрагмент конфигурации области OpenID Connect заключается в установке Client Secret, который был назначен RP во время регистрации в OP. Эта настройка является защищённой и, следовательно, не определена в конфигурации области в elasticsearch.yml, а добавляется в хранилище ключей Elasticsearch. Например:

bin/elasticsearch-keystore add xpack.security.authc.realms.oidc.oidc1.rp.client_secret

Изменения в client_secret требуют перезапуска узлов Elasticsearch для применения изменений.

Согласно спецификации OpenID Connect, OP также должен сделать свою конфигурацию доступной по известному URL, который является конкатенацией их значения Issuer и строки .well-known/openid-configuration. Например: https://op.org.com/.well-known/openid-configuration. Этот документ должен содержать всю необходимую информацию для настройки области OpenID Connect в Elasticsearch.

Сопоставление утверждений

Утверждения и области

При аутентификации в Kibana с помощью OpenID Connect, OP предоставит информацию о пользователе в виде утверждений OpenID Connect, которые могут быть включены либо в токен идентификации, либо получены из конечной точки UserInfo OP. Утверждение определяется как фрагмент информации, утверждаемый OP для аутентифицированного пользователя. Проще говоря, утверждение — это пара «имя/значение», содержащая информацию о пользователе. В связи с утверждениями у нас также есть понятие областей OpenID Connect. Области — это идентификаторы, используемые для запроса доступа к определённым спискам утверждений. Стандарт определяет набор идентификаторов областей, которые можно запросить. Единственный обязательный — openid, а обычно используемые — profile и email. Область profile запрашивает доступ к утверждениям name,family_name,given_name,middle_name,nickname, preferred_username,profile,picture,website,gender,birthdate,zoneinfo,locale и updated_at. Область email запрашивает доступ к утверждениям email и email_verified. Процесс заключается в том, что RP запрашивает определённые области во время запроса аутентификации. Если политика конфиденциальности OP это допускает и аутентифицируемый пользователь согласен на это, соответствующие утверждения возвращаются RP (либо в токен идентификации, либо как ответ UserInfo).

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

Сопоставление утверждений с свойствами пользователя

Цель сопоставления утверждений — настроить Elasticsearch таким образом, чтобы можно было сопоставить значения указанных возвращённых утверждений с одним из поддерживаемых Elasticsearch свойств пользователя свойствами пользователя. Эти свойства пользователя используются для идентификации пользователя в пользовательском интерфейсе Kibana или в журналах аудита, а также могут использоваться для создания правил сопоставления ролей сопоставления ролей.

Рекомендуемые шаги по настройке сопоставления утверждений OpenID:

  1. Обратитесь к настройкам OP, чтобы узнать, какие утверждения он может поддерживать. Обратите внимание, что представленный в метаданных OP или на странице настроек OP список — это список потенциально поддерживаемых утверждений. Однако по соображениям конфиденциальности он может быть неполным, или не все поддерживаемые утверждения будут доступны для всех аутентифицированных пользователей.
  2. Просмотрите список поддерживаемых Elasticsearch свойств пользователя свойств пользователя и определите, какие из них вам полезны и могут быть предоставлены вашим OP в виде утверждений. Минимально требуется свойство пользователя principal.
  3. Настройте свой OP для «выпуска» этих утверждений в ваш Elastic Stack. Этот процесс сильно различается в зависимости от провайдера. Вы можете использовать статическую конфигурацию, в то время как другие будут поддерживать запрос RP областей, соответствующих утверждениям, для «выпуска» во время аутентификации. См. rp.requested_scopes для получения подробностей о настройке запроса областей. Для обеспечения межотраслевой совместимости и минимизации ошибок следует запрашивать только поддерживаемые OP области, которые вы намерены сопоставить со свойствами пользователей Elasticsearch.

    NOTE: You can only map claims with values that are strings, numbers, boolean values or an array
    of the aforementioned.
  4. Настройте область OpenID Connect в Elasticsearch для связывания свойств пользователей Elasticsearch (см. список ниже) с именем утверждений, которые выпустит ваш OP. В приведённом выше примере мы настраиваем свойства пользователя principal и groups следующим образом:

    1. claims.principal: sub : Это инструкция Elasticsearch искать утверждение OpenID Connect с именем sub в токене идентификации, выпущенном OP для пользователя (или в ответе UserInfo), и назначить значение этого утверждения свойству пользователя principal. sub — часто используемое утверждение для свойства principal, поскольку это идентификатор пользователя в OP, а также это обязательное утверждение токена идентификации, обеспечивающее гарантию его наличия. Однако здесь это только пример, OP может предоставить другое утверждение, которое лучше подходит для ваших потребностей.
    2. claims.groups: "http://example.info/claims/groups" : Аналогично, это инструкция Elasticsearch искать утверждение с именем http://example.info/claims/groups (обратите внимание, что это URI — идентификатор, рассматриваемый как строка, а не URL, указывающий на местоположение, которое будет получено) либо в токене идентификации, либо в ответе UserInfo и сопоставить его значение(я) со свойством пользователя groups в Elasticsearch. В спецификации нет стандартного утверждения, используемого для выражения ролей или членства в группах аутентифицированного пользователя в OP, поэтому имя утверждения, которое следует сопоставить здесь, сильно различается между провайдерами. Для получения дополнительной информации обратитесь к документации OP.
Свойства пользователей Elasticsearch

Область Elasticsearch OpenID Connect может быть настроена для сопоставления утверждений OpenID Connect со следующими свойствами аутентифицированного пользователя:

principal
(Обязательно) Это имя пользователя, которое будет применено к пользователю, аутентифицирующемуся в этой области. principal отображается в таких местах, как журналы аудита Elasticsearch.

Если свойство principal не удаётся сопоставить с утверждением, аутентификация завершается неудачно.

groups
(Рекомендуется) Если вы хотите использовать понятие групп или ролей вашего OP в качестве основы для привилегий пользователя в Elasticsearch, вы должны сопоставить их с этим свойством. groups передаются непосредственно в ваши правила сопоставления ролей правила сопоставления ролей.
name
(Необязательно) Полное имя пользователя.
mail
(Необязательно) Электронный адрес пользователя.
dn
(Необязательно) Имя пользователя X.500 Distinguished Name.
Извлечение частичных значений из утверждений OpenID Connect

Иногда значение утверждения может содержать больше информации, чем вам нужно использовать в Elasticsearch. Типичный пример — тот, где OP работает только с адресами электронной почты, но вы хотите, чтобы у пользователя principal использовалась часть local-name адреса электронной почты. Например, если их адрес электронной почты был james.wong@staff.example.com, то вы хотите, чтобы их principal был просто james.wong.

Этого можно достичь, используя настройку claim_patterns в области Elasticsearch, как показано в конфигурации области ниже:

xpack.security.authc.realms.oidc.oidc1:
  order: 2
  rp.client_id: "the_client_id"
  rp.response_type: code
  rp.redirect_uri: "https://kibana.example.org:5601/api/security/oidc/callback"
  op.authorization_endpoint: "https://op.example.org/oauth2/v1/authorize"
  op.token_endpoint: "https://op.example.org/oauth2/v1/token"
  op.userinfo_endpoint: "https://op.example.org/oauth2/v1/userinfo"
  op.endsession_endpoint: "https://op.example.org/oauth2/v1/logout"
  op.issuer: "https://op.example.org"
  op.jwkset_path: oidc/jwkset.json
  claims.principal: email_verified
  claim_patterns.principal: "^([^@]+)@staff\\.example\\.com$"

В этом случае principal пользователя сопоставляется с утверждением email_verified, но к значению применяется регулярное выражение, прежде чем оно будет назначено пользователю. Если регулярное выражение совпадает, то в качестве эффективного значения используется результат первой группы. Если регулярное выражение не совпадает, то сопоставление утверждений завершается неудачно.

В этом примере адрес электронной почты должен принадлежать домену staff.example.com, а затем используется локальная часть (всё до @) в качестве principal. Любые пользователи, которые пытаются войти в систему с другим доменом электронной почты, потерпят неудачу, так как регулярное выражение не будет совпадать с их адресом электронной почты, и поэтому свойство пользователя principal, которое является обязательным, не будет заполнено.

Небольшие ошибки в этих регулярных выражениях могут иметь серьёзные последствия для безопасности. Например, если мы случайно упустим завершающий $ из приведённого выше примера, то мы будем подбирать любой адрес электронной почты, где домен начинается с staff.example.com, и это примет адрес электронной почты, такой как admin@staff.example.com.attacker.net. Важно убедиться, что ваши регулярные выражения максимально точны, чтобы вы не открыли случайно путь для атак на подмену пользователей.

Вход с инициированием третьей стороной

Область Open ID Connect в Elasticsearch поддерживает вход с инициированием третьей стороной, как описано в соответствующей спецификации.

Это позволяет самому OP или другой третьей стороне, отличной от RP, инициировать процесс аутентификации, запрашивая использование OP для аутентификации. Обратите внимание, что RP Elastic Stack уже должен быть настроен для этого OP, чтобы этот процесс завершился успешно.

Выход по протоколу OpenID Connect

Область OpenID Connect в Elasticsearch поддерживает функциональность выхода, инициированного RP, как описано в соответствующей части спецификации.

В этом процессе RP OpenID Connect (в данном случае Elastic Stack) перенаправит браузер пользователя на предопределённый URL OP после успешного завершения локального выхода. OP может затем также выполнить выход пользователя, в зависимости от конфигурации, и, наконец, должен перенаправить пользователя обратно в RP. op.endsession_endpoint в конфигурации области определяет URL в OP, на который будет перенаправлен браузер. Настройка rp.post_logout_redirect_uri определяет URL для перенаправления пользователя обратно после выхода из OP.

При настройке rp.post_logout_redirect_uri следует позаботиться о том, чтобы этот URL не приводил к повторной аутентификации пользователя. Например, при использовании OpenID Connect для поддержки единого входа в Kibana, это можно установить либо на ${kibana-url}/security/logged_out, что отобразит пользователю удобное сообщение, либо на ${kibana-url}/login?msg=LOGGED_OUT, что перенаправит пользователя к выбору входа в Kibana.

Конфигурация SSL области OpenID Connect

OpenID Connect полагается на TLS для обеспечения таких свойств безопасности, как шифрование в процессе передачи и аутентификация конечных точек. RP необходима для установления двусторонней связи с OP для обмена кодом на токен идентификации во время процесса предоставления кода авторизации и для получения дополнительной информации о пользователе с помощью конечной точки UserInfo. Кроме того, если вы настроили op.jwks_path в качестве URL, Elasticsearch потребуется получить ключи подписи OP из файла, размещённого там. Поэтому важно, чтобы Elasticsearch мог валидировать и доверять сертификату сервера, который использует OP для TLS. Поскольку для контекста клиента исходящих HTTPS-соединений используется системный хранилище доверенных сертификатов, если ваш OP использует сертификат от доверенного удостоверяющего центра, дополнительная конфигурация не требуется.

Однако, если издатель сертификата вашего OP не доверяется JVM, на которой работает Elasticsearch (например, он использует корпоративный удостоверяющий центр), вам необходимо настроить Elasticsearch на доверие этому удостоверяющему центру. Предполагая, что у вас есть сертификат CA, который подписал сертификат, используемый OP для TLS, сохранённый в файле `/oidc/company-ca.pem` в каталоге конфигурации Elasticsearch, вам необходимо установить следующее свойство в конфигурации области:

xpack.security.authc.realms.oidc.oidc1:
  order: 1
  ...
  ssl.certificate_authorities: ["/oidc/company-ca.pem"]

Настройка сопоставления ролей

Когда пользователь проходит аутентификацию с помощью OpenID Connect, он идентифицируется Elastic Stack, но это не автоматически предоставляет ему доступ к выполнению каких-либо действий или к доступу к данным.

Ваши пользователи OpenID Connect не смогут ничего сделать, пока им не будут назначены роли. Это можно сделать с помощью API добавления сопоставления ролей или с помощью области авторизации.

Вы не можете использовать файлы сопоставления ролей для назначения ролей пользователям, проходящим аутентификацию через OpenID Connect.

Вот пример простого сопоставления ролей, которое назначает роль example_role любому пользователю, который проходит аутентификацию в области OpenID Connect oidc1:

resp = client.security.put_role_mapping(
    name="oidc-example",
    roles=[
        "example_role"
    ],
    enabled=True,
    rules={
        "field": {
            "realm.name": "oidc1"
        }
    },
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "oidc-example",
  roles: ["example_role"],
  enabled: true,
  rules: {
    field: {
      "realm.name": "oidc1",
    },
  },
});
console.log(response);
PUT /_security/role_mapping/oidc-example
{
  "roles": [ "example_role" ], 
  "enabled": true,
  "rules": {
    "field": { "realm.name": "oidc1" }
  }
}

Роль example_role не является встроенной ролью Elasticsearch. В этом примере предполагается, что вы создали собственную пользовательскую роль с соответствующим доступом к вашим потокам данных, индексам и функциям Kibana.

Свойства пользователя, сопоставленные с помощью конфигурации области, используются для обработки правил сопоставления ролей, и эти правила определяют, какие роли получает пользователь.

Поля пользователя, предоставленные для сопоставления ролей, выводятся из утверждений OpenID Connect следующим образом:

  • username: Свойство пользователя principal
  • dn: Свойство пользователя dn
  • groups: Свойство пользователя groups
  • metadata: См. Метаданные пользователя

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

Если ваш OP имеет возможность предоставлять группы или роли RP с помощью утверждения OpenID, то вы должны сопоставить это утверждение с параметром claims.groups в области Elasticsearch (см. Сопоставление утверждений с свойствами пользователя), а затем использовать его в сопоставлении ролей в соответствии с примером ниже.

Это сопоставление назначает роль Elasticsearch finance_data всем пользователям, которые проходят аутентификацию через область oidc1 с членством в группе finance-team.

resp = client.security.put_role_mapping(
    name="oidc-finance",
    roles=[
        "finance_data"
    ],
    enabled=True,
    rules={
        "all": [
            {
                "field": {
                    "realm.name": "oidc1"
                }
            },
            {
                "field": {
                    "groups": "finance-team"
                }
            }
        ]
    },
)
print(resp)
const response = await client.security.putRoleMapping({
  name: "oidc-finance",
  roles: ["finance_data"],
  enabled: true,
  rules: {
    all: [
      {
        field: {
          "realm.name": "oidc1",
        },
      },
      {
        field: {
          groups: "finance-team",
        },
      },
    ],
  },
});
console.log(response);
PUT /_security/role_mapping/oidc-finance
{
  "roles": [ "finance_data" ],
  "enabled": true,
  "rules": { "all": [
        { "field": { "realm.name": "oidc1" } },
        { "field": { "groups": "finance-team" } }
  ] }
}

Если ваши пользователи также существуют в репозитории, к которому Elasticsearch может получить прямой доступ (например, в каталоге LDAP), вы можете использовать области авторизации вместо сопоставлений ролей.

В этом случае выполните следующие шаги:

  1. В вашей области OpenID Connect назначьте утверждение для использования в качестве идентификатора пользователя, настроив параметр claims.principal.
  2. Создайте новую область, которая может искать пользователей в вашем локальном репозитории (например, ldap область).
  3. В вашей области OpenID Connect установите authorization_realms на имя области, созданной на шаге 2.

Метаданные пользователя

По умолчанию у пользователей, проходящих аутентификацию через OpenID Connect, будут некоторые дополнительные поля метаданных. Эти поля будут включать все утверждения OpenID, предоставленные в ответе об аутентификации (независимо от того, сопоставлены ли они со свойством пользователя Elasticsearch). Например, в поле метаданных oidc(claim_name), «claim_name» — это имя утверждения, как оно содержалось в токене идентификации или в ответе User Info. Обратите внимание, что сюда будут включены все утверждения токена идентификации, относящиеся к событию аутентификации, а не к самому пользователю.

Это поведение можно отключить, добавив populate_user_metadata: false как настройку в области oidc.

Настройка Kibana

Для аутентификации OpenID Connect в Kibana требуется небольшое количество дополнительных настроек помимо стандартной конфигурации безопасности Kibana. Документация по безопасности Kibana содержит подробную информацию о доступных вариантах конфигурации, которые вы можете применить.

В частности, поскольку ваши узлы Elasticsearch настроены на использование TLS на HTTP-интерфейсе, вам необходимо настроить Kibana на использование https URL для подключения к Elasticsearch, и вам может потребоваться настроить elasticsearch.ssl.certificateAuthorities на доверие сертификатам, которые были настроены для использования Elasticsearch.

Аутентификация OpenID Connect в Kibana подчиняется следующим настройкам таймаутов в kibana.yml:

  • xpack.security.session.idleTimeout
  • xpack.security.session.lifespan

Вы можете настроить эти таймауты в соответствии с вашими требованиями безопасности.

Три дополнительных параметра, необходимые для поддержки OpenID Connect, показаны ниже:

xpack.security.authc.providers:
  oidc.oidc1:
    order: 0
    realm: "oidc1"

Значения конфигурации, используемые в примере выше:

xpack.security.authc.providers
Добавление oidc поставщика для указания Kibana на использование единого входа OpenID Connect в качестве метода аутентификации. Это указывает Kibana на попытку запуска процесса SSO каждый раз, когда пользователь пытается получить доступ к URL в Kibana, если пользователь еще не авторизован. Если вы также хотите разрешить пользователям вход с именем пользователя и паролем, вам также необходимо включить basic поставщика аутентификации. Например:
xpack.security.authc.providers:
  oidc.oidc1:
    order: 0
    realm: "oidc1"
  basic.basic1:
    order: 1

Это позволит пользователям, которые еще не авторизовались с помощью OpenID Connect, войти с помощью формы входа в Kibana.

xpack.security.authc.providers.oidc.<provider-name>.realm
Имя области OpenID Connect в Elasticsearch, которая должна обрабатывать аутентификацию для этого экземпляра Kibana.

Подключение OpenID Connect без Kibana

Сфера OpenID Connect предназначена для аутентификации пользователей в Kibana, поэтому большинство разделов руководства предполагают использование Kibana. Этот раздел описывает, как пользовательское веб-приложение может использовать соответствующие REST API OpenID Connect для аутентификации пользователей в Elasticsearch с помощью OpenID Connect.

Сферы единого входа, такие как OpenID Connect и SAML, используют службу токенов в Elasticsearch и, по сути, обменивают ответ SAML или OpenID Connect об аутентификации на токен доступа Elasticsearch и токен обновления. Токен доступа используется в качестве учетных данных для последующих запросов к Elasticsearch. Токен обновления позволяет пользователю получать новые токены доступа Elasticsearch после истечения срока действия текущего.

Служба токенов Elasticsearch можно рассматривать как минимальный сервер авторизации oAuth2, а токены доступа и обновления, упомянутые выше, — это токены, относящиеся только к этому серверу авторизации. Они генерируются и используются только Elasticsearch и никак не связаны с токенами (токен доступа и токен идентификации), которые выдает поставщик OpenID Connect.

Регистрация RP у поставщика OpenID Connect

Сторона, полагающаяся на систему (Elasticsearch и пользовательское веб-приложение), должна быть зарегистрирована в качестве клиента у поставщика OpenID Connect. Обратите внимание, что при регистрации Redirect URI, это должна быть URL-адрес в пользовательском веб-приложении.

Сфера OpenID Connect

В Elasticsearch необходимо создать и настроить сферу OpenID Connect. См. Настройка Elasticsearch для аутентификации OpenID Connect.

Пользователь службы для доступа к API

Сфера разработана с предположением, что должна быть привилегированная сущность, действующая как прокси-сервер аутентификации. В этом случае пользовательское веб-приложение является прокси-сервером аутентификации, обрабатывающим аутентификацию конечных пользователей (точнее, «делегирует» аутентификацию поставщику OpenID Connect). API OpenID Connect требуют аутентификации и необходимого уровня авторизации для аутентифицированного пользователя. По этой причине необходимо создать пользователя службы и назначить ему роль, которая предоставляет ему право manage_oidc кластера. Использование права manage_token кластера потребуется после аутентификации, чтобы пользователь мог сохранить доступ или быть позже выведен из системы.

resp = client.security.put_role(
    name="facilitator-role",
    cluster=[
        "manage_oidc",
        "manage_token"
    ],
)
print(resp)
const response = await client.security.putRole({
  name: "facilitator-role",
  cluster: ["manage_oidc", "manage_token"],
});
console.log(response);
POST /_security/role/facilitator-role
{
  "cluster" : ["manage_oidc", "manage_token"]
}
resp = client.security.put_user(
    username="facilitator",
    password="<somePasswordHere>",
    roles=[
        "facilitator-role"
    ],
)
print(resp)
const response = await client.security.putUser({
  username: "facilitator",
  password: "<somePasswordHere>",
  roles: ["facilitator-role"],
});
console.log(response);
POST /_security/user/facilitator
{
  "password" : "<somePasswordHere>",
  "roles"    : [ "facilitator-role"]
}

Обработка процесса аутентификации

В общих чертах, пользовательское веб-приложение должно выполнить следующие шаги для аутентификации пользователя с помощью OpenID Connect:

  1. Отправить HTTP-запрос POST на _security/oidc/prepare, аутентифицировавшись как пользователь facilitator, используя имя области OpenID Connect в конфигурации Elasticsearch в теле запроса. Более подробную информацию см. в подготовке аутентификации OpenID Connect.

    resp = client.security.oidc_prepare_authentication(
        realm="oidc1",
    )
    print(resp)
    const response = await client.transport.request({
      method: "POST",
      path: "/_security/oidc/prepare",
      body: {
        realm: "oidc1",
      },
    });
    console.log(response);
    POST /_security/oidc/prepare
    {
      "realm" : "oidc1"
    }
  2. Обработать ответ на /_security/oidc/prepare. Ответ Elasticsearch будет содержать 3 параметра: redirect, state, nonce. Пользовательское веб-приложение должно сохранить значения для state и nonce в сессии пользователя (на стороне клиента в cookie или на стороне сервера, если информация о сессии сохраняется таким образом) и перенаправить браузер пользователя на URL-адрес, который будет содержаться в значении redirect.
  3. Обработать последующий ответ от OP. После успешной аутентификации пользователя с помощью поставщика OpenID Connect, он будет перенаправлен обратно в URI обратного вызова/перенаправления. Получив этот HTTP-запрос GET, пользовательское веб-приложение должно отправить HTTP-запрос POST на _security/oidc/authenticate, снова — аутентифицируясь как пользователь facilitator — передавая URL, на который был перенаправлен браузер пользователя, в качестве параметра вместе со значениями для nonce и state, которые оно сохранило в сессии пользователя ранее. Если настроено более одной области OpenID Connect, пользовательское веб-приложение может указать имя области, которая должна использоваться для обработки этого, но этот параметр необязателен. Более подробную информацию см. в API аутентификации OpenID Connect.

    resp = client.security.oidc_authenticate(
        redirect_uri="https://oidc-kibana.elastic.co:5603/api/security/oidc/callback?code=jtI3Ntt8v3_XvcLzCFGq&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
        state="4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
        nonce="WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM",
        realm="oidc1",
    )
    print(resp)
    const response = await client.transport.request({
      method: "POST",
      path: "/_security/oidc/authenticate",
      body: {
        redirect_uri:
          "https://oidc-kibana.elastic.co:5603/api/security/oidc/callback?code=jtI3Ntt8v3_XvcLzCFGq&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
        state: "4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
        nonce: "WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM",
        realm: "oidc1",
      },
    });
    console.log(response);
    POST /_security/oidc/authenticate
    {
      "redirect_uri" : "https://oidc-kibana.elastic.co:5603/api/security/oidc/callback?code=jtI3Ntt8v3_XvcLzCFGq&state=4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
      "state" : "4dbrihtIAt3wBTwo6DxK-vdk-sSyDBV8Yf0AjdkdT5I",
      "nonce" : "WaBPH0KqPVdG5HHdSxPRjfoZbXMCicm5v1OiAj0DUFM",
      "realm" : "oidc1"
    }

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

  4. В какой-то момент, если необходимо, пользовательское веб-приложение может вывести пользователя из системы, используя API выхода из системы OpenID Connect, передавая токен доступа и токен обновления в качестве параметров. Например:

    resp = client.security.oidc_logout(
        token="dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
        refresh_token="vLBPvmAB6KvwvJZr27cS",
    )
    print(resp)
    const response = await client.transport.request({
      method: "POST",
      path: "/_security/oidc/logout",
      body: {
        token:
          "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
        refresh_token: "vLBPvmAB6KvwvJZr27cS",
      },
    });
    console.log(response);
    POST /_security/oidc/logout
    {
      "token" : "dGhpcyBpcyBub3QgYSByZWFsIHRva2VuIGJ1dCBpdCBpcyBvbmx5IHRlc3QgZGF0YS4gZG8gbm90IHRyeSB0byByZWFkIHRva2VuIQ==",
      "refresh_token": "vLBPvmAB6KvwvJZr27cS"
    }

    Если область настроена соответствующим образом, это может привести к ответу с параметром redirect, указывающим, куда необходимо перенаправить пользователя в OP для завершения процесса выхода из системы.

© 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/oidc-guide.html

Spec-Zone.ru

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