Files
docs.a2v.space/content/guides/leadera-audit.md
T

215 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 недели с учётом приоритетов