SSO для самохостинга

Собственно предлагаю обсудить варианты SSO для домашних сервисов т.к. у меня не все гладко с этим

Что такое SSO

SSO (Single Sign-On) в контексте домашнего хостинга — это технология единого входа, позволяющая пользователям аутентифицироваться один раз для доступа к нескольким сервисам (например, Nextcloud, WordPress, GitLab) без повторного ввода пароля. Для реализации используются протоколы OAuth, OpenID Connect, SAML или LDAP , интегрируемые через сервисы вроде Keycloak или Authelia . Это повышает безопасность, сокращает количество учетных данных и упрощает управление доступом в локальной сети.

Что мне надо

  1. OIDC для совместимых приложений
  2. Дополнительные поля пользователя, например, для SSH ключей
  3. Проксирование аутентифиакации для неподдерживаемых приложений через Traefik
  4. Поддержка Passkey

Что еще есть, но мне не критично

  1. LDAP федерация
  2. SSSD - это просто кайф, но дома пока не готов на это

Какие варианты есть

  1. AD + ADFS - M$ не хочу
  2. Keycloak - промышленный стандарт, самая кастомизируемая платформа
  3. Authentik - сейчас основной и у меня в нем уже 22 приложения заведено
  4. Zitadel - пробую
  5. Tinyauth - минималистичный проект на конфигах
  6. Authelia - не пробовал
  7. Pocket ID - интересный проект для passkey
  8. CAS - встречал упоминания его, но не более
  9. Ory - встречал упоминания его, но не более
  10. Напишите в комментариях что пользуете дома

Дополнительные ссылки

  1. Active Directory vs Authentik
  2. Навеяно видео Authelia vs Authentik vs Keycloak vs Zitadel Как выбрать SSO для своих сервисов by Stilicho 2011
  3. Обсуждение на реддите

Мой путь

  1. В организации использую Keycloak, в целом нравится т.к. это индустриальный стандарт, но это Java и есть требует много ресурсов + проблемы с обновлениями, часть функционала реализуется очень сложно

  2. Сейчас развернул дома Authentik, по функционалу устраивает, но Python не является эталоном производительности. Довольно тормозной и на N4000 загрузка в простое под 10%

  3. Пробовал демку Pocket-ID - визуално понравился, есть базовый функционал, но отсутствие паролей смущет

  4. Сейчас развернул Zitadel, он написан на go и очень быстрый. Пробую настроить тестовые интеграции.

Немного про решения

keycloak

Есть типовая задача, неправильная по архитектуре OIDC, но приходится с этим работать:

Проверка прав доступ при аутентификации пользователя и выдача 403 ошибки еще в IdP без выдачи токена клиенту
Тут правильно выдавать JWT токен клиенту т.к. SSO занимается аутентификацией, а авторизацией уже сами клиенты и с полученным JWT токеном пользователь идет в приложение, а приложение на основе различных типов ACL, например RBAC проверяет наличие роли в токене и разрешает или запрещает доступ
Но мои приложения так делают, а вот популярные продукты просто пускают пользователя с дефолтными правами

В keycloak я делал несколько заходов, чтобы запрещать доступ в самом keycloak, например, для Rocket Chat и у меня так и ничего не вышло

В Authentik это работает из коробки и очень круто

  • Еще добавление новых клиентов в keycloak чуть сложнее и приходится ковыряться в настройках, в authentik прям проще
  • Authentication proxy нет из коробки но есть готовые sidecar решения, настраивать дольше, но фишка в том, что можно настраивать точечно права, например /api/admin/* разрешить только группе app_admin`` а ходить на /могут все пользователи в группеapp_users
  • С realm заморочесто, но при использовании федерации оправдано и у меня прям круто настроено, чего нет в authentik

Authentik

  • Мне не нравится производительность
  • Хочется кластеризацию, но пока не реализовал и не знаю можно ли легко сделать
  • Очень крутая работа с Authentication proxy, причем, я тут расписывал мою схему и она уже поменялась - теперь рядом с traefik на каждой ноде развернут еще и authentik authentication proxy, но очень простая логика разграничения прав

Zitadel

  • Пытался поднять несколько дней, в итоге таки запустил его - очень капризная и сложная
  • Продукт заточен явно под разработчиков, сразу предлагает создавать клиенты для популярных фреймворков разработки
  • Функционала маловато, authentik в этом плане явно более зрелый
  • Есть проблема с шрифтами для русского языка
  • Своебразная логика, которая отличается от других решений
  • Есть действия и вообще какие-то кастомные обработчики

Пока не разобрался

  • С настройкой ролей и добавлением их в токен
  • Запретом на доступ к приложению в самом zitadel
  • Authentication proxy
  • Отказоустойчивость
  • Что делать с проектами в zitadel
  • Есть ошибка с настройкой passkey (опять проблемы с документацией и приложением) - вообще проект очень сырой
  • Перенос всех приложений из authentik в zitadel

А что вы используете и что посоветуете мне сделать?

2 лайка

Мысли по поводу zitadel

Вспоминается история про первую Tesla model S, где не было или обогрева зеркал или стекла лобового, не помню уже деталей, но какие-то тупые косяки вылезли в первой ревизии автомобиля т.к. из всей команды проектировщиков водительские права были только у одного.
Может и байка, но суть в том, что они разрабатывали автомобиль не зная какие есть вообще на рынке модели и как их проектировать, с одной стороны они сделали что-то новое, а не переняли то, что переносится инженерами из года в год, и даже сделали то, что до этого априори считалось невыполнимым. С другой стороны, те детские болячки, которые другие производители давно побороли проектировщики теслы собрали в одном месте и потом еще несколько лет исправляли

Zitadel вроде работает быстро, но аутентификация локально работает как-то очень медленно, периодически ошибки вылазят в консоли, такое чувство, что там что-то внутри сломано

Такие привычные вещи как предпросмотр содержимого JWT токена, которые есть у “взрослых” продуктов тут просто не завезли, соответственно как через веб интерфейс посмотреть в каком поле записано имя, а где логин просто нельзя. Ну правильно, зачем это тут если разработчик все равно получит токен в приложении, выведет его содержимое в режиме отладки и пропишет настройки в приложении на основе той информации, которую увидел. А что делать просому самохостеру, который пытается настроить partainer и надо указать поле с логином?

В Authentik, например, есть фишка, что он может заполнять фильтр валидных редиректов при первом входе в приложение и это круто - сразу чувствуешь, что данный продукт проектировали реальные пользователи SSO, а не сеньоры бэкенд девелоперы, соревнующиеся между собой в знании паттеронов проектирования без опыта настройки keycloak на 10 000 пользователей.

Мультитенантность сейчас очень модна, но в zitadel явно перегружена за счет общего качества продукта. В Keycloak есть relams и работают они там отлично, а при настройке федерации с AD/FreeIPA это прям божественно, тут разработчики какой-то огород нагородили.

Начальная настройка тоже вызывает вопросы: есть несколько конфликтующих между собой примеров docker-compose, в разделе с reverse proxy кто-то явно пытался показать все свое мастерство в написании compose файлов, забыв про права доступа на корневой каталог проекта. В итоге пришлось переписывать под себя все равно. А создание начального пользователя - вообще песня

Создание клиентов: это единственный продукт который просто ввел меня в ступор, если в pocket id и authentik это вообще интуитивно все делается, то тут опять какой-то оверинжиниринг полез

Пока еще поприсматриваюсь к этому продукту, ноооооо, у меня большие сомнения на счет целесообразноси перехода на него

1 лайк

А что в нем не так с производительностью? Я пока сижу на AD, не то что бы хотел на что-то менять, но в сторону Authentik немного посматриваю.

Ну вот это на N4000 сейчас


Подтюнил логирование - стало получше, но видно, что ниже 6% нагрузка не опускается в принципе даже в простое, пики это аутентификация пользователя.

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

Пробовал переносить на Ryzen 7 5825U и там не особо лучше при выделении все тех же 2 ядер. Причем, я бы не сказал, что он прям тормозной, но бывает такое, что вот так тарахтит в фоне несколько часов, а потом открываешь кластер proxmox и он секунды 3-4 крутит лоадер пока обменивается токенами с authentik, заходишь в админку и он тоже несколько секунд прогружает все, а потом уже быстро навигация по приложению происходит.

Вообще под него рекомендуют 4-6 ядер CPU и сколько же ГБ RAM выделять

Я еще двигаюсь в сторону Linstor и proxmox HA, но все равно хотелось крутить на выделенном минике несколько сервисов (с резервными копиями и все такое). но чтобы там только эти сервисы были и минимальная обвязка и без куллера, чтобы лежал себе и не шуршал. А другие миники уже под большие нагрузки, но там все равно остается режим лаборатории - что-то с дисками делаю, всякие TPU тестирую и прочее, поэтому аптайм ниже.

Пока решил остаться на Authentik, потюнил его проиводительность, добавил оперативки, добавил еще LDAP провайдера и переходить на ziitadel совсем не хочется.

Роману, уже традиционное спасибо за отличный пост\статью и личный опыт.

Добавил ссылку на эту ветку на сайт https://pro.samohosting.ru/ в профильную категорию.

Ну и дополнительно рекомендую к изучению читателем :
2. КАК ВЫБРАТЬ SSO?

Authelia vs Authentik vs Keycloak vs Zitadel by ProHomelab

3. Authentik

плейлист от А до Я by ProHomelab

4. Keycloak

полный гайд для начинающих by ProHomelab

Всем удачного самохостинга!

Приветствую!
Пытаюсь настроить social login через Yandex ID в Authentik (версия 2025.10.2). С Telegram есть нюанс (кнопка не отображается), но это известный баг. А вот с Яндексом застрял.

Суть проблемы: Авторизация в Яндексе проходит успешно, происходит редирект обратно, но Authentik выдает ошибку: Authentication failed: Could not determine id

Мои настройки:

  • Создал источник типа: OpenID OAuth (так как Generic OAuth в списке выбора отсутствует).

  • URL-адреса (token/authorization/profile) прописаны

Диагностика: Я проверил через curl, что именно возвращает Яндекс на endpoint /info. Он возвращает JSON с полем id, но без поля sub:

JSON

{"id": "12345...", "login": "my.login", ...}

Так как тип источника OpenID OAuth, Authentik ожидает поле sub и настройки User ID Key в интерфейсе скрыты.

Вопрос: Как корректно замапить id от Яндекса в sub или заставить Authentik использовать поле id в качестве ключа? Нужно ли это делать через Property Mappings (но ошибка падает до маппинга) или есть способ изменить User ID Key для OpenID источника (например, через shell)?

Кто-то пробовал использовать voidauth ?