From bb1e20c0e9f1b3843e47c3b8064f314fc38b508c Mon Sep 17 00:00:00 2001 From: zailon Date: Wed, 20 May 2026 15:17:23 +0500 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20docs/services/lxc208-manage/authentik.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/services/lxc208-manage/authentik.md | 487 +++++++++++++++++++++++ 1 file changed, 487 insertions(+) create mode 100644 docs/services/lxc208-manage/authentik.md diff --git a/docs/services/lxc208-manage/authentik.md b/docs/services/lxc208-manage/authentik.md new file mode 100644 index 0000000..a089936 --- /dev/null +++ b/docs/services/lxc208-manage/authentik.md @@ -0,0 +1,487 @@ +# Authentik — единая система аутентификации + +## Обзор + +**Authentik** — это open-source платформа для управления идентификацией и доступом (IAM). Позволяет организовать единый вход (SSO) для всех сервисов на сервере Olimp. + +**Расположение:** LXC 208 (manage) +**Домен:** https://cerberus.zailon.ru +**Порт:** 45133 (внутренний), HTTPS через NPM + +--- + +## Установка + +### 1. Подготовка директории + +```bash +cd /mnt +mkdir authentik +cd authentik +``` + +Переход в директорию /mnt, создание папки authentik и переход в неё + +### 2. Создание файла окружения + +```bash +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 конфигурация + +```yaml +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. Запуск + +```bash +sudo docker compose up -d +``` + +Запуск контейнеров в фоновом режиме + +```bash +sudo docker ps | grep authentik +``` + +Проверка статуса контейнеров + +--- + +## Первоначальная настройка + +### 1. Создание администратора + +Подождите 30-60 секунд после запуска, затем откройте: + +```text +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. После создания нажмите на пользователя → вкладка **Password** → **Set 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** + +```nginx +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; +} +``` + +4. **Save** + +--- + +## Проверка работы + +### Тест входа + +1. Откройте **инкогнито-вкладку** браузера +2. Перейдите на `https://wiki.zailon.ru` +3. Должен произойти редирект на `https://cerberus.zailon.ru/if/flow/...` +4. Введите логин/пароль пользователя (например, `zevs`) +5. После входа — возврат в Kiwix + +--- + +## Полезные команды + +```bash +cd /mnt/authentik +sudo docker compose restart +``` + +Перезапуск всех сервисов Authentik + +```bash +sudo docker logs authentik-server --tail 50 +``` + +Просмотр последних 50 строк логов сервера + +```bash +sudo docker logs authentik-worker --tail 50 +``` + +Просмотр последних 50 строк логов worker + +```bash +sudo docker ps | grep authentik +``` + +Проверка статуса контейнеров + +```bash +sudo docker exec -it authentik-postgres psql -U authentik -d authentik +``` + +Вход в PostgreSQL контейнер + +```bash +\du +``` + +Список пользователей базы данных (выполнять внутри psql) + +```bash +\q +``` + +Выход из psql + +--- + +## Решение проблем + +### Ошибка 500 в NPM + +**Симптомы:** При входе на защищённый сервис появляется `500 Internal Server Error` + +**Проверка логов:** + +```bash +sudo docker logs nginx-proxy-manager 2>&1 | tail -30 +``` + +Просмотр последних ошибок NPM + +### Outpost не отвечает + +```bash +curl -I http://192.168.1.208:45133/outpost.goauthentik.io/auth/nginx +``` + +Проверка доступности встроенного Outpost. Ожидаемый ответ: 401 Unauthorized или 404 Not Found + +### Сброс пароля администратора + +```bash +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. **Регулярное обновление:** + ```bash + cd /mnt/authentik + sudo docker compose pull + sudo docker compose up -d + ``` + +2. **Резервное копирование:** + ```bash + sudo docker compose down + tar -czf authentik-backup-$(date +%Y%m%d).tar.gz /mnt/authentik + sudo docker compose up -d + ``` + +3. **Мониторинг логов:** + ```bash + sudo docker logs authentik-server --follow + ``` + +4. **Проверка здоровья:** + ```bash + 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 + +```bash +cd /mnt/authentik +sudo docker compose pull +sudo docker compose down +sudo docker compose up -d +``` + +Полное обновление образов контейнеров с пересозданием + +```bash +sudo docker image prune -f +``` + +Удаление старых образов после обновления + +--- \ No newline at end of file