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

Настройка единого входа SAML в Elastic Stack

Elastic Stack поддерживает единый вход SAML (SSO) в Kibana, используя Elasticsearch в качестве бэкенд-сервиса. В терминах SAML Elastic Stack выступает в роли провайдера сервиса.

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

Если вы хотите настроить единый вход в Kibana, вам необходимо предоставить Elasticsearch информацию о вашем провайдере идентификации и зарегистрировать Elastic Stack как известного провайдера сервиса в этом провайдере. Также потребуется внести некоторые конфигурационные изменения в Kibana для активации провайдера аутентификации SAML.

Поддержка SAML в Kibana разработана с учетом того, что это будет основной (или единственный) метод аутентификации пользователей этого экземпляра Kibana. После включения аутентификации SAML в Kibana это повлияет на всех пользователей, пытающихся войти. В разделе Настройка Kibana подробно описано, как это работает.

Провайдер идентификации

Elastic Stack поддерживает профили SAML 2.0 Web Browser SSO и SAML 2.0 Single Logout и может интегрироваться с любым провайдером идентификации (IdP), поддерживающим как минимум профиль SAML 2.0 Web Browser SSO. Он протестирован с рядом популярных реализаций IdP, таких как Microsoft Active Directory Federation Services (ADFS), Azure Active Directory (AAD) и Okta.

В этом руководстве предполагается, что у вас уже есть IdP и вы хотите добавить Kibana как провайдера сервиса.

Elastic Stack использует стандартный документ метаданных SAML в формате XML, который определяет возможности и функции вашего IdP. Вы должны иметь возможность загрузить или сгенерировать такой документ в интерфейсе администрирования вашего IdP.

Загрузите документ метаданных IdP и сохраните его в каталоге config на каждом узле Elasticsearch. Для целей данного руководства мы будем считать, что вы сохраняете его как config/saml/idp-metadata.xml.

IdP будет назначен идентификатор (EntityID в терминологии SAML), который чаще всего выражается в форме Uniform Resource Identifier (URI). Интерфейс администрирования может сообщить вам об этом, или вам может потребоваться прочитать документ метаданных, чтобы найти его — найдите атрибут entityID в элементе EntityDescriptor.

Большинство IdP предоставят соответствующий файл метаданных со всеми функциями, необходимыми Elastic Stack, и потребуют только шагов по конфигурации, описанных ниже. Для полноты картины, минимальные требования Elastic Stack к метаданным IdP:

  • <EntityDescriptor> с entityID, соответствующим конфигурации Elasticsearch настройки
  • <IDPSSODescriptor>, поддерживающий протокол SAML 2.0 (urn:oasis:names:tc:SAML:2.0:protocol).
  • По крайней мере, один <KeyDescriptor>, настроенный для подписи (то есть, он имеет use="signing" или оставляет use не определенным).
  • <SingleSignOnService> с привязкой HTTP-Redirect (urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect)
  • Если вы хотите поддерживать единый выход, <SingleLogoutService> с привязкой HTTP-Redirect (urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect)

Elastic Stack требует, чтобы все сообщения от IdP были подписаны. Для аутентификации <Response> сообщений подпись может быть применена либо к самому ответу, либо к отдельным утверждениям. Для <LogoutRequest> сообщений само сообщение должно быть подписано, а подпись должна быть предоставлена в качестве параметра URL, как требуется привязкой HTTP-Redirect.

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

Для включения аутентификации SAML в Elasticsearch необходимо выполнить пять шагов:

  1. Включить SSL/TLS для HTTP
  2. Включить службу токенов
  3. Создать один или несколько доменов SAML
  4. Настроить сопоставление ролей
  5. Сгенерировать файл метаданных SAML для использования Вашим поставщиком идентификации (необязательно)

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

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

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

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

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

xpack.security.authc.token.enabled: true

Создать домен SAML

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

Этот домен имеет несколько обязательных настроек и ряд дополнительных. Доступные настройки подробно описаны в Настройках безопасности. Например, настройки домена SAML, настройки подписи домена SAML, настройки шифрования домена SAML, настройки SSL домена SAML. Это руководство покажет вам наиболее распространенные настройки.

Создайте домен, добавив следующее в ваш файл конфигурации elasticsearch.yml. Каждое значение конфигурации объяснено ниже.

xpack.security.authc.realms.saml.saml1:
  order: 2
  idp.metadata.path: saml/idp-metadata.xml
  idp.entity_id: "https://sso.example.com/"
  sp.entity_id:  "https://kibana.example.com/"
  sp.acs: "https://kibana.example.com/api/security/saml/callback"
  sp.logout: "https://kibana.example.com/logout"
  attributes.principal: "urn:oid:0.9.2342.19200300.100.1.1"
  attributes.groups: "urn:oid:1.3.6.1.4.1.5923.1.5.1."

SAML используется при аутентификации через Kibana, но не является эффективным способом прямой аутентификации в REST API Elasticsearch. По этой причине мы рекомендуем включить по крайней мере один дополнительный домен, такой как родной домен, в цепочку аутентификации для использования клиентами API.

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

xpack.security.authc.realms.saml.saml1
Это определяет новый домен аутентификации SAML под названием "saml1". См. Домены для получения более подробной информации о доменах.
order
Порядок домена в цепочке доменов. Домены с меньшим порядком имеют более высокий приоритет и проверяются в первую очередь. Мы рекомендуем присваивать парольным доменам, таким как file, native, LDAP и Active Directory, наименьший порядок (наивысший приоритет), за которым следуют SSO-домены, такие как SAML и OpenID Connect. Если у вас есть несколько доменов одного типа, присвойте наиболее часто используемому домену наименьший порядок, чтобы он проверялся в первую очередь.
idp.metadata.path
Это путь к файлу метаданных, который вы сохранили для своего поставщика идентификации. Указанный здесь путь является относительным по отношению к вашему каталогу config/. Elasticsearch автоматически отслеживает изменения в этом файле и перезагружает конфигурацию при каждом обновлении.
idp.entity_id
Это идентификатор (SAML EntityID), используемый Вашим поставщиком идентификации. Он должен совпадать с атрибутом entityID в файле метаданных.
sp.entity_id
Это уникальный идентификатор вашего экземпляра Kibana, выраженный как URI. Вы будете использовать это значение при добавлении Kibana в качестве поставщика услуг в своем IdP. Мы рекомендуем использовать базовый URL вашего экземпляра Kibana в качестве идентификатора.
sp.acs
Конечная точка Assertion Consumer Service (ACS) — это URL в Kibana, который принимает сообщения об аутентификации от IdP. Эта конечная точка ACS поддерживает только SAML HTTP-POST связывание. Это должен быть URL, доступный из веб-браузера пользователя, пытающегося войти в Kibana; он не должен быть непосредственно доступен Elasticsearch или IdP. Правильное значение может изменяться в зависимости от того, как вы установили Kibana и есть ли какие-либо прокси-серверы, но обычно это будет ${kibana-url}/api/security/saml/callback, где ${kibana-url} — это базовый URL вашего экземпляра Kibana.
sp.logout
Это URL в Kibana, который принимает сообщения о выходе из системы от IdP. Как и URL sp.acs, он должен быть доступен из веб-браузера, но не должен быть непосредственно доступен Elasticsearch или IdP. Правильное значение может изменяться в зависимости от того, как вы установили Kibana и есть ли какие-либо прокси-серверы, но обычно это будет ${kibana-url}/logout, где ${kibana-url} — это базовый URL вашего экземпляра Kibana.
attributes.principal
См. Сопоставление атрибутов.
attributes.groups
См. Сопоставление атрибутов.

Сопоставление атрибутов

При подключении пользователя к Kibana через ваш поставщик удостоверений, поставщик удостоверений предоставит утверждение SAML об этом пользователе. Утверждение будет содержать заявление об аутентификации, указывающее, что пользователь успешно прошёл аутентификацию в IdP, и одно или несколько заявлений об атрибутах, которые будут включать атрибуты пользователя.

Эти атрибуты могут включать такие вещи, как:

  • имя пользователя;
  • адрес электронной почты пользователя;
  • группы или роли пользователя.

Атрибуты в SAML называются с использованием URI, таких как urn:oid:0.9.2342.19200300.100.1.1 или http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn, и имеют один или несколько значений, связанных с ними.

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

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

Для того, чтобы эти атрибуты были полезны, Elasticsearch и IdP должны иметь общее значение для имён атрибутов. Это делается вручную, настроив IdP и область SAML на использование одного и того же имени URI для каждого логического атрибута пользователя.

Рекомендуемые шаги для настройки этих атрибутов SAML следующие:

  1. Обратитесь к вашему IdP, чтобы узнать, какие атрибуты пользователей он может предоставить. Это сильно варьируется в зависимости от поставщика, но вы должны иметь возможность получить список из документации или от местного администратора.
  2. Прочитайте список свойств пользователей, которые поддерживает Elasticsearch, и определите, какие из них вам полезны и могут быть предоставлены вашим IdP. Как минимум, требуется атрибут principal.
  3. Настройте ваш IdP на "выпуск" этих атрибутов в ваш поставщик услуг SAML Kibana. Этот процесс варьируется в зависимости от поставщика — некоторые предоставят пользовательский интерфейс для этого, в то время как другие могут потребовать изменения конфигурационных файлов. Обычно IdP (или ваш местный администратор) даст вам рекомендации о том, какой URI следует использовать для каждого атрибута. Вы можете просто принять эти рекомендации, так как служба Elasticsearch полностью настраивается и не требует использования каких-либо конкретных URI.
  4. Настройте область SAML в Elasticsearch, чтобы связать свойства пользователя Elasticsearch (см. список ниже) с URI, которые вы настроили в вашем IdP. В примере выше мы настроили атрибуты principal и groups.
Специальные имена атрибутов

В общем случае Elasticsearch ожидает, что настроенное значение для атрибута будет URI, например urn:oid:0.9.2342.19200300.100.1.1, однако существуют некоторые дополнительные имена, которые можно использовать:

nameid
Вместо атрибута SAML используется значение SAML NameID (все ведущие и хвостовые пробелы удалены). Элементы SAML NameID являются необязательным, но часто предоставляемым полем в утверждении SAML, которое IdP может использовать для идентификации субъекта этого утверждения. В некоторых случаях NameID будет относиться к идентификатору входа пользователя (имя пользователя) в IdP, но во многих случаях это будут внутренние идентификаторы, не имеющие очевидного значения за пределами IdP.
nameid:persistent
Это использует значение SAML NameID (все ведущие и хвостовые пробелы удалены), но только если формат NameID является urn:oasis:names:tc:SAML:2.0:nameid-format:persistent. Элемент SAML NameID имеет необязательный атрибут Format, который указывает на семантику предоставленного имени. Для IdP обычно настраиваются временные NameID, которые представляют новый идентификатор для каждой сессии. Поскольку редко бывает полезно использовать временный NameID в качестве части сопоставления атрибутов, имя атрибута "nameid:persistent" может использоваться как механизм безопасности, который вызовет ошибку, если вы попытаетесь сопоставить значение от NameID, не имеющее постоянного значения.
friendlyName
Атрибут SAML может иметь friendlyName помимо его имени на основе URI. Например, атрибут с именем urn:oid:0.9.2342.19200300.100.1.1 может также иметь friendlyName uid. Вы можете использовать эти friendlyNames в сопоставлении атрибутов, но рекомендуется использовать имена на основе URI, так как friendlyNames не стандартизированы и не обязательны.

В примере ниже настраивается область для использования постоянного имени nameid для принципала и атрибута с friendlyName "roles" для групп пользователя.

xpack.security.authc.realms.saml.saml1:
  order: 2
  idp.metadata.path: saml/idp-metadata.xml
  idp.entity_id: "https://sso.example.com/"
  sp.entity_id:  "https://kibana.example.com/"
  sp.acs: "https://kibana.example.com/api/security/saml/callback"
  attributes.principal: "nameid:persistent"
  attributes.groups: "roles"
Свойства пользователей Elasticsearch

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

principal
(Обязательно) Это имя пользователя, которое будет применено к пользователю, который аутентифицируется в этой области. principal отображается в таких местах, как журналы аудита Elasticsearch.
groups
(Рекомендуется) Если вы хотите использовать концепцию групп или ролей вашего IdP в качестве основы для полномочий пользователя в Elasticsearch, вы должны сопоставить их с этим атрибутом. groups передаются непосредственно в ваши правила сопоставления ролей сопоставления ролей.
name
(Необязательно) Полное имя пользователя.
mail
(Необязательно) Адрес электронной почты пользователя.
dn
(Необязательно) X.500 отличительное имя пользователя.
Извлечение частичных значений из атрибутов SAML

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

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

xpack.security.authc.realms.saml.saml1:
  order: 2
  idp.metadata.path: saml/idp-metadata.xml
  idp.entity_id: "https://sso.example.com/"
  sp.entity_id:  "https://kibana.example.com/"
  sp.acs: "https://kibana.example.com/api/security/saml/callback"
  attributes.principal: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress"
  attribute_patterns.principal: "^([^@]+)@staff\\.example\\.com$"

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

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

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

Запрос определённых методов аутентификации

Иногда поставщику SAML SP необходимо иметь возможность вводить определённые ограничения относительно аутентификации, которая будет происходить в IdP, чтобы оценить уровень доверия, который он может поместить в соответствующий ответ об аутентификации. Ограничения могут касаться метода аутентификации (пароль, сертификаты клиентов и т.д.), метода идентификации пользователя во время регистрации и других деталей. Elasticsearch реализует SAML 2.0 Authentication Context, который может быть использован для этой цели, как определено в спецификации SAML 2.0 Core.

Короче говоря, поставщик SAML SP определяет набор значений Authentication Context Class Reference, которые описывают ограничения, которые должны быть наложены на IdP, и отправляет их в запросе об аутентификации. IdP пытается предоставить эти ограничения. Если он не может предоставить их, попытка аутентификации завершается неудачей. Если пользователь успешно аутентифицирован, заявление об аутентификации в ответе SAML содержит указание на ограничения, которые были выполнены.

Вы можете определить значения Authentication Context Class Reference, используя опцию req_authn_context_class_ref в конфигурации области SAML. См. настройки области SAML.

Elasticsearch поддерживает только метод сравнения exact для Authentication Context. Когда он получает ответ об аутентификации от IdP, Elasticsearch проверяет значение Authentication Context Class Reference, которое является частью заявления об аутентификации утверждения SAML. Если оно соответствует одному из запрошенных значений, аутентификация считается успешной. В противном случае попытка аутентификации завершается неудачей.

Выход SAML

Протокол SAML поддерживает концепцию единого выхода (SLO). Уровень поддержки SLO варьируется между поставщиками удостоверений. Вы должны обратиться к документации вашего IdP, чтобы определить, какие сервисы выхода он предоставляет.

По умолчанию Elastic Stack будет поддерживать SAML SLO, если выполняются следующие условия:

  • Метаданные вашего IdP указывают, что IdP предоставляет службу SLO
  • Ваш IdP выпускает NameID в субъекте утверждения SAML, которое он выдает для ваших пользователей
  • Вы настраиваете sp.logout
  • Настройка idp.use_single_logout не является false
Служба SLO IdP

Одно из значений, которые Elasticsearch считывает из метаданных SAML IdP, — это <SingleLogoutService>. Для работы единого выхода с Elastic Stack Elasticsearch требует, чтобы это значение существовало и поддерживало привязку urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect.

Elastic Stack будет отправлять как <LogoutRequest>, так и <LogoutResponse> сообщения в этот сервис по мере необходимости.

Настройка sp.logout

Настройка сферы Elasticsearch sp.logout задает URL в Kibana, на который IdP может отправлять как <LogoutRequest>, так и <LogoutResponse> сообщения. Этот сервис использует привязку SAML HTTP-Redirect.

Elasticsearch обработает <LogoutRequest> сообщения и выполнит глобальный выход, аннулируя любые существующие токены безопасности Elasticsearch, связанные с предоставленной сессией SAML.

Если вы не настроите значение для sp.logout, Elasticsearch отклонит все <LogoutRequest> сообщения.

Для IdP характерно требование, чтобы сообщения LogoutRequest были подписаны, поэтому вам может потребоваться настроить кредиты для подписи.

Настройка idp.use_single_logout

Если ваш IdP предоставляет <SingleLogoutService>, но вы не хотите его использовать, вы можете настроить idp.use_single_logout: false в вашей области SAML, и Elasticsearch проигнорирует службу SLO, предоставленную вашим IdP. В этом случае, когда пользователь выходит из Kibana, он аннулирует свою сессию Elasticsearch (токен безопасности), но не выполняет выход из IdP.

Использование Kibana без единого выхода

Если ваш IdP не поддерживает единый выход, или вы решили не использовать его, тогда Kibana выполнит только «локальный выход».

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

Возможные решения этой проблемы:

  • Обратитесь к администратору IdP или поставщику для предоставления службы единого выхода
  • Если ваш IdP предоставляет службу единого выхода, убедитесь, что она включена в файл метаданных IdP, и не устанавливайте idp.use_single_logout в false.
  • Посоветуйте пользователям закрывать браузер после выхода из Kibana
  • Включите настройку force_authn в своей области SAML. Эта настройка заставляет Elastic Stack запрашивать свежую авторизацию у IdP каждый раз, когда пользователь пытается войти в Kibana. Эта настройка по умолчанию false, так как это может быть более обременительным для пользователя, но это также может быть эффективной защитой от пользователей, использующих существующие сессии IdP.

Шифрование и подпись

Elastic Stack поддерживает генерацию подписанных сообщений SAML (для аутентификации и/или выхода), проверку подписанных сообщений SAML от IdP (для аутентификации и выхода) и может обрабатывать зашифрованное содержимое.

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

Elastic Stack использует сертификаты X.509 с закрытыми ключами RSA для криптографии SAML. Эти ключи можно сгенерировать с помощью любого стандартного инструмента SSL, включая инструмент elasticsearch-certutil.

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

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

Генерация сертификатов и ключей

Elasticsearch поддерживает сертификаты и ключи в форматах PEM, PKCS#12 или JKS. Некоторые поставщики удостоверений (IdP) более ограничены в поддерживаемых форматах и потребуют предоставить сертификаты в виде файла в определенном формате. Вы должны обратиться к документации своего IdP, чтобы определить поддерживаемые форматы. Поскольку формат PEM наиболее часто поддерживается, примеры ниже будут генерировать сертификаты в этом формате.

Используя инструмент elasticsearch-certutil, вы можете сгенерировать сертификат подписи с помощью следующей команды:

bin/elasticsearch-certutil cert --self-signed --pem --days 1100 --name saml-sign --out saml-sign.zip

Это:

  • сгенерирует пару сертификата и ключа (подкоманда cert)
  • создаст файлы в формате PEM (опция -pem)
  • сгенерирует сертификат, действительный в течение 3 лет (-days 1100)
  • назовёт сертификат saml-sign (опция -name)
  • сохранит сертификат и ключ в файле saml-sign.zip (опция -out)

Сгенерированный архив zip будет содержать 3 файла:

  • saml-sign.crt, открытый сертификат, используемый для подписи
  • saml-sign.key, закрытый ключ для сертификата
  • ca.crt, сертификат CA, который не нужен и может быть проигнорирован.

Сертификаты шифрования можно сгенерировать с помощью той же процедуры.

Настройка Elasticsearch для подписи

По умолчанию Elasticsearch будет подписывать все исходящие сообщения SAML, если настроен ключ подписи.

Если вы хотите использовать ключи и сертификаты в формате PEM для подписи, то вы должны настроить следующие параметры в домене SAML:

signing.certificate
Путь к файлу сертификата в формате PEM. Пример: saml/saml-sign.crt
signing.key
Путь к файлу ключа в формате PEM. Пример: saml/saml-sign.key
signing.secure_key_passphrase
Пароль к ключу, если файл зашифрован. Это защищённый параметр, который необходимо установить с помощью инструмента elasticsearch-keystore.

Если вы хотите использовать файлы в формате PKCS#12 или хранилище ключей Java для подписи, то вы должны настроить следующие параметры в домене SAML:

signing.keystore.path
Путь к хранилищу ключей PKCS#12 или JKS. Пример: saml/saml-sign.p12
signing.keystore.alias
Имя ключа в хранилище. Пример: signing-key
signing.keystore.secure_password
Пароль к хранилищу ключей, если файл зашифрован. Это защищённый параметр, который необходимо установить с помощью инструмента elasticsearch-keystore.

Если вы хотите подписать некоторые, но не все исходящие сообщения SAML, то вы должны настроить следующий параметр в домене SAML:

signing.saml_messages
Список типов сообщений для подписи. Тип сообщения определяется локальным именем XML-элемента, используемого для сообщения. Поддерживаемые значения: AuthnRequest, LogoutRequest и LogoutResponse.
Настройка Elasticsearch для зашифрованных сообщений

Функции безопасности Elasticsearch поддерживают один ключ для дешифрования сообщений. Если ключ настроен, Elasticsearch пытается использовать его для дешифрования элементов EncryptedAssertion и EncryptedAttribute в ответах на аутентификацию, и элементов EncryptedID в запросах на выход.

Elasticsearch отклоняет любое сообщение SAML, содержащее EncryptedAssertion, которое невозможно дешифровать.

Если Assertion содержит как зашифрованные, так и незашифрованные атрибуты, то невозможность дешифрования зашифрованных атрибутов не приводит к автоматическому отклонению. Вместо этого Elasticsearch обрабатывает доступные незашифрованные атрибуты (и любые EncryptedAttributes, которые можно было дешифровать).

Если вы хотите использовать ключи и сертификаты в формате PEM для шифрования SAML, то вы должны настроить следующие параметры в домене SAML:

encryption.certificate
Путь к файлу сертификата в формате PEM. Пример: saml/saml-crypt.crt
encryption.key
Путь к файлу ключа в формате PEM. Пример: saml/saml-crypt.key
encryption.secure_key_passphrase
Пароль к ключу, если файл зашифрован. Это защищённый параметр, который необходимо установить с помощью инструмента elasticsearch-keystore.

Если вы хотите использовать файлы в формате PKCS#12 или хранилище ключей Java для шифрования SAML, то вы должны настроить следующие параметры в домене SAML:

encryption.keystore.path
Путь к хранилищу ключей PKCS#12 или JKS. Пример: saml/saml-crypt.p12
encryption.keystore.alias
Имя ключа в хранилище. Пример: encryption-key
encryption.keystore.secure_password
Пароль к хранилищу ключей, если файл зашифрован. Это защищённый параметр, который необходимо установить с помощью инструмента elasticsearch-keystore.

Генерация метаданных SP

Некоторые поставщики удостоверений (IdP) поддерживают импорт файла метаданных от поставщика услуг. Это автоматически настроит многие параметры интеграции между IdP и SP.

Elastic Stack поддерживает генерацию такого файла метаданных с помощью команды bin/elasticsearch-saml-metadata или API метаданных поставщика услуг SAML.

Вы можете сгенерировать метаданные SAML, отправив запрос API в Elasticsearch и сохранив его как XML-файл с помощью инструментов, таких как jq. Например, следующая команда генерирует метаданные для домена SAML realm1 и сохраняет их в файл metadata.xml:

curl -u user_name:password  -X GET http://localhost:9200/_security/saml/metadata/saml1 -H 'Content-Type: application/json' | jq -r '.[]' > metadata.xml

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

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

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

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

Это пример простого сопоставления ролей, которое предоставляет роль example_role любому пользователю, аутентифицирующемуся в домене saml1:

PUT /_security/role_mapping/saml-example
{
  "roles": [ "example_role" ], 
  "enabled": true,
  "rules": {
    "field": { "realm.name": "saml1" }
  }
}

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

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

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

  • username: Атрибут principal
  • dn: Атрибут dn
  • groups: Атрибут groups
  • metadata: См. Метаданные пользователя

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

Если ваш IdP может предоставлять группы или роли поставщикам услуг, вам следует сопоставить этот атрибут SAML с параметром attributes.groups в домене Elasticsearch, а затем использовать его в сопоставлении ролей, как показано в примере ниже.

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

PUT /_security/role_mapping/saml-finance
{
  "roles": [ "finance_data" ],
  "enabled": true,
  "rules": { "all": [
        { "field": { "realm.name": "saml1" } },
        { "field": { "groups": "finance-team" } }
  ] }
}

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

В этом случае выполните следующие шаги: 1. В вашем SAML домене назначьте атрибут SAML в качестве идентификатора пользователя, настроив параметр attributes.principal. 2. Создайте новый домен, который может искать пользователей из вашего локального хранилища (например, домен ldap). 3. В вашем SAML домене установите authorization_realms на имя домена, созданного на шаге 2.

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

По умолчанию у пользователей, аутентифицирующихся через SAML, есть дополнительные поля метаданных.

  • saml_nameid будет установлено в значение элемента NameID в ответ SAML аутентификации
  • saml_nameid_format будет установлено в полном URI атрибута format NameID
  • Каждый атрибут SAML, предоставленный в ответе об аутентификации (независимо от того, сопоставлен ли он с свойством пользователя Elasticsearch), будет добавлен как поле метаданных saml(name), где "имя" - полное URI имя атрибута. Например, saml(urn:oid:0.9.2342.19200300.100.1.3).
  • Для каждого атрибута SAML, имеющего friendlyName, также будет добавлено поле метаданных saml_friendlyName, где "имя" - полное URI имя атрибута. Например, saml_mail.

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

Настройка Kibana

Для аутентификации SAML в Kibana требуется несколько дополнительных настроек помимо стандартной конфигурации безопасности Kibana. Подробная информация о доступных параметрах конфигурации приведена в документации по безопасности Kibana.

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

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

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

Вы можете скорректировать эти временные ограничения в соответствии со своими требованиями к безопасности.

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

xpack.security.authc.providers:
  saml.saml1:
    order: 0
    realm: "saml1"

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

xpack.security.authc.providers
Добавьте поставщика saml, чтобы указать Kibana использовать SAML SSO в качестве метода аутентификации.
xpack.security.authc.providers.saml.<provider-name>.realm
Установите значение имени SAML-домена, который вы использовали в своей конфигурации домена Elasticsearch, например: saml1

Поддержка SAML и базовой аутентификации в Kibana

Поддержка SAML в Kibana основана на предположении, что это будет основной (или единственный) метод аутентификации для пользователей данного экземпляра Kibana. Однако можно поддерживать как SAML, так и базовые аутентификации в одном экземпляре Kibana, установив xpack.security.authc.providers, как показано в примере ниже:

xpack.security.authc.providers:
  saml.saml1:
    order: 0
    realm: "saml1"
  basic.basic1:
    order: 1

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

В качестве альтернативы, при включенном поставщике аутентификации basic, вы можете разместить обратный прокси перед Kibana и настроить его на отправку заголовка базовой аутентификации (Authorization: Basic ....) для каждого запроса. Если этот заголовок присутствует и действителен, Kibana не будет запускать процесс аутентификации SAML.

Работа с несколькими экземплярами Kibana

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

Каждый домен SAML должен иметь собственный уникальный идентификатор сущности (sp.entity_id) и свой собственный Сервис проверки утверждений (sp.acs). Каждый экземпляр Kibana будет сопоставлен с правильным доменом путем поиска соответствующего значения sp.acs.

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

Ниже приведен пример наличия трех разных экземпляров Kibana, два из которых используют один и тот же внутренний IdP, а другой - другой IdP.

xpack.security.authc.realms.saml.saml_finance:
  order: 2
  idp.metadata.path: saml/idp-metadata.xml
  idp.entity_id: "https://sso.example.com/"
  sp.entity_id:  "https://kibana.finance.example.com/"
  sp.acs: "https://kibana.finance.example.com/api/security/saml/callback"
  sp.logout: "https://kibana.finance.example.com/logout"
  attributes.principal: "urn:oid:0.9.2342.19200300.100.1.1"
  attributes.groups: "urn:oid:1.3.6.1.4.1.5923.1.5.1."
xpack.security.authc.realms.saml.saml_sales:
  order: 3
  idp.metadata.path: saml/idp-metadata.xml
  idp.entity_id: "https://sso.example.com/"
  sp.entity_id:  "https://kibana.sales.example.com/"
  sp.acs: "https://kibana.sales.example.com/api/security/saml/callback"
  sp.logout: "https://kibana.sales.example.com/logout"
  attributes.principal: "urn:oid:0.9.2342.19200300.100.1.1"
  attributes.groups: "urn:oid:1.3.6.1.4.1.5923.1.5.1."
xpack.security.authc.realms.saml.saml_eng:
  order: 4
  idp.metadata.path: saml/idp-external.xml
  idp.entity_id: "https://engineering.sso.example.net/"
  sp.entity_id:  "https://kibana.engineering.example.com/"
  sp.acs: "https://kibana.engineering.example.com/api/security/saml/callback"
  sp.logout: "https://kibana.engineering.example.com/logout"
  attributes.principal: "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"

Возможна ситуация, когда один или несколько экземпляров Kibana используют SAML, в то время как другие экземпляры используют базовые аутентификации другого типа (например, местного или LDAP).

Поиск и устранение неполадок в конфигурации домена SAML

Спецификация SAML 2.0 предоставляет множество вариантов и гибкости разработчикам, что, в свою очередь, повышает сложность и количество доступных параметров конфигурации как у поставщика услуг (Elastic Stack), так и у поставщика удостоверений. Кроме того, различные домены безопасности имеют различные требования к безопасности, которые требуют специфической конфигурации для удовлетворения. Были предприняты сознательные усилия для маскировки этой сложности с помощью разумных значений по умолчанию и подробной документации выше, но если у вас возникнут проблемы с настройкой домена SAML, вы можете обратиться к нашей документации по устранению неполадок SAML, где представлены рекомендации и решения для распространенных проблем.

SAML без Kibana

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

В этом разделе предполагается, что читатель знаком со стандартом SAML 2.0 и, в частности, с профилем однократного входа в систему SAML 2.0 с помощью веб-браузера.

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

Сфера SAML

Необходимо создать сферу SAML и настроить её в Elasticsearch. Обратитесь к настройке Elasticsearch для аутентификации SAML.

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

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

POST /_security/role/saml-service-role
{
  "cluster" : ["manage_saml", "manage_token"]
}
POST /_security/user/saml-service-user
{
  "password" : "<somePasswordHere>",
  "roles"    : ["saml-service-role"]
}

Обработка потока аутентификации, инициированной SP

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

  1. Отправьте HTTP-запрос POST на _security/saml/prepare, аутентифицируясь как пользователь saml-service-user. Используйте имя сферы SAML в конфигурации Elasticsearch или значение URL-адреса потребителя утверждений в теле запроса. Более подробную информацию см. в API SAML prepare authentication.

    POST /_security/saml/prepare
    {
      "realm" : "saml1"
    }
  2. Обработайте ответ от /_security/saml/prepare. Ответ Elasticsearch будет содержать 3 параметра: redirect, realm и id. Пользовательскому веб-приложению необходимо сохранить значение для id в сессии пользователя (на стороне клиента в cookie или на стороне сервера, если информация о сессии сохраняется таким образом). Также необходимо перенаправить браузер пользователя на URL-адрес, возвращённый в параметре redirect. Значение id не следует игнорировать, так как оно используется как случайный идентификатор в SAML для предотвращения повторных атак.
  3. Обработайте последующий ответ от поставщика удостоверений SAML. После успешной аутентификации пользователя у поставщика удостоверений он будет перенаправлен обратно на URL-адрес потребителя утверждений. Это sp.acs должно быть определено как URL-адрес, обрабатываемый пользовательским веб-приложением. При получении этого HTTP-запроса POST пользовательское веб-приложение должно разобрать его и отправить собственный HTTP-запрос POST на API _security/saml/authenticate. Оно должно аутентифицироваться как пользователь saml-service-user и передать закодированный в Base64 ответ SAML в теле запроса. Также необходимо передать значение для id, которое было ранее сохранено в сессии пользователя.

    См. API SAML authenticate для получения дополнительной информации.

    POST /_security/saml/authenticate
    {
      "content" : "PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMD.....",
      "ids" : ["4fee3b046395c4e751011e97f8900b5273d56685"]
    }

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

  4. Ответ на вызов /_security/saml/authenticate будет содержать только имя пользователя, прошедшего аутентификацию. Если вам нужно получить значения атрибутов SAML, содержащихся в ответе SAML для данного пользователя, вы можете вызвать API аутентификации /_security/_authenticate/, используя токен доступа как токен Bearer, и значения атрибутов SAML будут содержаться в ответе как часть метаданных пользователя.

Обработка потока аутентификации, инициированной IdP

Elasticsearch также может обрабатывать поток однократного входа в систему, инициированный IdP, профиля SAML 2 Web Browser SSO. В этом случае аутентификация начинается с неожидаемого ответа об аутентификации от поставщика удостоверений SAML. Отличие от аутентификации, инициированной SP заключается в том, что веб-приложению необходимо обрабатывать запросы на sp.acs, которые не будут ответом на предыдущие перенаправления. Таким образом, у него не будет сессии пользователя, и он не будет иметь сохранённых значений параметра id. Запрос на API _security/saml/authenticate в этом случае будет выглядеть так:

POST /_security/saml/authenticate
{
  "content" : "PHNhbWxwOlJlc3BvbnNlIHhtbG5zOnNhbWxwPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWw9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMD.....",
  "ids" : []
}

Обработка процесса выхода

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

    POST /_security/saml/logout
    {
      "token" : "46ToAxZVaXVVZTVKOVF5YU04ZFJVUDVSZlV3",
      "refresh_token": "mJdXLtmvTUSpoLwMvdBt_w"
    }

    Если сфера SAML настроена соответствующим образом и IdP поддерживает её (см. выход SAML), этот запрос инициирует однократный выход SAML, инициированный SP. В этом случае ответ будет содержать параметр redirect, указывающий, куда необходимо перенаправить пользователя в IdP для завершения выхода.

  2. В качестве альтернативы IdP может инициировать поток однократного выхода в какой-то момент. Для обработки этого случая URL выхода (sp.logout) должен обрабатываться пользовательским веб-приложением. Часть запроса URL-адреса, на который будет перенаправлен пользователь, будет содержать запрос SAML Logout, и эту часть запроса необходимо передать в Elasticsearch, используя API SAML invalidate

    POST /_security/saml/invalidate
    {
      "query" : "SAMLRequest=nZFda4MwFIb%2FiuS%2BmviRpqFaClKQdbvo2g12M2KMraCJ9cRR9utnW4Wyi13sMie873MeznJ1aWrnS3VQGR0j4mLkKC1NUeljjA77zYyhVbIE0dR%2By7fmaHq7U%2BdegXWGpAZ%2B%2F4pR32luBFTAtWgUcCv56%2Fp5y30X87Yz1khTIycdgpUW9kY7WdsC9zxoXTvMvWuVV98YyMnSGH2SYE5pwALBIr9QKiwDGpW0oGVUznGeMyJZKFkQ4jBf5HnhUymjIhzCAL3KNFihbYx8TBYzzGaY7EnIyZwHzCWMfiDnbRIftkSjJr%2BFu0e9v%2B0EgOquRiiZjKpiVFp6j50T4WXoyNJ%2FEWC9fdqc1t%2F1%2B2F3aUpjzhPiXpqMz1%2FHSn4A&SigAlg=http%3A%2F%2Fwww.w3.org%2F2001%2F04%2Fxmldsig-more%23rsa-sha256&Signature=MsAYz2NFdovMG2mXf6TSpu5vlQQyEJAg%2B4KCwBqJTmrb3yGXKUtIgvjqf88eCAK32v3eN8vupjPC8LglYmke1ZnjK0%2FKxzkvSjTVA7mMQe2AQdKbkyC038zzRq%2FYHcjFDE%2Bz0qISwSHZY2NyLePmwU7SexEXnIz37jKC6NMEhus%3D",
      "realm" : "saml1"
    }

    Затем пользовательское веб-приложение должно обработать ответ, который будет содержать параметр redirect с URL-адресом в IdP, содержащим ответ SAML Logout. Приложение должно перенаправить пользователя туда для завершения выхода.

Для однократного выхода, инициированного SP, IdP может отправить ответ о выходе, который может быть проверен Elasticsearch с помощью API SAML complete logout.

© 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/7.17/saml-guide-stack.html

Spec-Zone.ru

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