Установка Authentik на Ubuntu 24.04 и интеграция с FreeIPA

В современной IT-инфраструктуре количество сервисов растет лавинообразно. Почта, баг-трекеры, CI/CD системы, внутренние порталы — и для каждого нужен свой логин и пароль. Сегодня я поделюсь опытом внедрения единой точки входа на базе Authentik и его интеграции с уже существующим каталогом пользователей FreeIPA.

Authentik — это мощная открытая платформа для управления идентификацией и авторизацией (IAM). Если говорить проще, это Single Sign-On (SSO) решение, которое позволяет навести порядок с доступами и сделать жизнь пользователей (и администраторов) гораздо проще.

Почему Authentik и какие задачи он решает?

  1. Single Sign-On (SSO): Пользователь авторизуется один раз и получает доступ ко всем разрешенным корпоративным сервисам без повторного ввода пароля. Поддерживаются протоколы SAML, OAuth2, OpenID Connect и LDAP.
  2. Многофакторная аутентификация (MFA): Централизованное внедрение 2FA (TOTP, WebAuthn, SMS) для всех сервисов сразу, даже если само приложение этого изначально не умеет.
  3. Управление доступом (RBAC/ABAC): Гибкая настройка политик — кто, куда и при каких условиях имеет доступ.
  4. Федерация идентификации: Возможность подключать внешних провайдеров (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 с IP 10.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 с каталогом пользователей.

  1. Авторизуйтесь в панели администратора Authentik.
  2. Перейдите в раздел 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) и проверка правил локального файрвола.

Оставайтесь на линии. 🚀