diff --git a/Мой сервер/Second Mind Setup/Администрирование.md b/Мой сервер/Second Mind Setup/Администрирование.md index 4bdd05f..0457f79 100644 --- a/Мой сервер/Second Mind Setup/Администрирование.md +++ b/Мой сервер/Second Mind Setup/Администрирование.md @@ -447,4 +447,4 @@ http { } ``` -Система администрирования настроена! Для дальнейшего изучения см. [[Обзор системы]] \ No newline at end of file +Система администрирования настроена! Для дальнейшего изучения см. [[Мой сервер/Second Mind Setup/Обзор системы]] \ No newline at end of file diff --git a/Мой сервер/Second Mind Setup/Обзор системы.md b/Мой сервер/Second Mind Setup/Обзор системы.md index 0687c09..5b2c496 100644 --- a/Мой сервер/Second Mind Setup/Обзор системы.md +++ b/Мой сервер/Second Mind Setup/Обзор системы.md @@ -93,6 +93,6 @@ graph TB ## Следующие шаги Для развертывания системы изучите: -- [[Конфигурации]] - настройки всех сервисов +- [[Мой сервер/Second Mind Setup/Конфигурации]] - настройки всех сервисов - [[Развертывание]] - пошаговая инструкция установки - [[Администрирование]] - обслуживание и мониторинг \ No newline at end of file diff --git a/Мой сервер/Инфраструктура/Конфигурации.md b/Мой сервер/Инфраструктура/Конфигурации.md new file mode 100644 index 0000000..829e766 --- /dev/null +++ b/Мой сервер/Инфраструктура/Конфигурации.md @@ -0,0 +1,415 @@ +## Traefik Reverse Proxy + +### docker-compose.yml + +```yaml +version: '3.8' +services: + traefik: + image: traefik:v3.0 + container_name: traefik + command: + # API и Dashboard + - --api.dashboard=true + - --api.insecure=true + + # Docker provider + - --providers.docker=true + - --providers.docker.exposedbydefault=false + - --providers.docker.network=proxy + + # Entrypoints (порты входа) + - --entrypoints.web.address=:80 + - --entrypoints.websecure.address=:443 + - --entrypoints.ssh.address=:2222 + + # SSL сертификаты Let's Encrypt + - --certificatesresolvers.letsencrypt.acme.email=your_email@aepif.ru + - --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json + - --certificatesresolvers.letsencrypt.acme.tlschallenge=true + + # TCP routing + - --providers.docker.exposedByDefault=false + ports: + - "80:80" # HTTP + - "443:443" # HTTPS + - "8080:8080" # Dashboard + - "2222:2222" # SSH для Git + volumes: + - /var/run/docker.sock:/var/run/docker.sock:ro + - traefik_data:/data + networks: + - proxy + labels: + - traefik.enable=true + + # Dashboard маршрут + - traefik.http.routers.traefik.rule=Host(`traefik.aepif.ru`) + - traefik.http.routers.traefik.tls.certresolver=letsencrypt + - traefik.http.routers.traefik.service=api@internal + + # HTTP → HTTPS редирект + - traefik.http.routers.http-catchall.rule=hostregexp(`{host:.+}`) + - traefik.http.routers.http-catchall.entrypoints=web + - traefik.http.routers.http-catchall.middlewares=redirect-to-https + - traefik.http.middlewares.redirect-to-https.redirectscheme.scheme=https + restart: unless-stopped + +volumes: + traefik_data: + +networks: + proxy: + name: proxy + driver: bridge +``` + +### Переменные окружения (.env) + +```bash +DOMAIN=aepif.ru +ADMIN_EMAIL=epifantsev1aa@gmail.com +``` + +### Важные особенности конфигурации + +#### Entrypoints (точки входа) +- **web** (80): HTTP трафик, автоматически редиректится на HTTPS +- **websecure** (443): HTTPS трафик для веб-сервисов +- **ssh** (2222): TCP трафик для SSH доступа к Git + +#### Labels для автоматического SSL +```yaml +# Для любого сервиса добавить эти labels: +labels: + - traefik.enable=true + - traefik.http.routers.service-name.rule=Host(`subdomain.aepif.ru`) + - traefik.http.routers.service-name.tls.certresolver=letsencrypt + - traefik.http.services.service-name.loadbalancer.server.port=SERVICE_PORT +``` + +## Authelia Authentication Service + +### docker-compose.yml + +```yaml +version: '3.8' +services: + redis: + image: redis:7-alpine + container_name: auth_redis + volumes: + - redis_data:/data + networks: + - default + command: redis-server --requirepass Ll8qlQ3rgBFo4Syq + restart: unless-stopped + + authelia: + image: authelia/authelia:latest + container_name: authelia + depends_on: + - redis + volumes: + - ./authelia:/config + networks: + - default + - proxy + labels: + - traefik.enable=true + - traefik.http.routers.authelia.rule=Host(`auth.aepif.ru`) + - traefik.http.routers.authelia.tls.certresolver=letsencrypt + - traefik.http.services.authelia.loadbalancer.server.port=9091 + + # Forward Auth Middleware + - traefik.http.middlewares.authelia.forwardauth.address=http://authelia:9091/api/verify?rd=https://auth.aepif.ru + - traefik.http.middlewares.authelia.forwardauth.trustForwardHeader=true + - traefik.http.middlewares.authelia.forwardauth.authResponseHeaders=Remote-User,Remote-Groups,Remote-Name,Remote-Email + restart: unless-stopped + environment: + - TZ=Europe/Moscow + +volumes: + redis_data: + +networks: + proxy: + external: true + default: + driver: bridge +``` + +### Переменные окружения (.env) + +```bash +DOMAIN=aepif.ru +ADMIN_EMAIL=epifantsev1aa@gmail.com + +# JWT секрет для токенов +JWT_SECRET=4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA + +# Секрет для сессий +SESSION_SECRET=91Zc/PM0EogwZbsX0tsDGLpr4Wg7zwtQUzcp5tYP5dNdRNTlpkXBfJr9EivuD+A4 + +# Ключ шифрования для хранилища +STORAGE_KEY=sWLemnH0QNsYsYvbav59mQOWxLOeUvSl + +# Пароль Redis +REDIS_PASSWORD=Ll8qlQ3rgBFo4Syq + +# Пароль администратора +AUTHELIA_ADMIN_PASSWORD=Creonila1 +``` + +## Конфигурация Authelia + +### configuration.yml + +```yaml +--- +# Тема интерфейса (auto, light, dark) +theme: auto + +# JWT секрет для подписи токенов +jwt_secret: 4odTQ0TqW2Ej8m8Cm3K6Wn3VTvg09Mb2Yi4CUzuIPUsHB3fpF54+NbIAqo6+CREA + +# URL по умолчанию после входа +default_redirection_url: https://notes.aepif.ru + +# Настройки сервера +server: + host: 0.0.0.0 + port: 9091 + +# Логирование +log: + level: info + +# TOTP настройки (двухфакторная аутентификация) +totp: + issuer: aepif.ru + +# Бэкенд аутентификации +authentication_backend: + file: + path: /config/users_database.yml + +# Политики доступа +access_control: + default_policy: deny + rules: + - domain: notes.aepif.ru + policy: one_factor + - domain: git.aepif.ru + policy: bypass + - domain: webhook.aepif.ru + policy: bypass + - domain: auth.aepif.ru + policy: bypass + +# Настройки сессий +session: + name: authelia_session + domain: aepif.ru + secret: 91Zc/PM0EogwZbsX0tsDGLpr4Wg7zwtQUzcp5tYP5dNdRNTlpkXBfJr9EivuD+A4 + expiration: 1h + inactivity: 5m + redis: + host: redis + port: 6379 + password: Ll8qlQ3rgBFo4Syq + +# Защита от брутфорса +regulation: + max_retries: 3 + find_time: 2m + ban_time: 5m + +# Хранилище данных +storage: + encryption_key: sWLemnH0QNsYsYvbav59mQOWxLOeUvSl + local: + path: /config/db.sqlite3 + +# Уведомления +notifier: + filesystem: + filename: /config/notification.txt +``` + +### users_database.yml + +```yaml +--- +users: + admin: + displayname: "Administrator" + # Хешированный пароль (Argon2id) + password: "$argon2id$v=19$m=65536,t=3,p=4$iF/2ZnDiY1seRau4Vf5MHw$JbKU6i/2uhvpN0CWg73eD0lzUs7NkcHw6INCH0+YFTA" + email: epifantsev1aa@gmail.com + groups: + - admins + - users +``` + +## Middleware конфигурации + +### Использование Authelia middleware + +Для защиты сервиса через Authelia добавьте в docker-compose.yml сервиса: + +```yaml +labels: + - traefik.enable=true + - traefik.http.routers.service-name.rule=Host(`service.aepif.ru`) + - traefik.http.routers.service-name.tls.certresolver=letsencrypt + - traefik.http.routers.service-name.middlewares=authelia@docker # Защита Authelia + - traefik.http.services.service-name.loadbalancer.server.port=SERVICE_PORT +``` + +### Дополнительные middleware + +#### Rate Limiting +```yaml +# В Traefik можно добавить rate limiting +- traefik.http.middlewares.rate-limit.ratelimit.burst=100 +- traefik.http.middlewares.rate-limit.ratelimit.average=50 +``` + +#### Security Headers +```yaml +# Безопасные заголовки +- traefik.http.middlewares.security.headers.browserXssFilter=true +- traefik.http.middlewares.security.headers.contentTypeNosniff=true +- traefik.http.middlewares.security.headers.frameDeny=true +``` + +## Сетевая конфигурация + +### Сеть proxy + +Сеть `proxy` является центральной для всей инфраструктуры: + +```yaml +networks: + proxy: + name: proxy + driver: bridge + external: true # Сеть используется несколькими docker-compose файлами +``` + +### Создание сети + +```bash +# Создание внешней сети (выполнить один раз) +docker network create proxy +``` + +### Подключение сервисов + +Все сервисы, которые должны быть доступны через Traefik, подключаются к сети `proxy`: + +```yaml +services: + your-service: + # ... конфигурация сервиса + networks: + - default # Внутренняя сеть для связи с базой данных + - proxy # Внешняя сеть для Traefik +``` + +## SSL/TLS конфигурация + +### ACME настройки + +```yaml +# В команде Traefik: +- --certificatesresolvers.letsencrypt.acme.email=epifantsev1aa@gmail.com +- --certificatesresolvers.letsencrypt.acme.storage=/data/acme.json +- --certificatesresolvers.letsencrypt.acme.tlschallenge=true +``` + +### Хранение сертификатов + +Сертификаты сохраняются в `/data/acme.json` внутри контейнера, который маппится на volume `traefik_data`. + +### Автоматическое обновление + +Traefik автоматически обновляет сертификаты за 30 дней до истечения. + +## Генерация секретов + +### Создание случайных секретов + +```bash +# JWT секрет (64 символа) +openssl rand -base64 48 + +# Session секрет (64 символа) +openssl rand -base64 48 + +# Storage ключ (32 символа) +openssl rand -base64 24 + +# Redis пароль (16 символов) +openssl rand -base64 12 +``` + +### Хеширование паролей для Authelia + +```bash +# Установка authelia CLI (опционально) +docker run --rm -it authelia/authelia:latest authelia hash-password 'your-password' +``` + +## Файловая структура + +### Полная структура проектов + +``` +/DOCKER/ +├── reverse-proxy/ +│ ├── docker-compose.yml +│ ├── .env +│ └── volumes/ +│ └── traefik_data/ +│ ├── acme.json # SSL сертификаты +│ └── traefik.log # Логи Traefik +│ +├── auth/ +│ ├── docker-compose.yml +│ ├── .env +│ └── authelia/ +│ ├── configuration.yml # Основная конфигурация +│ ├── users_database.yml # База пользователей +│ ├── db.sqlite3 # SQLite база данных +│ └── notification.txt # Файл уведомлений +│ +└── second-mind/ + ├── docker-compose.yml + ├── .env + ├── nginx.conf + ├── Dockerfile + ├── webhook-server/ + ├── obsidian_repo/ + └── quartz_build/ +``` + +## Права доступа + +### Важные права файлов + +```bash +# ACME файл должен быть доступен только Traefik +chmod 600 /var/lib/docker/volumes/reverse-proxy_traefik_data/_data/acme.json + +# Конфигурационные файлы Authelia +chmod 644 /DOCKER/auth/authelia/configuration.yml +chmod 644 /DOCKER/auth/authelia/users_database.yml +chmod 600 /DOCKER/auth/.env + +# База данных SQLite +chmod 644 /DOCKER/auth/authelia/db.sqlite3 +``` + +Следующий документ: [[Инфраструктура - Развертывание]] \ No newline at end of file diff --git a/Мой сервер/Инфраструктура/Обзор системы.md b/Мой сервер/Инфраструктура/Обзор системы.md new file mode 100644 index 0000000..f4a600b --- /dev/null +++ b/Мой сервер/Инфраструктура/Обзор системы.md @@ -0,0 +1,227 @@ +## Описание + +Инфраструктурные сервисы обеспечивают базовую функциональность для всех приложений в экосистеме aepif.ru. Включают в себя reverse proxy с автоматическими SSL сертификатами и систему аутентификации. + +## Архитектура инфраструктуры + +```mermaid +graph TB + A[Internet] --> B[Traefik Reverse Proxy] + B --> C[Authelia Auth Service] + B --> D[Second Mind] + B --> E[Other Services] + + C --> F[Redis Session Store] + C --> G[SQLite User Database] + + B --> H[Let's Encrypt] + H --> I[SSL Certificates] + + subgraph "Network: proxy" + B + C + D + E + end + + subgraph "Auth Network" + C + F + end +``` + +## Основные компоненты + +### Traefik Reverse Proxy +- **Назначение**: Централизованная маршрутизация трафика +- **Домен**: `traefik.aepif.ru` (dashboard) +- **Порты**: + - 80 (HTTP) → автоматический редирект на HTTPS + - 443 (HTTPS) + - 2222 (SSH для Git) + - 8080 (Dashboard) +- **Функции**: + - Автоматическое получение SSL сертификатов от Let's Encrypt + - Load balancing между контейнерами + - TCP и HTTP маршрутизация + - Middleware для аутентификации + +### Authelia Authentication +- **Назначение**: Централизованная аутентификация и авторизация +- **Домен**: `auth.aepif.ru` +- **Технология**: Forward Auth middleware +- **Функции**: + - Single Sign-On (SSO) для всех сервисов + - Two-factor authentication (TOTP) + - Session management через Redis + - Политики доступа по доменам + +### Redis Session Store +- **Назначение**: Хранение пользовательских сессий +- **Технология**: Redis 7 Alpine +- **Особенности**: + - Персистентное хранение сессий + - Защита паролем + - Быстрый доступ к данным сессий + +## Структура проектов + +### Reverse Proxy +``` +/DOCKER/reverse-proxy/ +├── docker-compose.yml # Конфигурация Traefik +├── .env # Переменные окружения +└── volumes/ + └── traefik_data/ # ACME сертификаты и конфиг +``` + +### Authentication Service +``` +/DOCKER/auth/ +├── docker-compose.yml # Конфигурация Authelia + Redis +├── .env # Переменные окружения и секреты +└── authelia/ # Конфигурация Authelia + ├── configuration.yml # Основная конфигурация + ├── users_database.yml # База пользователей + ├── db.sqlite3 # SQLite база данных + └── notification.txt # Файл уведомлений +``` + +## Принцип работы + +### Маршрутизация запросов + +1. **Пользователь** обращается к любому поддомену `*.aepif.ru` +2. **Traefik** перехватывает запрос и анализирует Host header +3. **Traefik** проверяет, требуется ли аутентификация (middleware authelia) +4. Если нужна **аутентификация** → перенаправление на `auth.aepif.ru` +5. **Authelia** проверяет сессию или запрашивает логин/пароль +6. После успешной **аутентификации** → возврат к исходному сервису +7. **Traefik** проксирует запрос к целевому контейнеру + +### SSL сертификаты + +1. **Let's Encrypt ACME** автоматически получает сертификаты для новых доменов +2. **Traefik** автоматически обновляет сертификаты перед истечением +3. Все **HTTP запросы** автоматически перенаправляются на HTTPS +4. **Сертификаты сохраняются** в volume для персистентности + +## Домены и маршрутизация + +| Домен | Сервис | Аутентификация | Описание | +|-------|--------|---------------|----------| +| `traefik.aepif.ru` | Traefik Dashboard | Нет* | Панель управления Traefik | +| `auth.aepif.ru` | Authelia | Bypass | Страница входа в систему | +| `notes.aepif.ru` | Second Mind | ✅ Authelia | Заметки с защитой | +| `git.aepif.ru` | Gitea | Bypass | Git-сервер (собственная авторизация) | +| `webhook.aepif.ru` | Webhook Service | Bypass | API для автоматизации | + +*Dashboard Traefik в production должен быть защищен + +## Политики доступа + +### Конфигурация в Authelia + +```yaml +access_control: + default_policy: deny # По умолчанию запрещен доступ + rules: + - domain: notes.aepif.ru + policy: one_factor # Требует логин/пароль + - domain: git.aepif.ru + policy: bypass # Собственная авторизация Gitea + - domain: webhook.aepif.ru + policy: bypass # API с токеном + - domain: auth.aepif.ru + policy: bypass # Сама страница входа +``` + +### Типы политик + +- **bypass**: Доступ без аутентификации через Authelia +- **one_factor**: Требует логин/пароль +- **two_factor**: Требует логин/пароль + TOTP код +- **deny**: Полный запрет доступа + +## Пользователи и группы + +### Структура пользователей + +```yaml +users: + admin: + displayname: "Administrator" + password: "$argon2id$..." # Хешированный пароль + email: epifantsev1aa@gmail.com + groups: + - admins # Администраторская группа + - users # Базовая группа пользователей +``` + +### Управление паролями + +- Пароли хранятся в формате **Argon2id** (безопасное хеширование) +- Поддержка **reset паролей** через email уведомления +- Интеграция с **TOTP** для двухфакторной аутентификации + +## Безопасность + +### Уровни защиты + +1. **SSL/TLS**: Все соединения зашифрованы +2. **Forward Auth**: Централизованная проверка аутентификации +3. **Session Management**: Безопасное хранение сессий в Redis +4. **Password Hashing**: Argon2id для хранения паролей +5. **Rate Limiting**: Защита от брутфорса (3 попытки за 2 минуты) +6. **Session Expiration**: Автоматическое истечение сессий + +### Настройки безопасности + +```yaml +regulation: + max_retries: 3 # Максимум попыток входа + find_time: 2m # Период для подсчета попыток + ban_time: 5m # Время блокировки + +session: + expiration: 1h # Время жизни сессии + inactivity: 5m # Время неактивности до выхода +``` + +## Мониторинг + +### Доступные метрики + +- **Traefik Dashboard**: Статистика запросов, ошибок, времени ответа +- **Authelia Logs**: Попытки входа, ошибки аутентификации +- **Redis Metrics**: Использование памяти, количество ключей +- **SSL Certificate Status**: Статус и срок действия сертификатов + +### Health Checks + +```bash +# Проверка Traefik +curl -I https://traefik.aepif.ru + +# Проверка Authelia +curl -I https://auth.aepif.ru + +# Проверка SSL сертификатов +openssl s_client -connect aepif.ru:443 -servername aepif.ru | openssl x509 -noout -dates +``` + +## Преимущества архитектуры + +- **Централизация**: Единая точка входа для всех сервисов +- **Автоматизация SSL**: Не нужно вручную управлять сертификатами +- **Безопасность**: Единая система аутентификации +- **Масштабируемость**: Легко добавлять новые сервисы +- **Мониторинг**: Централизованная статистика +- **Zero Downtime**: Обновления без простоя сервисов + +## Связанные документы + +- [[Инфраструктура - Конфигурации]] - детальные настройки всех компонентов +- [[Инфраструктура - Развертывание]] - установка и первоначальная настройка +- [[Инфраструктура - Администрирование]] - обслуживание и мониторинг +- [[Second Mind - Обзор системы]] - основное приложение на этой инфраструктуре \ No newline at end of file