Files

61 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

# Security Policy
glchat — self-hosted инстанс: его безопасность зависит от того, как он развёрнут
и обновляется. Ниже — что считается уязвимостью, как сообщить о ней и какие
механизмы защиты уже встроены.
## Как сообщить об уязвимости
Не открывайте публичный issue. Напишите на **security@gl.mhspx.su** (PGP-ключ
публикуется по запросу) и укажите:
- версию (`GET /api/v1/meta` → `version`), ОС и способ установки;
- шаги воспроизведения и ожидаемое/фактическое поведение;
- оценку влияния (что можно прочитать/изменить/сломать);
- при наличии — PoC и логи (без секретов и персональных данных).
Ответ в течение 72 часов; исправление критичных проблем — вне очереди
функциональных задач. Пожалуйста, дайте время на выпуск исправления до
публичного раскрытия (90 дней или по согласованию).
## Поддерживаемые версии
Исправления безопасности выпускаются для последнего стабильного релиза
(канал `stable`) и текущего `beta`. Перед обновлением всегда делайте бэкап:
`glchat backup`.
## Встроенные механизмы защиты
- **Пароли:** только Argon2id с pepper (pepper хранится вне БД); обратимое
шифрование паролей запрещено; локальная проверка по словарю утечек.
- **PII:** email, TOTP-секреты и OAuth-токены — AES-256-GCM (master key в env),
поиск по email — blind index (HMAC-SHA-256).
- **Сессии:** в БД только хэши токенов; ротация при входе и step-up; «выйти везде»;
автоматический отзыв при смене пароля.
- **2FA TOTP** обязательна для инстанс-администраторов; step-up для
чувствительных действий; passkeys — после MVP.
- **Загрузки:** MIME allow-list + проверка magic bytes, лимиты размера и пикселей,
запрет SVG и исполняемых типов, отдача не-изображений как `attachment`,
отдельный origin `files.<domain>` для пользовательского контента.
- **Сеть:** TLS везде, HSTS, CSP без `unsafe-eval`, строгая проверка `Origin`,
точный CORS-allowlist, rate limiting, fail2ban (`sshd`, `glchat-auth`, `recidive`),
UFW + правила `DOCKER-USER` + nftables-лимиты.
- **Секреты:** генерируются установщиком, лежат в `.env` с правами 600, не логируются.
- **Бэкапы:** age-шифрование; приватный ключ по умолчанию не хранится на сервере.
## Область ответственности владельца инстанса
- Сохранность приватного age-ключа бэкапов и master key (без них данные не
восстановить и не расшифровать).
- Обновление ОС и контейнеров, проверка отчётов `glchat security-check`.
- Настройка внешнего firewall провайдера, если он есть.
- Своевременный разбор отчётов fail2ban и аудит-лога.
## Что не является уязвимостью
- Данные, доступные инстанс-администратору на серверах инстанса: это
документированное поведение (AGENT.md §7.19). Чужие DM и приватные `/ls`
сообщения администратору недоступны — их утечка является уязвимостью.
- Атаки, требующие физического доступа к серверу или root-прав.
- Отсутствие E2EE: продукт явно не использует E2EE (только TLS + DTLS-SRTP).