Безопасность
Эта страница — для технического читателя. Описывает реальные архитектурные решения сегодняшней беты, без маркетинговой воды.
Шифрование credentials интеграций
Токены доступа к МойСклад и будущим интеграциям шифруются на стороне сервера алгоритмом Fernet (AES-128 в режиме CBC + HMAC-SHA256, библиотека cryptography). Шифротекст хранится в колонке credentials_encrypted таблицы integration_connections.
API никогда не возвращает токен в ответах — Pydantic-схема его просто не содержит. В логах токены тоже не появляются — расшифровка происходит непосредственно перед HTTP-запросом к внешнему API и сразу освобождается.
Аутентификация и сессии
- Пароли: хешируются прямым
bcrypt(12 раундов по умолчанию). В БД лежит только хеш + соль. Длинные пароли (>72 байт) детерминированно пре-хешируются через SHA-256+base64. - Access-токен: JWT (HS256), TTL 24 часа, подписан серверным секретом. Содержит
user_id,company_id,role. - Refresh-токен: отдельный JWT, TTL 7 дней. Помечен claim'ом
type: refreshи не может использоваться как Bearer.
Multi-tenant изоляция
Каждая сущность — OperationalProblem, IntegrationConnection, ProblemEvent и т.д. — содержит company_id с ON DELETE CASCADE. Все запросы фильтруются по current_user.company_id в FastAPI-зависимостях. Пользователь компании A технически не может получить данные компании B — запрос вернёт 404 ещё до проверки прав доступа к ресурсу.
Чтобы не утекать через ошибки информацию о существовании чужих ресурсов, кросс-tenant обращения возвращают 404 с detail="not_found", а не 403.
Append-only audit-trail
Каждая смена статуса и ответственного по проблеме пишется в отдельную таблицу problem_events с указанием автора (user или system), времени, прежнего и нового значения. Записи не редактируются и не удаляются через интерфейс.
При удалении пользователя actor_user_id обнуляется (FK с ON DELETE SET NULL), но событие сохраняется — в UI оно отобразится как «Удалённый пользователь».
Стек
- Backend: Python 3.12, FastAPI, SQLAlchemy 2.0, Alembic.
- БД: PostgreSQL 16, миграции через Alembic.
- Очередь: Celery + Redis для фоновых задач.
- Frontend: Next.js 15, TypeScript, без бизнес-логики на клиенте.
- Контейнеризация: Docker Compose для разработки. Production-вариант с разделением dev/prod-зависимостей готовится.
Что в плане
- Refresh-token rotation с инвалидацией использованных.
- Роле-ограничения mutating endpoints:
viewer= read-only. - Cleanup старых записей в audit-логах через Celery beat.
- Production-deployment с HTTPS, security headers, rate-limiting на
/auth/login. - Pen-test и compliance-аудит перед коммерческим запуском.
Технические вопросы: support@glassbiz.ru. Сообщения об уязвимостях принимаем через тот же адрес — отвечаем в течение 48 часов.