61 lines
4.5 KiB
Markdown
61 lines
4.5 KiB
Markdown
|
|
# 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).
|