chore(repo): структура репозитория, лицензия AGPL-3.0 и политика безопасности

- структура по 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
This commit is contained in:
2026-09-19 18:20:52 +03:00
parent 356cec2bb8
commit 9839dbeede
11 changed files with 917 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
# 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).