Содержание
SSO (Single Sign-On) — это система аутентификации, которая позволяет пользователям получать доступ ко многим приложениям, сайтам и сервисам с помощью одного набора учётных данных. Это упрощает процесс аутентификации, так как не нужно запоминать множество логинов и паролей для разных сервисов.
В рамках экспериментов с SSO в домашней лаборатории было решено протестировать Authentik. Это мощное самохостинговое решение для SSO, способное покрыть практически любые требования. Кроме того, Authentik SSO можно легко установить с помощью Docker Compose.
Обзор Authentik
Если Authentik незнаком, это открытый провайдер идентификации. Идея решения — заменить платные сервисы вроде Okta, Keycloak или Auth0 и развернуть собственный провайдер аутентификации. Поддерживаются все основные технологии: SAML, OpenID Connect (OIDC), LDAP и другие.
Любое приложение, поддерживающее современные механизмы аутентификации, вероятнее всего, будет корректно работать с Authentik. Для домашней лаборатории это двойная выгода: появляется централизованный сервис (самостоятельно хостируемый), позволяющий унифицировать вход и обеспечить высокую защищённость среды.
При необходимости единого входа с доступом к self-hosted-сервисам вроде Portainer, Gitea, Nextcloud и Proxmox, Authentik делает это возможным.
Что нужно для запуска Docker Compose и Authentik?
Ничего необычного — требуются базовые компоненты:
- Сервер или виртуальная машина с Linux (подойдут Ubuntu, Debian и т. п.)
- Установленные Docker и Docker Compose — для Ubuntu см. официальную документацию: Ubuntu | Docker Docs
- Доменное имя для инстанса Authentik — внутреннее или внешнее. Для сертификатов Let’s Encrypt потребуется внешний домен
- Реверс-прокси, например Traefik или Nginx Proxy Manager, если нужен HTTPS с Let’s Encrypt
Authentik опирается на несколько открытых компонентов:
- База данных PostgreSQL
- Redis для кеширования
Docker Compose упрощает «сборку» стека Authentik. Рекомендуется определить постоянные тома для базы данных и конфигурации Authentik, чтобы данные сохранялись при перезапуске контейнеров.
Файл Docker-Compose для Authentik SSO
Ниже приведён пример конфигурации для Authentik SSO через Docker Compose. Он может сэкономить значительное количество времени при первоначальном развёртывании. В примере используется Traefik как реверс-прокси (это предпосылка для данного фрагмента), однако метки Traefik легко убрать и подключить необходимые контейнеры к нужной сети Docker.
Конфигурация состоит из двух частей: файла Docker-Compose и файла .env с чувствительными переменными. Ниже — код Docker-Compose V2:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
services: authentik-db: image: postgres:15 environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB} volumes: - ${AUTHENTIK_DB_VOLUME_PATH}:/var/lib/postgresql/data networks: - traefik healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 start_period: 30s deploy: replicas: 1 restart_policy: condition: on-failure authentik-redis: image: redis:7-alpine volumes: - ${AUTHENTIK_REDIS_VOLUME_PATH}:/data networks: - traefik deploy: replicas: 1 restart_policy: condition: on-failure authentik: image: ${AUTHENTIK_IMAGE} restart: always command: server depends_on: - authentik-db - authentik-redis environment: - AUTHENTIK_POSTGRESQL__HOST=${AUTHENTIK_POSTGRESQL__HOST} - AUTHENTIK_POSTGRESQL__PORT=${AUTHENTIK_POSTGRESQL__PORT} - AUTHENTIK_POSTGRESQL__NAME=${AUTHENTIK_POSTGRESQL__NAME} - AUTHENTIK_POSTGRESQL__USER=${AUTHENTIK_POSTGRESQL__USER} - AUTHENTIK_POSTGRESQL__PASSWORD=${AUTHENTIK_POSTGRESQL__PASSWORD} - AUTHENTIK_REDIS__HOST=${AUTHENTIK_REDIS__HOST} - AUTHENTIK_REDIS__PORT=${AUTHENTIK_REDIS__PORT} - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY} - AUTHENTIK_ERROR_REPORTING__ENABLED=${AUTHENTIK_ERROR_REPORTING__ENABLED} - AUTHENTIK_LOG_LEVEL=${AUTHENTIK_LOG_LEVEL} - AUTHENTIK_WEB__TRUSTED_PROXIES=${AUTHENTIK_WEB__TRUSTED_PROXIES} - AUTHENTIK_LISTEN__HTTP=${AUTHENTIK_LISTEN__HTTP} - AUTHENTIK_LISTEN__HTTPS=${AUTHENTIK_LISTEN__HTTPS} - AUTHENTIK_BOOTSTRAP_PASSWORD=${AUTHENTIK_BOOTSTRAP_PASSWORD} - AUTHENTIK_BOOTSTRAP_EMAIL=${AUTHENTIK_BOOTSTRAP_EMAIL} - AUTHENTIK_BOOTSTRAP_USERNAME=${AUTHENTIK_BOOTSTRAP_USERNAME} - AUTHENTIK_BOOTSTRAP_TOKEN=${AUTHENTIK_BOOTSTRAP_TOKEN} volumes: - ${AUTHENTIK_DATA_VOLUME_PATH}:/data networks: - traefik deploy: replicas: 1 restart_policy: condition: on-failure labels: - "traefik.enable=true" - "traefik.http.routers.authentik.rule=Host(`${AUTHENTIK_DOMAIN}`)" - "traefik.http.routers.authentik.entrypoints=websecure" - "traefik.http.routers.authentik.tls.certresolver=letsencrypt" - "traefik.http.services.authentik.loadbalancer.server.port=${AUTHENTIK_PORT}" authentik-worker: image: ${AUTHENTIK_IMAGE} restart: always command: worker depends_on: - authentik-db - authentik-redis environment: - AUTHENTIK_POSTGRESQL__HOST=${AUTHENTIK_POSTGRESQL__HOST} - AUTHENTIK_POSTGRESQL__PORT=${AUTHENTIK_POSTGRESQL__PORT} - AUTHENTIK_POSTGRESQL__NAME=${AUTHENTIK_POSTGRESQL__NAME} - AUTHENTIK_POSTGRESQL__USER=${AUTHENTIK_POSTGRESQL__USER} - AUTHENTIK_POSTGRESQL__PASSWORD=${AUTHENTIK_POSTGRESQL__PASSWORD} - AUTHENTIK_REDIS__HOST=${AUTHENTIK_REDIS__HOST} - AUTHENTIK_REDIS__PORT=${AUTHENTIK_REDIS__PORT} - AUTHENTIK_SECRET_KEY=${AUTHENTIK_SECRET_KEY} - AUTHENTIK_ERROR_REPORTING__ENABLED=${AUTHENTIK_ERROR_REPORTING__ENABLED} - AUTHENTIK_LOG_LEVEL=${AUTHENTIK_LOG_LEVEL} - AUTHENTIK_WEB__TRUSTED_PROXIES=${AUTHENTIK_WEB__TRUSTED_PROXIES} - AUTHENTIK_LISTEN__HTTP=${AUTHENTIK_LISTEN__HTTP} - AUTHENTIK_LISTEN__HTTPS=${AUTHENTIK_LISTEN__HTTPS} - AUTHENTIK_BOOTSTRAP_PASSWORD=${AUTHENTIK_BOOTSTRAP_PASSWORD} - AUTHENTIK_BOOTSTRAP_EMAIL=${AUTHENTIK_BOOTSTRAP_EMAIL} - AUTHENTIK_BOOTSTRAP_USERNAME=${AUTHENTIK_BOOTSTRAP_USERNAME} - AUTHENTIK_BOOTSTRAP_TOKEN=${AUTHENTIK_BOOTSTRAP_TOKEN} volumes: - ${AUTHENTIK_DATA_VOLUME_PATH}:/data networks: - traefik deploy: replicas: 1 restart_policy: condition: on-failure networks: traefik: external: true |
Сохраните этот файл Authentik SSO как docker-compose.yml. Далее — файл .env для хранения чувствительных переменных. Можно использовать пример ниже, заменив значения на свои.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Database Configuration POSTGRES_USER=authentik POSTGRES_PASSWORD=your_secure_postgres_password_here POSTGRES_DB=authentik # Authentik PostgreSQL Connection AUTHENTIK_POSTGRESQL__HOST=authentik-db AUTHENTIK_POSTGRESQL__PORT=5432 AUTHENTIK_POSTGRESQL__NAME=authentik AUTHENTIK_POSTGRESQL__USER=authentik AUTHENTIK_POSTGRESQL__PASSWORD=your_secure_postgres_password_here # Authentik Redis Connection AUTHENTIK_REDIS__HOST=authentik-redis AUTHENTIK_REDIS__PORT=6379 # Authentik Configuration AUTHENTIK_SECRET_KEY=your_very_long_random_secret_key_at_least_50_characters_long AUTHENTIK_ERROR_REPORTING__ENABLED=false AUTHENTIK_LOG_LEVEL=info # Reverse Proxy Configuration AUTHENTIK_WEB__TRUSTED_PROXIES=* AUTHENTIK_LISTEN__HTTP=0.0.0.0:9000 AUTHENTIK_LISTEN__HTTPS=0.0.0.0:9443 AUTHENTIK_BOOTSTRAP_PASSWORD=your_initial_admin_password <a class="__cf_email__" href="https://www.virtualizationhowto.com/cdn-cgi/l/email-protection" target="_blank" rel="nofollow noopener" data-cfemail="4b0a1e1f030e051f0200140904041f181f190a1b140e060a0207762a2f2622250b32243e392f24262a222565282426">[email protected]</a> AUTHENTIK_BOOTSTRAP_USERNAME=admin AUTHENTIK_BOOTSTRAP_TOKEN=your_bootstrap_token_here # Container Image Version AUTHENTIK_IMAGE=ghcr.io/goauthentik/server:2025.8.1 # Volume Paths AUTHENTIK_DB_VOLUME_PATH=/your/path/to/authentik/database AUTHENTIK_REDIS_VOLUME_PATH=/your/path/to/authentik/redis AUTHENTIK_DATA_VOLUME_PATH=/your/path/to/authentik/data # Traefik Configuration AUTHENTIK_DOMAIN=auth.yourdomain.com AUTHENTIK_PORT=9000 |
Сохраните второй файл как .env. Затем выполните docker compose up -d. Через минуту Authentik должен запуститься на порту 9000 (HTTP) на бэкенде. Далее Traefik, используя метки, выпустит корректный SSL-сертификат для защиты соединения с контейнером Authentik.
Первичная настройка
Так как заданы начальные bootstrap-учётные данные, остаётся перейти по URL сервера с использованием домена, проксируемого через Traefik (или другой реверс-прокси), и войти с этими параметрами.
Появится своего рода «мастер» настройки, предлагающий создать первое приложение. При необходимости шаг можно пропустить и перейти в dashboard.
В Authentik представлен современный дашборд, предоставляющий обзор состояния SSO-окружения.
При переходе на дашборд отображаются следующие элементы:
- Состояние системы
- Версия
- Рабочие процессы (Workers)
При корректной работе все индикаторы отображаются зелёными галочками.
Добавлять реверс-прокси или нет
Реверс-прокси с Authentik не является обязательным, но требуется в случаях публикации сервиса в Интернет или при необходимости аккуратной, зашифрованной связи с использованием сертификата доверенного центра сертификации.
В качестве примера выше приведена конфигурация с Traefik. Для акцентирования настроек, включающих интеграцию с реверс-прокси, используется следующий фрагмент в docker-compose:
|
1 2 3 4 5 |
labels: - "traefik.enable=true" - "traefik.http.routers.authentik.rule=Host(`auth.mydomain.com`)" - "traefik.http.routers.authentik.entrypoints=websecure" - "traefik.http.routers.authentik.tls.certresolver=myresolver" |
Далее в переменных окружения присутствуют параметры, связанные с реверс-прокси:
|
1 2 3 |
- AUTHENTIK_WEB__TRUSTED_PROXIES=${AUTHENTIK_WEB__TRUSTED_PROXIES} - AUTHENTIK_LISTEN__HTTP=${AUTHENTIK_LISTEN__HTTP} - AUTHENTIK_LISTEN__HTTPS=${AUTHENTIK_LISTEN__HTTPS} |
Без реверс-прокси доступ предоставляется по открытому адресу http://ip:9000. После добавления Traefik или другого реверс-прокси доступ к Authentik осуществляется по адресу https://auth.mydomain.com с автоматически выпущенным сертификатом Let’s Encrypt. Удобно.
Подключение федеративного или социального источника входа
Возможности Authentik становятся особенно заметны при переходе в меню Users и добавлении федеративного или социального источника входа. Представлен обширный список поддерживаемых провайдеров. На скриншоте ниже показан список, включая:
- Apple OAuth
- Discord
- Entra ID
- GitHub OAuth
- GitLab OAuth
- Google OAuth
- Kerberos source
- LDAP source
- Okta
- …и другие

Терминология и рабочий процесс
У различных приложений и провайдеров SSO схожие процессы, но терминология может отличаться. В Authentik важно знать следующие термины:
- Provider — это конечная точка протокола, с которой взаимодействует внешнее приложение (например, Portainer, GitLab, Grafana и т. д.). Это «сторона Authentik» в рукопожатии. Провайдер может быть OIDC, SAML, LDAP или другим, в зависимости от поддержки целевого приложения
- Application — это логическая группа в Authentik, объединяющая один или несколько провайдеров. Здесь настраиваются брендирование (логотип/URL, на который пользователи кликают в дашборде Authentik) и привязки политик. Это настраиваемый портал запуска для пользователей.
Последовательность действий:
- Создать провайдера (OIDC или SAML, в зависимости от приложения)
- Приложения вроде Portainer и GitLab поддерживают OIDC, поэтому в Authentik нужно создать OIDC-провайдера
- Создать Application, указывающее на данного провайдера
- Application — это «дружественная плитка», по которой пользователи кликают в дашборде Authentik
- Здесь также можно задать политики (например, требовать MFA для GitLab, но не для Grafana)
- Настроить само приложение на использование созданного провайдера Authentik. Необходимо скопировать из Authentik значения client ID, secret, issuer URL и т. п. в настройки приложения.
Ниже приведена обзорная схема потока авторизации от Authentik:
Не стоит откладывать внедрение SSO
Иногда может казаться, что SSO в домашней лаборатории — просто «приятное дополнение». На практике, при публикации сервисов через реверс-прокси, туннели Cloudflare или проброс портов, необходим надёжный слой аутентификации. С Authentik можно реализовать MFA, политики паролей и уменьшить слабые места в аутентификации.
Итоги
Authentik производит впечатление решения корпоративного класса с ожидаемой «полировкой» — при этом бесплатно. С Docker-Compose его развёртывание несложно, а набор функций и возможностей делает систему обязательной для домашней лаборатории. Решение интегрируется с большинством самохостимых сервисов и обеспечивает уверенность в защищённости аутентификации. Используется ли Authentik или иной SSO-провайдер — этот вопрос открыт для обсуждения в комментариях.




