- PVSM.RU - https://www.pvsm.ru -

Привет! Сегодня я хочу рассказать о своём проекте - Single Sign-On плагин для Sonatype Nexus Repository [1].
Sonatype Nexus Repository — это репозиторий артефактов, который поддерживает различные форматы распространения, такие как Maven, Docker, Pip и др. Nexus позволяет размещать свои собственные артефакты, а также использовать его в качестве прокси для общедоступных репозиториев, с таким прокси сокращается время получения артефактов и экономится трафик.
Думаю ни для кого не секрет, что в корпоративной среде Nexus стал своего рода промышленным стандартом для хранения и распространения артефактов программного обеспечения. Это очень гибкое и мощное решение для управления репозиториями артефактов, однако версия "Community Edition [2]" (ранее называемая OSS [3]) имеет некоторые ограничения, в числе которых отсутствие поддержки аутентификации посредством технологии единого входа (Single Sign-On или сокращенно SSO).
Данный плагин реализует аутентификацию единого входа (SSO [4]) с использованием поставщика удостоверений SAML [5]. В роли такого поставщика удостоверений может выступать Keycloak [6], Okta [7], ADFS [8] и в теории любой другой сервер авторизации SAML. Некоторые детали реализации SSO:
Nexus использует систему доступа на основе фреймворка Apache Shiro [9], этот плагин расширяет его библиотеками Pac4j [10] и buji-pac4j [11] которые реализуют технологию SSO и SAML в частности. Процедура настройки вынесена в отдельную документацию SAML.md [12].
Пользователи SSO создаются как внутренние учетные записи Nexus при первом входе в систему и обновляются при каждом последующем входе.
После включения "SSO Pac4j Realm" в админке Nexus на форму авторизации добавляется кнопка входа через SSO, текст кнопки может быть настроен в конфигурационном файле "shiro.ini [13]".
Поскольку аутентификацию единого входа невозможно пройти без участия человека (второй фактор, капча и т.д.), то плагин реализует еще и пользовательские токены, которые применяются в сочетании с SSO/SAML, для тех случаев, когда необходимо выполнить аутентификацию через инструменты деплоя (Docker, Maven, Pip и т.д) или командную строку. Ключевые моменты реализации токенов:
После включения "SSO Token Realm" каждый пользователь может создать персональный токен, который будет использоваться вместо аутентификации единого входа.
Создание токенов реализовано через меню "NuGet API Key" (требуются привилегии nx-apikey-all), однако сами токены применяются ко всем типам репозиториев, а не только к "NuGet".
При создании токена на форме проверки подлинности пользователям авторизованным через SSO требуется вводить ID (логин) своей учетной записи, а не пароль.
Токен имеет срок жизни (по умолчанию 1 год, настраивается через "shiro.ini [13]"), по истечении которого его нужно пересоздать. Процедура настройки вынесена в отдельную документацию Tokens.md [14].
Решение реализовано как OSGI плагин для Nexus (точнее Karaf [15]), актуальную версию которого можно скачать на странице релизов [16]. Процедура "ручной" установки плагина на данный момент не детализирована, но вы можете следовать рекомендациям из этого комментария 35#issuecomment-2545384573 [17]. Для тех кто не любит лишние сложности рекомендую использовать вариант с Docker контейнером ghcr.io/a-langer/nexus-sso [18], который собирается на основе официального образа Nexus с добавлением плагина SSO. Проект уже содержит конфигурацию Docker Compose [19], которая поднимает пропатченный контейнер Nexus вместе с Nginx Reverse Proxy [20]:
# Клонировать конфигурацию и сменить рабочую директорию
git clone https://github.com/a-langer/nexus-sso.git
cd ./nexus-sso
# Скопировать compose.override.yml из шаблона для ваших настроек
cp _compose.override.yml compose.override.yml
# Установить переменные среды для пользователя контейнера
export NEXUS_USER=$(id -u) NEXUS_GROUP=$(id -g)
# Запустить сервис и открыть http://localhost в браузере
docker compose up -d
На момент написания статьи проект на GitHub [1] имеет следующую статистику:
84 пользователя добавили проект в избанное [21] (поставили "звезду").
Выпущена 12-я по счету версия плагина 3.75.1 [22].
Выпущена версия контейнера 3.75.1-java17-ubi [23], которая набрала 1,416 скачиваний.
Закрыто 40 запросов [24] от пользователей.
Ссылки для связи:
Проект на GitHub https://github.com/a-langer/nexus-sso [1].
Канал с анонсами релизов https://t.me/alexey_langer [25].
Профиль в LinkedIn https://www.linkedin.com/in/a-langer [26].
Автор: alanger
Источник [27]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/417938
Ссылки в тексте:
[1] Single Sign-On плагин для Sonatype Nexus Repository: https://github.com/a-langer/nexus-sso
[2] Community Edition: https://www.sonatype.com/products/nexus-community-edition-download
[3] OSS: https://help.sonatype.com/en/sonatype-nexus-repository-3-77-0-release-notes.html#what-s-new-in-3-77-0--
[4] SSO: https://en.wikipedia.org/wiki/Single_sign-on
[5] SAML: https://en.wikipedia.org/wiki/SAML_2.0
[6] Keycloak: https://www.keycloak.org/docs/latest/server_admin/#assembly-managing-clients_server_administration_guide
[7] Okta: https://developer.okta.com/docs/concepts/saml/#enabling-saml-for-everyone-vs-a-subset-of-users
[8] ADFS: https://learn.microsoft.com/en-us/power-pages/security/authentication/saml2-settings
[9] Apache Shiro: https://shiro.apache.org/web.html
[10] Pac4j: https://www.pac4j.org/docs/clients/saml.html
[11] buji-pac4j: https://github.com/bujiio/buji-pac4j
[12] SAML.md: https://github.com/a-langer/nexus-sso/blob/main/docs/SAML.md
[13] shiro.ini: https://github.com/a-langer/nexus-sso/blob/main/nexus-pac4j-plugin/src/main/config/shiro.ini
[14] Tokens.md: https://github.com/a-langer/nexus-sso/blob/main/docs/Tokens.md
[15] Karaf: https://karaf.apache.org/
[16] релизов: https://github.com/a-langer/nexus-sso/releases
[17] 35#issuecomment-2545384573: https://github.com/a-langer/nexus-sso/issues/35#issuecomment-2545384573
[18] ghcr.io/a-langer/nexus-sso: https://github.com/a-langer/nexus-sso/pkgs/container/nexus-sso
[19] Docker Compose: https://github.com/a-langer/nexus-sso/blob/main/docs/Docker.md
[20] Nginx Reverse Proxy: https://github.com/a-langer/nexus-sso/blob/main/docs/Nginx.md
[21] избанное: https://github.com/a-langer/nexus-sso/stargazers
[22] 3.75.1: https://github.com/a-langer/nexus-sso/releases/tag/3.75.1-java17
[23] 3.75.1-java17-ubi: https://github.com/a-langer/nexus-sso/pkgs/container/nexus-sso/361101850?tag=3.75.1-java17-ubi
[24] 40 запросов: https://github.com/a-langer/nexus-sso/issues?q=is%3Aissue%20state%3Aclosed
[25] https://t.me/alexey_langer: https://t.me/alexey_langer
[26] https://www.linkedin.com/in/a-langer: https://www.linkedin.com/in/a-langer
[27] Источник: https://habr.com/ru/articles/904766/?utm_source=habrahabr&utm_medium=rss&utm_campaign=904766
Нажмите здесь для печати.