Установка Authentik на Ubuntu 24.04 и интеграция с FreeIPA
В современной IT-инфраструктуре количество сервисов растет лавинообразно. Почта, баг-трекеры, CI/CD системы, внутренние порталы — и для каждого нужен свой логин и пароль. Сегодня я поделюсь опытом внедрения единой точки входа на базе Authentik и его интеграции с уже существующим каталогом пользователей FreeIPA.
Authentik — это мощная открытая платформа для управления идентификацией и авторизацией (IAM). Если говорить проще, это Single Sign-On (SSO) решение, которое позволяет навести порядок с доступами и сделать жизнь пользователей (и администраторов) гораздо проще.
Почему Authentik и какие задачи он решает?
- Single Sign-On (SSO): Пользователь авторизуется один раз и получает доступ ко всем разрешенным корпоративным сервисам без повторного ввода пароля. Поддерживаются протоколы SAML, OAuth2, OpenID Connect и LDAP.
- Многофакторная аутентификация (MFA): Централизованное внедрение 2FA (TOTP, WebAuthn, SMS) для всех сервисов сразу, даже если само приложение этого изначально не умеет.
- Управление доступом (RBAC/ABAC): Гибкая настройка политик — кто, куда и при каких условиях имеет доступ.
- Федерация идентификации: Возможность подключать внешних провайдеров (Google, GitHub, Active Directory, FreeIPA).
Чем это удобно в корпоративной среде? Для пользователей это означает меньше паролей в голове и снижение «усталости от паролей» (password fatigue), плюс удобный портал самообслуживания. Для администраторов и ИБ — это единая точка онбординга и оффбординга. Отключили учетку в связанном LDAP (FreeIPA) — доступ мгновенно пропал ко всем сервисам. Все логи авторизации при этом хранятся в одном месте, что сильно упрощает аудит.
Подготовка окружения
Перед тем как приступить к установке, убедитесь, что ваше окружение соответствует следующим требованиям:
- ОС: Ubuntu 24.04 LTS (хотя инструкция подойдет и для других Linux-дистрибутивов).
- Docker: Установленные Docker и Docker Compose (v2).
- Ресурсы: Рекомендуется минимум 2 ядра CPU и 4 ГБ RAM.
- Инфраструктура: Развернутая FreeIPA (в нашем примере хост
idm.homelab.lanс IP10.0.0.27). - Сеть: Настроенная DNS-запись для домена, на котором будет висеть SSO (в примере —
sso.homelab.com). - Утилиты: Наличие
opensslдля генерации безопасных паролей.
Предупреждение: Все команды ниже выполняются от пользователя
rootили черезsudo. Создайте рабочую директорию, в которой будут храниться все конфигурации и данные:
mkdir -p /opt/authentik
cd /opt/authentik
Docker Compose Конфигурация
В отличие от стандартного файла из официальной документации, мы внесем несколько важных изменений для интеграции с нашей инфраструктурой. Создайте файл docker-compose.yml:
services:
postgresql:
image: postgres:16-alpine
container_name: authentik-postgres
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
start_period: 20s
interval: 30s
retries: 5
timeout: 5s
volumes:
- database:/var/lib/postgresql/data
env_file:
- .env
environment:
POSTGRES_PASSWORD: ${PG_PASS:?database password required}
POSTGRES_USER: ${PG_USER:-authentik}
POSTGRES_DB: ${PG_DB:-authentik}
networks:
- authentik-network
server:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.12.3}
container_name: authentik-server
hostname: authentik-server
restart: unless-stopped
command: server
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
volumes:
- ./data:/data
- ./custom-templates:/templates
env_file:
- .env
ports:
- "${COMPOSE_PORT_HTTP:-9000}:9000"
- "${COMPOSE_PORT_HTTPS:-9443}:9443"
depends_on:
postgresql:
condition: service_healthy
extra_hosts:
- "idm.homelab.lan:10.0.0.27"
networks:
- authentik-network
worker:
image: ${AUTHENTIK_IMAGE:-ghcr.io/goauthentik/server}:${AUTHENTIK_TAG:-2025.12.3}
container_name: authentik-worker
hostname: authentik-worker
restart: unless-stopped
command: worker
environment:
AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
AUTHENTIK_POSTGRESQL__HOST: postgresql
AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
AUTHENTIK_POSTGRESQL__NAME: ${PG_DB:-authentik}
AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
user: root
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/data
- ./custom-templates:/templates
- ./certs:/certs
env_file:
- .env
depends_on:
postgresql:
condition: service_healthy
extra_hosts:
- "idm.homelab.lan:10.0.0.27"
networks:
- authentik-network
volumes:
database:
driver: local
networks:
authentik-network:
driver: bridge
Разбор конфигурации:
- container_name: Добавлены статические имена контейнерам для удобства управления и чтения логов.
- extra_hosts: Строка
"idm.homelab.lan:10.0.0.27"обеспечивает резолв локального домена FreeIPA внутри контейнера. Это критично важно, если локальный DNS не настроен глобально. - volumes (worker): Проброс папки
./certs:/certsнеобходим для передачи SSL-сертификата от FreeIPA (без него LDAPS работать не будет). - networks: Все сервисы объединены в единую сеть
authentik-networkдля удобного подключения реверс-прокси Nginx в дальнейшем.
Настройка переменных окружения
Для безопасной работы баз данных и шифрования сессий нам понадобятся надежные пароли. Сгенерируем их на лету и запишем в файл .env в директории /opt/authentik:
echo "PG_PASS=$(openssl rand -base64 36)" >> .env
echo "AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60)" >> .env
echo "COMPOSE_PORT_HTTP=9000" >> .env
echo "COMPOSE_PORT_HTTPS=9443" >> .env
echo "AUTHENTIK_ERROR_REPORTING__ENABLED=true" >> .env
Здесь же вы можете добавить переменные для настройки SMTP, чтобы Authentik мог отправлять email-уведомления (например, для сброса паролей).
Запуск Authentik и подготовка сертификатов
Запускаем наши контейнеры в фоновом режиме:
docker compose pull
docker compose up -d
Пока система поднимается (можете проверить логи через docker compose logs -f), нам нужно решить вопрос с доверием к сертификату FreeIPA.
FreeIPA при установке автоматически генерирует собственный корневой (CA) сертификат. Он необходим Authentik для безопасного подключения по протоколу LDAPS (LDAP over SSL). Если его не добавить, соединение будет сбрасываться с ошибкой верификации.
Создадим директорию и скачаем сертификат с сервера FreeIPA:
mkdir -p /opt/authentik/certs
curl -o /opt/authentik/certs/ipa-ca.crt http://idm.homelab.lan/ipa/config/ca.crt
Убедитесь, что файл скачался корректно (обычно он весит около 1.6K). Поскольку мы уже прописали монтирование ./certs:/certs в docker-compose.yml, контейнер worker получит к нему доступ автоматически.
Теперь перейдите в браузере по адресу http://<IP_вашего_сервера>:9000/if/flow/initial-setup/ (обязательно со слешем на конце). Система попросит задать сложный пароль для администратора akadmin.
Интеграция с FreeIPA (Настройка LDAP Source)
База готова, теперь свяжем Authentik с каталогом пользователей.
- Авторизуйтесь в панели администратора Authentik.
- Перейдите в раздел Directory -> Federation and Social login -> Create -> LDAP Source.
Заполните настройки следующим образом:
Основные настройки (General):
- Name:
FreeIPA - Slug:
freeipa - Sync users / Sync groups: Включите оба пункта (
Да). - User password writeback:
Да(Позволяет пользователям менять пароль FreeIPA прямо через интерфейс Authentik). - Delete Not Found Objects:
Нет(В целях безопасности лучше не удалять объекты автоматически).
Настройки подключения (Connection):
- Server URI:
ldaps://idm.homelab.lan(Используем защищенный протокол). - Enable StartTLS:
Нет. - TLS Verification Certificate: Выберите из выпадающего списка загруженный ранее файл
ipa-ca.crt. - Bind CN:
uid=authentik,cn=users,cn=accounts,dc=homelab,dc=lan(Здесь используется сервисная учетка. Как её создать — я описывал в статье про установку FreeIPA). - Bind Password: Пароль от сервисной учетки.
- Base DN:
dc=homelab,dc=lan
Маппинг атрибутов и фильтры:
- User Property Mappings: выберите
mail,Name,cn,uid. - Group Property Mappings: выберите
cn. - User path:
goauthentik.io/sources/%{slug}s - Additional User DN:
cn=users,cn=accounts - Additional Group DN:
cn=groups,cn=accounts - User object filter:
(objectClass=person) - Group object filter:
(objectClass=groupOfNames) - Group membership field:
memberOf - User membership attribute:
distinguishedName - Lookup using user attribute:
Да - Object uniqueness field:
ipaUniqueID
Сохраните источник, перейдите на его вкладку и нажмите Sync. В логах (или в разделе Users) вы должны увидеть, как пользователи и группы из FreeIPA подтягиваются в систему.
Настройка Nginx и SSL (acme.sh) для Production
Для полноценной работы (особенно WebAuthn и безопасных cookie) Authentik должен работать по HTTPS с валидным сертификатом. Настроим легковесный Nginx и автоматический выпуск сертификатов Let’s Encrypt.
Сначала установим acme.sh и выпустим сертификат для нашего домена sso.homelab.com (потребуется свободный порт 8443):
curl https://get.acme.sh | sh -s email=your@email.com
source ~/.bashrc
mkdir -p /opt/authentik/nginx
acme.sh --issue --standalone -d 'sso.homelab.com' \
--key-file /opt/authentik/nginx/privkey.key \
--fullchain-file /opt/authentik/nginx/fullchain.pem \
--alpn --tlsport 8443
Создадим отдельный docker-compose.yaml для Nginx в папке /opt/authentik/nginx:
services:
nginx:
image: nginx:1.29.5-alpine
container_name: nginx
hostname: nginx
volumes:
- /opt/authentik/nginx:/etc/nginx/conf.d:ro
restart: always
ports:
- '0.0.0.0:443:443'
- '0.0.0.0:80:80'
networks:
- authentik-network
networks:
authentik-network:
name: authentik-network
driver: bridge
external: true # Подключаемся к сети, которую создал Authentik
И добавим конфигурацию виртуального хоста /opt/authentik/nginx/default.conf:
upstream authentik {
server authentik-server:9000;
}
server {
listen 80;
server_name sso.homelab.com;
return 301 https://$host$request_uri;
}
server {
server_name sso.homelab.com;
listen 443 ssl reuseport;
listen [::]:443 ssl reuseport;
http2 on;
location / {
proxy_http_version 1.1;
proxy_pass http://authentik;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# Безопасные настройки SSL (Mozilla Intermediate)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_certificate "/etc/nginx/conf.d/fullchain.pem";
ssl_certificate_key "/etc/nginx/conf.d/privkey.key";
ssl_trusted_certificate "/etc/nginx/conf.d/fullchain.pem";
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 valid=60s;
resolver_timeout 2s;
# Gzip сжатие
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_types application/json text/css text/javascript application/javascript text/plain text/xml image/svg+xml;
}
Запускаем реверс-прокси:
cd /opt/authentik/nginx
docker compose up -d
Подведение итогов
Всё готово! Теперь ваш инстанс Authentik безопасно работает по адресу https://sso.homelab.com. Весь HTTP-трафик перенаправляется на HTTPS, а база пользователей надежно синхронизируется с FreeIPA по защищенному протоколу LDAPS.
Эта связка — отличный, масштабируемый фундамент для построения надежной корпоративной системы управления доступом. Вы можете постепенно подключать к ней ваши внутренние сервисы (Nextcloud, GitLab, Proxmox и другие) по OIDC или SAML.
Если что-то пошло не так, первый шаг к диагностике — это логи контейнеров (docker compose logs -f) и проверка правил локального файрвола.
Оставайтесь на линии. 🚀
