# Политика безопасности

## Сообщение об уязвимостях

Пожалуйста, **не создавайте публичный issue** для проблем безопасности.

Сообщите приватно одним из способов:

* GitHub Security Advisories: вкладка **Security → Report a vulnerability**
  в репозитории `paulmann/BAS-IP`;
* либо e-mail владельца репозитория (см. профиль GitHub).

Опишите: версию приложения, шаги воспроизведения, затронутые компоненты
(веб-интерфейс, API, CLI, установщик, обновления), потенциальный эффект.
Мы подтверждаем получение в течение 72 часов и стремимся к выпуску
исправления в течение 14 дней для критичных проблем.

## Поддерживаемые версии

| Версия | Поддержка |
|---|---|
| 2.x    | активная: исправления безопасности и функциональные |
| 1.x (`main`) | не поддерживается; известен засвеченный в истории `.api_token` — при использовании с реальной панелью отзовите ключ устройства |

## Встроенные механизмы защиты

Кратко (подробности — [wiki/12-Security.md](wiki/12-Security.md)):

* **Аутентификация**: bcrypt/argon2id, 2FA TOTP, блокировка после серии
  неудач, ротация ID сессии при входе, absolute + idle timeout сессий,
  привязка сессии к отпечатку UA/IP (опционально), «запомнить меня»
  с ротацией cookie.
* **Авторизация**: роли + 40+ точечных прав; жители видят только свои данные
  (row-level по `resident_id`); API-токены дают области доступа, а не роли.
* **Транспорт и браузер**: CSP `default-src 'self'` + nonce для скриптов,
  HSTS, `X-Frame-Options`/`frame-ancestors`, `nosniff`, `Referrer-Policy`,
  `Permissions-Policy`, `Cache-Control: no-store` для динамики, cookie
  `HttpOnly`/`SameSite=Lax`/`Secure` (+ `__Secure-` prefix за HTTPS).
* **Инъекции**: только prepared statements (PDO), экранирование вывода в
  шаблонах, валидация и нормализация входа, защита от массового заполнения.
* **CSRF**: synchronizer-token для всех POST (исключения — подписанные
  гостевые ссылки и webhook с собственным секретом).
* **Rate limiting**: логин, сброс пароля, открытие ворот, гостевые ссылки,
  API — отдельные лимиты; 429 с `Retry-After`.
* **Секреты**: локальный конфиг вне git (0600), шифрование секретов at-rest
  (AES-256-GCM, ключ приложения), маскирование паролей/токенов в логах,
  пароли устройств — только шифрованные секреты.
* **Аудит**: журнал всех значимых действий (кто, что, когда, IP), журнал
  входов и сессий, экспорт аудита.
* **Обновления**: контрольные суммы артефактов, бэкап файлов и БД перед
  установкой, возможность pin'а SHA-256, откат.
* **Установщик**: самоблокировка (`public/install.lock` + 403 на маршрутах),
  корень проекта закрыт `.htaccess`, документ-рут — только `public/`.

## Рекомендации по развёртыванию

1. Только HTTPS (Let's Encrypt) и `app.behind_proxy`/`strict_transport_security`.
2. Документ-рут веб-сервера — `public/`; `storage/` и `config/` недоступны извне.
3. `app.env=production`, `app.debug=false`.
4. Права: файлы `0640`, каталоги `0750`, `storage/` — владелец php-fpm;
   `.bas-ip.config.local.php` — `0600`.
5. Включите 2FA для всех сотрудников (`doctor` предупредит).
6. Регулярные бэкапы (`backup:create` в cron) и `php bin/bas-ip doctor`
   в мониторинге.
7. Ограничьте админку и API по IP (`security.ip_allowlist`), где возможно.
