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

Single Sign-On плагин для Sonatype Nexus Repository

Single Sign-On плагин для Sonatype Nexus Repository - 1

Привет! Сегодня я хочу рассказать о своём проекте - Single Sign-On плагин для Sonatype Nexus Repository [1].

Sonatype Nexus Repository — это репозиторий артефактов, который поддерживает различные форматы распространения, такие как Maven, Docker, Pip и др. Nexus позволяет размещать свои собственные артефакты, а также использовать его в качестве прокси для общедоступных репозиториев, с таким прокси сокращается время получения артефактов и экономится трафик.

Мотивация

Думаю ни для кого не секрет, что в корпоративной среде Nexus стал своего рода промышленным стандартом для хранения и распространения артефактов программного обеспечения. Это очень гибкое и мощное решение для управления репозиториями артефактов, однако версия "Community Edition [2]" (ранее называемая OSS [3]) имеет некоторые ограничения, в числе которых отсутствие поддержки аутентификации посредством технологии единого входа (Single Sign-On или сокращенно SSO).

Single Sign-On

Данный плагин реализует аутентификацию единого входа (SSO [4]) с использованием поставщика удостоверений SAML [5]. В роли такого поставщика удостоверений может выступать Keycloak [6], Okta [7], ADFS [8] и в теории любой другой сервер авторизации SAML. Некоторые детали реализации SSO:

  1. Nexus использует систему доступа на основе фреймворка Apache Shiro [9], этот плагин расширяет его библиотеками Pac4j [10] и buji-pac4j [11] которые реализуют технологию SSO и SAML в частности. Процедура настройки вынесена в отдельную документацию SAML.md [12].

  2. Пользователи SSO создаются как внутренние учетные записи Nexus при первом входе в систему и обновляются при каждом последующем входе.

  3. После включения "SSO Pac4j Realm" в админке Nexus на форму авторизации добавляется кнопка входа через SSO, текст кнопки может быть настроен в конфигурационном файле "shiro.ini [13]".

Токены

Поскольку аутентификацию единого входа невозможно пройти без участия человека (второй фактор, капча и т.д.), то плагин реализует еще и пользовательские токены, которые применяются в сочетании с SSO/SAML, для тех случаев, когда необходимо выполнить аутентификацию через инструменты деплоя (Docker, Maven, Pip и т.д) или командную строку. Ключевые моменты реализации токенов:

  1. После включения "SSO Token Realm" каждый пользователь может создать персональный токен, который будет использоваться вместо аутентификации единого входа.

  2. Создание токенов реализовано через меню "NuGet API Key" (требуются привилегии nx-apikey-all), однако сами токены применяются ко всем типам репозиториев, а не только к "NuGet".

  3. При создании токена на форме проверки подлинности пользователям авторизованным через SSO требуется вводить ID (логин) своей учетной записи, а не пароль.

  4. Токен имеет срок жизни (по умолчанию 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] от пользователей.

Контакты

Ссылки для связи:

Автор: 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