Добавить docs/services/lxc208-manage/authentik.md
This commit is contained in:
parent
1b23b3a2c5
commit
bb1e20c0e9
487
docs/services/lxc208-manage/authentik.md
Normal file
487
docs/services/lxc208-manage/authentik.md
Normal 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
|
||||||
|
```
|
||||||
|
|
||||||
|
Удаление старых образов после обновления
|
||||||
|
|
||||||
|
---
|
||||||
Loading…
Reference in New Issue
Block a user