1 line
22 KiB
JSON
1 line
22 KiB
JSON
[{"content":"Обзор проекта Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов:\nСтек технологий:\nБэкенд: Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx Фронтенд: Angular (версия не указана), HttpClient Инфраструктура: Docker, PM2, Hugo для документации Архитектура:\nClean Architecture с разделением на слои (handlers, service, repository) RESTful API с использованием JWT для аутентификации Управление правами доступа через RBAC (Role-Based Access Control) Поддержка пространств (spaces) как основной изоляции данных PostgreSQL с миграциями через golang-migrate Основные сущности:\nПользователи (Users) Пространства (Spaces) Диаграммы Ганта (Gantt Charts) Секции диаграмм (Gantt Sections) Задачи (Gantt Tasks) Бекенд — найденные проблемы 1. Критичные уязвимости 1.1 Отсутствие валидации ввода данных Критичность: Critical\nФайл: internal/dto/auth/login_request.go:5-6\nОписание: В DTO используются базовые теги валидации (binding:\u0026quot;required,email\u0026quot;), но они не применяются в handlers. В handlers используется только c.ShouldBindJSON() без дополнительной валидации.\nРекомендация: Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10).\n1.2 Риск SQL-инъекций Критичность: High\nФайл: internal/repository/space_repository.go:68-73\nОписание: В методе GetBySlug используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом.\nРекомендация: Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак.\n1.3 Небезопасное хранение секретов Критичность: High\nФайл: internal/config/config.go:13-15\nОписание: JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах.\nРекомендация: Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации.\n1.4 Отсутствие ограничений на частоту запросов Критичность: Medium\nОписание: Нет защиты от brute force атак на аутентификацию.\nРекомендация: Реализовать rate limiting для эндпоинтов аутентификации.\n2. Проблемы безопасности 2.1 XSS валидация Критичность: Medium\nФайл: internal/handlers/space_handler.go\nОписание: Нет очистки пользовательского ввода перед сохранением в базу данных.\nРекомендация: Добавить HTML экранирование пользовательских данных.\n2.2 Отсутствие CSRF защиты Критичность: Medium\nФайл: internal/middleware/cors_middleware.go\nОписание: Нет CSRF токенов или других механизмов защиты.\nРекомендация: Реализовать CSRF защиту для изменяющих операций.\n2.3 Небезопасная обработка ошибок Критичность: Medium\nФайл:/internal/utils/response.go\nОписание: Возвращаемые ошибки могут содержать внутренние детали реализации.\nРекомендация: Стандартизировать формат ошибок, скрывать внутренние детали от пользователей.\n3. Архитектурные проблемы 3.1 Отсутствие тестов Критичность: Medium\nФайл: Отсутствие тестовых файлов\nОписание: Найден только один тестовый helper файл, нет unit и интеграционных тестов.\nРекомендация: Добавить покрытие тестами, особенно для критичных бизнес-логик.\n3.2 Отсутствие индексов в БД Критичность: Medium\nФайл: migrations/000001_create_users_table.up.sql:15-16\nОписание: Есть базовые индексы, но отсутствуют составные индексы для сложных запросов.\nРекомендация: Добавить индексы для часто используемых запросов.\n3.3 Плохая обработка пагинации Критичность: Medium\nФайл: internal/repository/space_repository.go:39-45\nОписание: Пагинация реализована, но нет валидации параметров page и per_page.\nРекомендация: Добавить валидацию и ограничение на максимальное количество элементов на страницу.\n4. Проблемы конфигурации 4.1 Слабые настройки по умолчанию Критичность: Medium\nФайл: .env.example\nОписание: JWT секрет по умолчанию слишком короткий, пароль БД предсказуем.\nРекомендация: Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию.\n4.2 Небезопасные настройки CORS Критичность: Medium\nФайл: .env.example\nОписание: CORS разрешает любые origin в development.\nРекомендация: В продакшене использовать конкретные домены.\nФронтенд — найденные проблемы 1. Критичные уязвимости 1.1 Небезопасное хранение токенов Критичность: Critical\nФайл: src/app/core/auth/auth.service.ts:19-21\nОписание: Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак.\nРекомендация: Перенести токены в httpOnly cookie или secure storage.\n1.2 Отсутствие валидации на клиенте Критичность: Medium\nФайл: src/app/core/auth/auth.models.ts\nОписание: Нет валидации email, пароля и других полей на клиенте.\nРекомендация: Добавить клиентскую валидацию форм перед отправкой запросов.\n2. Проблемы безопасности 2.1 Отсутствие CSP Критичность: Medium\nОписание: Нет Content Security Policy для защиты от XSS и других атак.\nРекомендация: Добавить заголовки CSP с разрешенными источниками.\n2.2 Нет ограничений на длину ввода Критичность: Medium\nОписание: Нет ограничения максимальной длины вводимых данных.\nРекомендация: Добавить maxlength атрибуты к input полям.\n3. UX проблемы 3.1 Нет индикации загрузки Критичность: Low\nФайл: src/app/core/auth/auth.service.ts:45-47\nОписание: Для некоторых операций нет индикации загрузки.\nРекомендация: Добавить skeleton loaders или spinners для всех асинхронных операций.\n3.2 Плохая обработка ошибок Критичность: Low\nФайл: src/app/core/auth/auth.interceptor.ts:28-32\nОписание: Обработка ошибок 401 не всегда приводит к корректному перенаправлению.\nРекомендация: Стандартизовать обработку ошибок и отображение пользователю.\nБезопасность Текущие меры безопасности Использование JWT токенов для аутентификации Параметризованные SQL запросы (защита от SQL инъекций) CORS настройка RBAC система через пространства и роли Пароли хранятся в виде хешей Refresh токены для управления сессиями Отсутствующие меры Rate limiting CSRF protection Content Security Policy Input validation middleware SQL injection protection for dynamic queries XSS protection Secure cookie storage Brute force protection Рекомендации по безопасности Реализовать rate limiting для аутентификации Добавить CSRF защиту Перенести JWT токены в httpOnly cookies Реализовать систему мониторинга и оповещений о подозрительной активности Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД) Реализовать ротацию секретов Добавить тесты безопасности UX улучшения Фронтенд Улучшить валидацию форм: Добавить реальную-time валидацию и подсказки Добавить индикацию загрузки: Skeleton loaders для всех асинхронных операций Улучшить обработку ошибок: Пользовательские сообщения об ошибках с возможностью повторной попытки Добавить отключенные состояния: Кнопки должны быть disabled во время загрузки Мобильная адаптация: Проверка и улучшение мобильного UI Доступность: Добавить ARIA labels и проверить доступность Бэкенд Улучшить пагинацию: Добавить валидацию и лимиты Добавить bulk операции: Оптимизировать массовые операции Улучшить обработку ошибок: Более информативные сообщения Добавить метрики: Время выполнения запросов, количество запросов Оптимизировать запросы: Проверка на N+1 запросы Приоритизированный план исправления Приоритет Проблема Файлы Трудоёмкость Critical Хранение JWT токенов в localStorage frontend/src/app/core/auth/auth.service.ts 2 часа Critical Отсутствие валидации ввода данных backend/internal/handlers/*.go 4 часа High Небезопасные настройки JWT backend/internal/config/config.go 1 час High Rate limiting для аутентификации backend/internal/middleware/ 3 часа Medium Отсутствие тестов backend/internal/ 8 часов Medium XSS валидация backend/internal/handlers/*.go 2 часа Medium CSRF защита backend/internal/middleware/ 2 часа Low UX улучшения (индикация загрузки) frontend/src/app/ 3 часа Low Оптимизация запросов backend/internal/repository/ 4 часа Low Документация API backend/api/ 2 часа Общая трудоёмкость: ~31 час\nРекомендуемый срок выполнения: 2-3 недели с учётом приоритетов\n","section":"guides","tags":["audit","leadera","security","ux"],"title":"Аудит Leadera","url":"/guides/leadera-audit/"},{"content":"Настройка SSH туннелей VPS reg.ru (95.163.232.9) # На Mac Studio: создать туннель для каждого сервиса ssh -N -R 8080:localhost:8080 root@95.163.232.9 # leadera-api ssh -N -R 8081:localhost:4096 root@95.163.232.9 # opencode ssh -N -R 8082:localhost:4200 root@95.163.232.9 # leadera-fe ssh -N -R 8083:localhost:8080 root@95.163.232.9 # docs-a2v Настройка launchd plist Файл: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;!DOCTYPE plist PUBLIC \u0026#34;-//Apple//DTD PLIST 1.0//EN\u0026#34; \u0026#34;http://www.apple.com/DTDs/PropertyList-1.0.dtd\u0026#34;\u0026gt; \u0026lt;plist version=\u0026#34;1.0\u0026#34;\u0026gt; \u0026lt;dict\u0026gt; \u0026lt;key\u0026gt;Label\u0026lt;/key\u0026gt; \u0026lt;string\u0026gt;com.openclaw.sshtunnel\u0026lt;/string\u0026gt; \u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;ssh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; \u0026lt;key\u0026gt;RunAtLoad\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;key\u0026gt;KeepAlive\u0026lt;/key\u0026gt; \u0026lt;true/\u0026gt; \u0026lt;/dict\u0026gt; \u0026lt;/plist\u0026gt; Автозапуск # Загрузить plist launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist # Проверить статус launchctl list | grep sshtunnel # Удалить (при необходимости) launchctl unload ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist Доступ к сервисам Через reverse proxy на VPS:\ncode.a2v.space: порт 8080 → Mac Studio:4096 claw.a2v.space: порт 8081 → Mac Studio:8080 (leadera-api) sand.a2v.space: порт 8082 → Mac Studio:4200 (leadera-fe) docs.a2v.space: порт 8083 → Mac Studio:8080 (docs-a2v) SSL Все сервисы используют Let\u0026rsquo;s Encrypt сертификаты:\nПуть: /etc/letsencrypt/live/{claw,code,sand}.a2v.space/ Автопродление через certbot ","section":"guides","tags":["ssh","tunnel","vps","reverse-proxy"],"title":"SSH туннели для VPS reverse proxy","url":"/guides/ssh-tunnels-vps/"},{"content":"Общая схема Mac Studio (локальная сеть) → autossh (SSH-туннели) → VPS 95.163.232.9 (Debian) → nginx (HTTPS reverse proxy) → интернет Что нужно на VPS 1. Установленные пакеты apt update apt install nginx certbot python3-certbot-nginx 2. SSH-доступ Авторизация только по ключам Публичный ключ с Mac Studio добавлен в /root/.ssh/authorized_keys 3. nginx Для каждого домена создать server block:\nHTTP → редирект на HTTPS HTTPS с SSL-сертификатом Let\u0026rsquo;s Encrypt proxy_pass на localhost-порт туннеля Пример структуры:\n/etc/nginx/sites-available/ claw.a2v.space.conf code.a2v.space.conf sand.a2v.space.conf 4. SSL-сертификаты certbot certonly --nginx -d \u0026lt;domain\u0026gt; certbot renew --dry-run # проверить автообновление Что нужно на Mac Studio autossh через launchd Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nОдин plist с несколькими -R флагами:\n\u0026lt;key\u0026gt;ProgramArguments\u0026lt;/key\u0026gt; \u0026lt;array\u0026gt; \u0026lt;string\u0026gt;/usr/local/bin/autossh\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-M\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;0\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8080:localhost:18789\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8081:localhost:4096\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8082:localhost:4200\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-R\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;8083:localhost:8080\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;root@95.163.232.9\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-N\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;-i\u0026lt;/string\u0026gt; \u0026lt;string\u0026gt;/Users/\u0026lt;user\u0026gt;/.ssh/id_rsa\u0026lt;/string\u0026gt; \u0026lt;/array\u0026gt; Управление launchd launchctl load ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist launchctl start com.openclaw.sshtunnel launchctl stop com.openclaw.sshtunnel Проверка # На VPS ss -tlnp | grep -E \u0026#39;808[0-3]\u0026#39; # Снаружи curl -I https://claw.a2v.space curl -I https://code.a2v.space curl -I https://sand.a2v.space ","section":"guides","tags":["vps","nginx","ssh","reverse-proxy","devops"],"title":"Настройка VPS как реверс-прокси","url":"/guides/vps-reverse-proxy/"},{"content":"Архитектура Mac Studio (192.168.0.37:18789) → autossh SSH-туннель → VPS 95.163.232.9:8080 → nginx HTTPS → https://claw.a2v.space Шаги настройки 1. DNS A-запись claw.a2v.space → 95.163.232.9\nNS-серверы: ns1.hosting.reg.ru, ns2.hosting.reg.ru\n2. Mac Studio — OpenClaw Порт: 18789 Конфиг: ~/.openclaw/openclaw.json 3. SSH-туннель (launchd) Plist: ~/Library/LaunchAgents/com.openclaw.sshtunnel.plist\nКлючевой флаг: -R 8080:localhost:18789\n4. VPS — nginx конфиг server { listen 80; server_name claw.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name claw.a2v.space; ssl_certificate /etc/letsencrypt/live/claw.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/claw.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } 5. SSL-сертификат certbot certonly --nginx -d claw.a2v.space 6. OpenClaw config { \u0026#34;allowedOrigins\u0026#34;: [\u0026#34;https://claw.a2v.space\u0026#34;], \u0026#34;trustedProxies\u0026#34;: [\u0026#34;127.0.0.1\u0026#34;] } ","section":"guides","tags":["openclaw","ssh","nginx","vps","reverse-proxy"],"title":"Подключение claw.a2v.space (OpenClaw)","url":"/guides/claw-a2v-space/"},{"content":"Архитектура Mac Studio (localhost:4096) → autossh SSH-туннель (-R 8081:localhost:4096) → VPS 95.163.232.9:8081 → nginx HTTPS → https://code.a2v.space Параметры Параметр Значение Локальный порт 4096 Туннель порт 8081 pm2 процесс opencode SSL сертификат /etc/letsencrypt/live/code.a2v.space/ nginx конфиг server { listen 80; server_name code.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name code.a2v.space; ssl_certificate /etc/letsencrypt/live/code.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/code.a2v.space/privkey.pem; location / { proxy_pass http://127.0.0.1:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;upgrade\u0026#34;; } } SSL-сертификат certbot certonly --nginx -d code.a2v.space ","section":"guides","tags":["opencode","ssh","nginx","vps","reverse-proxy"],"title":"Подключение code.a2v.space (OpenCode)","url":"/guides/code-a2v-space/"},{"content":"Архитектура Mac Studio ├─ Frontend (Angular) :4200 (pm2: leadera-fe) ├─ Backend (Go) :8080 (pm2: leadera-api) └─ PostgreSQL 16 в Docker (Colima, container: app-leadera-db) → autossh SSH-туннель (-R 8082:localhost:4200 -R 8083:localhost:8080) → VPS 95.163.232.9 → nginx HTTPS → https://sand.a2v.space Параметры Компонент Локальный порт Туннель порт pm2 имя Frontend (Angular) 4200 8082 leadera-fe Backend (Go) 8080 8083 leadera-api SSL сертификат: /etc/letsencrypt/live/sand.a2v.space/\nnginx конфиг server { listen 80; server_name sand.a2v.space; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name sand.a2v.space; ssl_certificate /etc/letsencrypt/live/sand.a2v.space/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/sand.a2v.space/privkey.pem; location /api { proxy_pass http://127.0.0.1:8083; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } location / { proxy_pass http://127.0.0.1:8082; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } База данных PostgreSQL 16 в Docker через Colima:\nContainer: app-leadera-db Port: 5432 SSL-сертификат certbot certonly --nginx -d sand.a2v.space ","section":"guides","tags":["angular","go","docker","nginx","vps","reverse-proxy"],"title":"Подключение sand.a2v.space (Leadera Project)","url":"/guides/sand-a2v-space/"}] |