Добавить 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