Files
docs.a2v.space/content/guides/leadera-audit.md
T
Агальцов Антон ff46a70709 leadera audit
2026-03-30 01:03:02 +03:00

13 KiB
Raw Blame History

title, date, tags
title date tags
Аудит Leadera 2026-03-30
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 недели с учётом приоритетов