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

487 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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