9839dbeede
- структура по AGENT.md §12: cmd/, internal/, web/, deploy/, queries/, docs/ - LICENSE: полный текст AGPL-3.0-or-later - NOTICE: атрибуция референсов (Spacebar, Fermo) и сторонних компонентов - SECURITY.md и .well-known/security.txt: правила раскрытия уязвимостей - .env.example: все переменные окружения с дефолтами - .gitignore/.dockerignore/.editorconfig/.gitattributes/.gitleaks.toml
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).
|