diff --git a/content/guides/leadera-audit.md b/content/guides/leadera-audit.md new file mode 100644 index 0000000..0280496 --- /dev/null +++ b/content/guides/leadera-audit.md @@ -0,0 +1,215 @@ +--- +title: "Аудит Leadera" +date: 2026-03-30 +tags: ["audit", "leadera", "security", "ux"] +--- + +## Обзор проекта + +Leadera — это SaaS-платформа для управления IT-ландшафтом с поддержкой диаграмм Ганта. Проект состоит из двух основных компонентов: + +**Стек технологий:** +- **Бэкенд:** Go 1.21+, GIN framework, PostgreSQL 16+, pgx v5 + sqlx +- **Фронтенд:** Angular (версия не указана), HttpClient +- **Инфраструктура:** Docker, PM2, Hugo для документации + +**Архитектура:** +- Clean Architecture с разделением на слои (handlers, service, repository) +- RESTful API с использованием JWT для аутентификации +- Управление правами доступа через RBAC (Role-Based Access Control) +- Поддержка пространств (spaces) как основной изоляции данных +- PostgreSQL с миграциями через golang-migrate + +**Основные сущности:** +- Пользователи (Users) +- Пространства (Spaces) +- Диаграммы Ганта (Gantt Charts) +- Секции диаграмм (Gantt Sections) +- Задачи (Gantt Tasks) + +## Бекенд — найденные проблемы + +### 1. Критичные уязвимости + +#### 1.1 Отсутствие валидации ввода данных +**Критичность:** Critical +**Файл:** internal/dto/auth/login_request.go:5-6 +**Описание:** В DTO используются базовые теги валидации (`binding:"required,email"`), но они не применяются в handlers. В handlers используется только `c.ShouldBindJSON()` без дополнительной валидации. +**Рекомендация:** Добавить ручную валидацию в handlers или использовать специализированную библиотеку для валидации (validator/v10). + +#### 1.2 Риск SQL-инъекций +**Критичность:** High +**Файл:** internal/repository/space_repository.go:68-73 +**Описание:** В методе `GetBySlug` используется параметризованный запрос, что хорошо. Однако нет проверки валидности slug перед запросом. +**Рекомендация:** Добавить регулярную валидацию slug для предотвращения SQL инъекций и других атак. + +#### 1.3 Небезопасное хранение секретов +**Критичность:** High +**Файл:** internal/config/config.go:13-15 +**Описание:** JWT секрет хранится в структуре Config и может быть логирован. Нет отладочных данных в логах. +**Рекомендация:** Исключить JWT секрет из логов, добавить маскирование секретов в конфигурации. + +#### 1.4 Отсутствие ограничений на частоту запросов +**Критичность:** Medium +**Описание:** Нет защиты от brute force атак на аутентификацию. +**Рекомендация:** Реализовать rate limiting для эндпоинтов аутентификации. + +### 2. Проблемы безопасности + +#### 2.1 XSS валидация +**Критичность:** Medium +**Файл:** internal/handlers/space_handler.go +**Описание:** Нет очистки пользовательского ввода перед сохранением в базу данных. +**Рекомендация:** Добавить HTML экранирование пользовательских данных. + +#### 2.2 Отсутствие CSRF защиты +**Критичность:** Medium +**Файл:** internal/middleware/cors_middleware.go +**Описание:** Нет CSRF токенов или других механизмов защиты. +**Рекомендация:** Реализовать CSRF защиту для изменяющих операций. + +#### 2.3 Небезопасная обработка ошибок +**Критичность:** Medium +**Файл:**/internal/utils/response.go +**Описание:** Возвращаемые ошибки могут содержать внутренние детали реализации. +**Рекомендация:** Стандартизировать формат ошибок, скрывать внутренние детали от пользователей. + +### 3. Архитектурные проблемы + +#### 3.1 Отсутствие тестов +**Критичность:** Medium +**Файл:** Отсутствие тестовых файлов +**Описание:** Найден только один тестовый helper файл, нет unit и интеграционных тестов. +**Рекомендация:** Добавить покрытие тестами, особенно для критичных бизнес-логик. + +#### 3.2 Отсутствие индексов в БД +**Критичность:** Medium +**Файл:** migrations/000001_create_users_table.up.sql:15-16 +**Описание:** Есть базовые индексы, но отсутствуют составные индексы для сложных запросов. +**Рекомендация:** Добавить индексы для часто используемых запросов. + +#### 3.3 Плохая обработка пагинации +**Критичность:** Medium +**Файл:** internal/repository/space_repository.go:39-45 +**Описание:** Пагинация реализована, но нет валидации параметров page и per_page. +**Рекомендация:** Добавить валидацию и ограничение на максимальное количество элементов на страницу. + +### 4. Проблемы конфигурации + +#### 4.1 Слабые настройки по умолчанию +**Критичность:** Medium +**Файл:** .env.example +**Описание:** JWT секрет по умолчанию слишком короткий, пароль БД предсказуем. +**Рекомендация:** Увеличить длину JWT секрета до 64+ символов, сгенерировать сложные пароли по умолчанию. + +#### 4.2 Небезопасные настройки CORS +**Критичность:** Medium +**Файл:** .env.example +**Описание:** CORS разрешает любые origin в development. +**Рекомендация:** В продакшене использовать конкретные домены. + +## Фронтенд — найденные проблемы + +### 1. Критичные уязвимости + +#### 1.1 Небезопасное хранение токенов +**Критичность:** Critical +**Файл:** src/app/core/auth/auth.service.ts:19-21 +**Описание:** Access токены хранятся в localStorage, что делает их уязвимыми для XSS атак. +**Рекомендация:** Перенести токены в httpOnly cookie или secure storage. + +#### 1.2 Отсутствие валидации на клиенте +**Критичность:** Medium +**Файл:** src/app/core/auth/auth.models.ts +**Описание:** Нет валидации email, пароля и других полей на клиенте. +**Рекомендация:** Добавить клиентскую валидацию форм перед отправкой запросов. + +### 2. Проблемы безопасности + +#### 2.1 Отсутствие CSP +**Критичность:** Medium +**Описание:** Нет Content Security Policy для защиты от XSS и других атак. +**Рекомендация:** Добавить заголовки CSP с разрешенными источниками. + +#### 2.2 Нет ограничений на длину ввода +**Критичность:** Medium +**Описание:** Нет ограничения максимальной длины вводимых данных. +**Рекомендация:** Добавить maxlength атрибуты к input полям. + +### 3. UX проблемы + +#### 3.1 Нет индикации загрузки +**Критичность:** Low +**Файл:** src/app/core/auth/auth.service.ts:45-47 +**Описание:** Для некоторых операций нет индикации загрузки. +**Рекомендация:** Добавить skeleton loaders или spinners для всех асинхронных операций. + +#### 3.2 Плохая обработка ошибок +**Критичность:** Low +**Файл:** src/app/core/auth/auth.interceptor.ts:28-32 +**Описание:** Обработка ошибок 401 не всегда приводит к корректному перенаправлению. +**Рекомендация:** Стандартизовать обработку ошибок и отображение пользователю. + +## Безопасность + +### Текущие меры безопасности +- Использование 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 + +### Рекомендации по безопасности +1. Реализовать rate limiting для аутентификации +2. Добавить CSRF защиту +3. Перенести JWT токены в httpOnly cookies +4. Реализовать систему мониторинга и оповещений о подозрительной активности +5. Добавить валидацию на всех уровнях (фронтенд, бэкенд, БД) +6. Реализовать ротацию секретов +7. Добавить тесты безопасности + +## UX улучшения + +### Фронтенд +1. **Улучшить валидацию форм**: Добавить реальную-time валидацию и подсказки +2. **Добавить индикацию загрузки**: Skeleton loaders для всех асинхронных операций +3. **Улучшить обработку ошибок**: Пользовательские сообщения об ошибках с возможностью повторной попытки +4. **Добавить отключенные состояния**: Кнопки должны быть disabled во время загрузки +5. **Мобильная адаптация**: Проверка и улучшение мобильного UI +6. **Доступность**: Добавить ARIA labels и проверить доступность + +### Бэкенд +1. **Улучшить пагинацию**: Добавить валидацию и лимиты +2. **Добавить bulk операции**: Оптимизировать массовые операции +3. **Улучшить обработку ошибок**: Более информативные сообщения +4. **Добавить метрики**: Время выполнения запросов, количество запросов +5. **Оптимизировать запросы**: Проверка на 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 час +**Рекомендуемый срок выполнения:** 2-3 недели с учётом приоритетов \ No newline at end of file