
Привет, Хабр! Сегодня я хочу рассказать о своём проекте - Single Sign-On плагин для Sonatype Nexus Repository.
Sonatype Nexus Repository — это репозиторий артефактов, который поддерживает различные форматы распространения, такие как Maven, Docker, Pip и др. Nexus позволяет размещать свои собственные артефакты, а также использовать его в качестве прокси для общедоступных репозиториев, с таким прокси сокращается время получения артефактов и экономится трафик.
Мотивация
Думаю ни для кого не секрет, что в корпоративной среде Nexus стал своего рода промышленным стандартом для хранения и распространения артефактов программного обеспечения. Это очень гибкое и мощное решение для управления репозиториями артефактов, однако версия "Community Edition" (ранее называемая OSS) имеет некоторые ограничения, в числе которых отсутствие поддержки аутентификации посредством технологии единого входа (Single Sign-On или сокращенно SSO).
Single Sign-On
Данный плагин реализует аутентификацию единого входа (SSO) с использованием поставщика удостоверений SAML. В роли такого поставщика удостоверений может выступать Keycloak, Okta, ADFS и в теории любой другой сервер авторизации SAML. Некоторые детали реализации SSO:
Nexus использует систему доступа на основе фреймворка Apache Shiro, этот плагин расширяет его библиотеками Pac4j и buji-pac4j которые реализуют технологию SSO и SAML в частности. Процедура настройки вынесена в отдельную документацию SAML.md.
Пользователи SSO создаются как внутренние учетные записи Nexus при первом входе в систему и обновляются при каждом последующем входе.
После включения "SSO Pac4j Realm" в админке Nexus на форму авторизации добавляется кнопка входа через SSO, текст кнопки может быть настроен в конфигурационном файле "shiro.ini".
Токены
Поскольку аутентификацию единого входа невозможно пройти без участия человека (второй фактор, капча и т.д.), то плагин реализует еще и пользовательские токены, которые применяются в сочетании с SSO/SAML, для тех случаев, когда необходимо выполнить аутентификацию через инструменты деплоя (Docker, Maven, Pip и т.д) или командную строку. Ключевые моменты реализации токенов:
После включения "SSO Token Realm" каждый пользователь может создать персональный токен, который будет использоваться вместо аутентификации единого входа.
Создание токенов реализовано через меню "NuGet API Key" (требуются привилегии nx-apikey-all), однако сами токены применяются ко всем типам репозиториев, а не только к "NuGet".
При создании токена на форме проверки подлинности пользователям авторизованным через SSO требуется вводить ID (логин) своей учетной записи, а не пароль.
Токен имеет срок жизни (по умолчанию 1 год, настраивается через "shiro.ini"), по истечении которого его нужно пересоздать. Процедура настройки вынесена в отдельную документацию Tokens.md.
Способы распространения
Решение реализовано как OSGI плагин для Nexus (точнее Karaf), актуальную версию которого можно скачать на странице релизов. Процедура "ручной" установки плагина на данный момент не детализирована, но вы можете следовать рекомендациям из этого комментария 35#issuecomment-2545384573. Для тех кто не любит лишние сложности рекомендую использовать вариант с Docker контейнером ghcr.io/a-langer/nexus-sso
, который собирается на основе официального образа Nexus с добавлением плагина SSO. Проект уже содержит конфигурацию Docker Compose, которая поднимает пропатченный контейнер Nexus вместе с Nginx Reverse Proxy:
# Клонировать конфигурацию и сменить рабочую директорию
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 имеет следующую статистику:
84 пользователя добавили проект в избанное (поставили "звезду").
Выпущена 12-я по счету версия плагина 3.75.1.
Выпущена версия контейнера 3.75.1-java17-ubi, которая набрала 1,416 скачиваний.
Закрыто 40 запросов от пользователей.
Контакты
Ссылки для связи:
Проект на GitHub https://github.com/a-langer/nexus-sso.
Канал с анонсами релизов https://t.me/alexey_langer.
Профиль в LinkedIn https://www.linkedin.com/in/a-langer.