Docs/docs/services/lxc208-manage/authentik.md

14 KiB
Raw Blame History

Authentik — единая система аутентификации

Обзор

Authentik — это open-source платформа для управления идентификацией и доступом (IAM). Позволяет организовать единый вход (SSO) для всех сервисов на сервере Olimp.

Расположение: LXC 208 (manage)
Домен: https://cerberus.zailon.ru
Порт: 45133 (внутренний), HTTPS через NPM


Установка

1. Подготовка директории

cd /mnt
mkdir authentik
cd authentik

Переход в директорию /mnt, создание папки authentik и переход в неё

2. Создание файла окружения

cat > .env << 'EOF'
PG_USER=authentik
PG_PASS=$(openssl rand -base64 32)
PG_DB=authentik
AUTHENTIK_SECRET_KEY=$(openssl rand -base64 60)
EOF

Создание файла .env с переменными окружения. Пароли генерируются автоматически через openssl

3. Docker Compose конфигурация

services:
  postgresql:
    image: docker.io/library/postgres:16-alpine
    container_name: authentik-postgres
    restart: unless-stopped
    env_file:
      - .env
    environment:
      POSTGRES_DB: ${PG_DB:-authentik}
      POSTGRES_PASSWORD: ${PG_PASS:?database password required}
      POSTGRES_USER: ${PG_USER:-authentik}
    healthcheck:
      interval: 30s
      retries: 5
      start_period: 20s
      test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
      timeout: 5s
    volumes:
      - /mnt/authentik/postgres:/var/lib/postgresql/data
    networks:
      - authentik

  redis:
    image: docker.io/library/redis:7-alpine
    container_name: authentik-redis
    restart: unless-stopped
    command: --save 60 1 --loglevel warning
    healthcheck:
      test: ["CMD-SHELL", "redis-cli ping | grep PONG"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - /mnt/authentik/redis:/data
    networks:
      - authentik

  server:
    image: ghcr.io/goauthentik/server:2026.2.3
    container_name: authentik-server
    command: server
    restart: unless-stopped
    env_file:
      - .env
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
      AUTHENTIK_POSTGRESQL__DB: ${PG_DB:-authentik}
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
    ports:
      - "0.0.0.0:45133:9000"
    shm_size: 512mb
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - /mnt/authentik/data:/data
      - /mnt/authentik/custom-templates:/templates
    networks:
      - authentik

  worker:
    image: ghcr.io/goauthentik/server:2026.2.3
    container_name: authentik-worker
    command: worker
    restart: unless-stopped
    env_file:
      - .env
    environment:
      AUTHENTIK_REDIS__HOST: redis
      AUTHENTIK_POSTGRESQL__HOST: postgresql
      AUTHENTIK_POSTGRESQL__USER: ${PG_USER:-authentik}
      AUTHENTIK_POSTGRESQL__PASSWORD: ${PG_PASS}
      AUTHENTIK_POSTGRESQL__DB: ${PG_DB:-authentik}
      AUTHENTIK_SECRET_KEY: ${AUTHENTIK_SECRET_KEY:?secret key required}
    shm_size: 512mb
    depends_on:
      postgresql:
        condition: service_healthy
      redis:
        condition: service_healthy
    volumes:
      - /mnt/authentik/data:/data
      - /mnt/authentik/certs:/certs
      - /mnt/authentik/custom-templates:/templates
    networks:
      - authentik

networks:
  authentik:
    driver: bridge

Конфигурация docker-compose с четырьмя сервисами: PostgreSQL, Redis, Authentik Server и Worker

4. Запуск

sudo docker compose up -d

Запуск контейнеров в фоновом режиме

sudo docker ps | grep authentik

Проверка статуса контейнеров


Первоначальная настройка

1. Создание администратора

Подождите 30-60 секунд после запуска, затем откройте:

http://192.168.1.208:45133/if/flow/initial-setup/

Создайте первого пользователя:

  • Username: zailon (или другой)
  • Email: ваш email
  • Password: надёжный пароль

2. Настройка Nginx Proxy Manager (NPM)

  1. Откройте NPM: http://192.168.1.201:81
  2. Add Proxy Host:
    • Domain Names: cerberus.zailon.ru
    • Scheme: http
    • Forward Hostname: 192.168.1.208
    • Forward Port: 45133
  3. Вкладка SSL:
    • SSL Certificate: Request a new SSL Certificate
    • Force SSL:
    • HTTP/2 Support:
    • Let's Encrypt Email: ваш email
  4. Save

Теперь доступен по: https://cerberus.zailon.ru


Создание пользователей

1. Создание обычного пользователя

  1. Войдите в Authentik как администратор
  2. Directory → Users → Create
  3. Заполните:
    • Username: zevs (логин для входа)
    • Display Name: Admin Olimp (отображаемое имя)
    • Email: zevs@zailon.ru
    • Тип пользователя: Внутренний (Internal)
    • Active:
    • Path: users
  4. Create
  5. После создания нажмите на пользователя → вкладка PasswordSet Password
  6. Установите пароль

2. Права доступа

По умолчанию новые пользователи не являются суперпользователями и имеют доступ только к тем приложениям, которые вы им явно предоставите.


Настройка Proxy Provider

Шаг 1: Создание Proxy Provider

  1. Applications → Providers → Create
  2. Выберите Proxy Provider
  3. Заполните:
    • Provider Name: Kiwix
    • Authorization flow: default-provider-authorization-explicit-consent (Authorize Application)
    • Внешний хост: https://kiwix.zailon.ru
    • Внутренний хост: http://192.168.1.202:45134
  4. Create

Важно: Используйте flow explicit-consent — он стабильнее работает с встроенным Outpost.

Шаг 2: Создание Application

  1. Applications → Applications → Create
  2. Заполните:
    • Name: Kiwix
    • Provider: выберите созданный Kiwix
  3. Create

Шаг 3: Привязка к Outpost

  1. Каталог → Внешние компоненты
  2. Нажмите на карандаш у authentik Embedded Outpost
  3. В разделе Providers выберите Kiwix
  4. Save

Интеграция с Nginx Proxy Manager

Конфигурация NPM для защищённого сервиса

  1. Откройте NPM: http://192.168.1.201:81
  2. Найдите Proxy host для wiki.zailon.ru (или создайте новый)
  3. Edit → вкладка Custom Nginx Configuration
proxy_buffers 8 16k;
proxy_buffer_size 32k;
port_in_redirect off;

location / {
    proxy_pass $forward_scheme://$server:$port;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $http_connection;
    proxy_http_version 1.1;

    auth_request     /outpost.goauthentik.io/auth/nginx;
    error_page       401 = @goauthentik_proxy_signin;
    auth_request_set $auth_cookie $upstream_http_set_cookie;
    add_header       Set-Cookie $auth_cookie;

    auth_request_set $authentik_username $upstream_http_x_authentik_username;
    auth_request_set $authentik_groups $upstream_http_x_authentik_groups;
    auth_request_set $authentik_entitlements $upstream_http_x_authentik_entitlements;
    auth_request_set $authentik_email $upstream_http_x_authentik_email;
    auth_request_set $authentik_name $upstream_http_x_authentik_name;
    auth_request_set $authentik_uid $upstream_http_x_authentik_uid;

    proxy_set_header X-authentik-username $authentik_username;
    proxy_set_header X-authentik-groups $authentik_groups;
    proxy_set_header X-authentik-entitlements $authentik_entitlements;
    proxy_set_header X-authentik-email $authentik_email;
    proxy_set_header X-authentik-name $authentik_name;
    proxy_set_header X-authentik-uid $authentik_uid;
}

location /outpost.goauthentik.io {
    auth_request off;
    proxy_pass http://192.168.1.208:45133/outpost.goauthentik.io;
    proxy_set_header Host $host;
    proxy_set_header X-Original-URL $scheme://$http_host$request_uri;
    add_header Set-Cookie $auth_cookie;
    auth_request_set $auth_cookie $upstream_http_set_cookie;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
}

location @goauthentik_proxy_signin {
    internal;
    add_header Set-Cookie $auth_cookie;
    return 302 /outpost.goauthentik.io/start?rd=$scheme://$http_host$request_uri;
}
  1. Save

Проверка работы

Тест входа

  1. Откройте инкогнито-вкладку браузера
  2. Перейдите на https://wiki.zailon.ru
  3. Должен произойти редирект на https://cerberus.zailon.ru/if/flow/...
  4. Введите логин/пароль пользователя (например, zevs)
  5. После входа — возврат в Kiwix

Полезные команды

cd /mnt/authentik
sudo docker compose restart

Перезапуск всех сервисов Authentik

sudo docker logs authentik-server --tail 50

Просмотр последних 50 строк логов сервера

sudo docker logs authentik-worker --tail 50

Просмотр последних 50 строк логов worker

sudo docker ps | grep authentik

Проверка статуса контейнеров

sudo docker exec -it authentik-postgres psql -U authentik -d authentik

Вход в PostgreSQL контейнер

\du

Список пользователей базы данных (выполнять внутри psql)

\q

Выход из psql


Решение проблем

Ошибка 500 в NPM

Симптомы: При входе на защищённый сервис появляется 500 Internal Server Error

Проверка логов:

sudo docker logs nginx-proxy-manager 2>&1 | tail -30

Просмотр последних ошибок NPM

Outpost не отвечает

curl -I http://192.168.1.208:45133/outpost.goauthentik.io/auth/nginx

Проверка доступности встроенного Outpost. Ожидаемый ответ: 401 Unauthorized или 404 Not Found

Сброс пароля администратора

sudo docker exec -it authentik-server python manage.py shell -c "
from authentik.core.models import User
from django.contrib.auth.hashers import make_password
user = User.objects.get(username='zailon')
user.password = make_password('NewPassword123!')
user.is_superuser = True
user.save()
print('Password updated')
"

Установка нового пароля для пользователя zailon и выдача прав суперпользователя


Безопасность

  1. Регулярное обновление:

    cd /mnt/authentik
    sudo docker compose pull
    sudo docker compose up -d
    
  2. Резервное копирование:

    sudo docker compose down
    tar -czf authentik-backup-$(date +%Y%m%d).tar.gz /mnt/authentik
    sudo docker compose up -d
    
  3. Мониторинг логов:

    sudo docker logs authentik-server --follow
    
  4. Проверка здоровья:

    sudo docker inspect --format='{{.State.Health.Status}}' authentik-server
    

Архитектура

Компоненты:

  • PostgreSQL — база данных для хранения пользователей, приложений и сессий
  • Redis — кэширование и хранение временных данных
  • Authentik Server — основной веб-интерфейс и API
  • Authentik Worker — фоновые задачи (очередь событий, задачи по расписанию)
  • Embedded Outpost — встроенный прокси для аутентификации внешних сервисов

Порт 45133: Основной порт доступа к веб-интерфейсу Authentik (проброшен из контейнера server:9000)

Сеть authentik: Изолированная Docker-сеть для взаимодействия компонентов


Интеграция с другими сервисами

OIDC Provider (для сервисов с поддержкой OAuth2/OIDC)

  1. Applications → Providers → Create
  2. Выберите OAuth2/OpenID Provider
  3. Заполните:
    • Name: Immich OIDC
    • Client ID: immich
    • Client Type: Confidential
    • Redirect URIs: https://immich.zailon.ru/auth/login
  4. Create

SAML Provider (для корпоративных приложений)

  1. Applications → Providers → Create
  2. Выберите SAML Provider
  3. Настройте метаданные и атрибуты
  4. Create

Обновление Authentik

cd /mnt/authentik
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d

Полное обновление образов контейнеров с пересозданием

sudo docker image prune -f

Удаление старых образов после обновления