Добавить docs/services/lxc208-manage/authentik.md

This commit is contained in:
zailon 2026-05-20 15:17:23 +05:00
parent 1b23b3a2c5
commit bb1e20c0e9

View File

@ -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
```
Удаление старых образов после обновления
---