leadera audit

This commit is contained in:
Агальцов Антон
2026-03-30 01:03:02 +03:00
parent 690abf379c
commit ff46a70709
+215
View File
@@ -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 недели с учётом приоритетов