Доки B23: README (010, password_history, таблица политики с колонкой «исполнение»), SETUP_GUIDE (cron бэкапа+purge, alembic 010, диагностика 400-пароль), чек-листы

This commit is contained in:
2026-09-25 09:58:23 +03:00
parent 2222b7ad5b
commit c6be70ce36
2 changed files with 42 additions and 19 deletions
+24 -16
View File
@@ -143,17 +143,19 @@
vector/
├── backend/ # FastAPI-приложение
│ ├── main.py # Сборка приложения (12 роутеров)
│ ├── models.py # 21 таблица (SQLAlchemy)
│ ├── models.py # 22 таблицы (SQLAlchemy, +password_history)
│ ├── schemas.py # Pydantic-схемы
│ ├── database.py # Репозиторий кейсов + статистика
│ ├── audit.py # Журнал аудита + гео-скоуп
│ ├── password_policy.py # B23: исполняемая политика паролей
│ ├── purge_logs.py # B23: ретенция журналов (DELETE, cron)
│ ├── rbac.py # Роли/права/политика безопасности
│ ├── alembic/ # Миграции (006…009)
│ ├── alembic/ # Миграции (006…010)
│ ├── seed_users.py # Сид первых пользователей
│ ├── seed_units.py # Сид подразделений (РЦУ РЧС → ОУМЧС → Г(Р)ОЧС, 142 юнита)
│ ├── routers/ # 12 модулей API (см. раздел 8)
│ ├── services/ # Адаптеры расчёта
│ └── tests/ # 231 тест (pytest)
│ └── tests/ # 263 теста (pytest)
├── services/ # Математика (чистые функции)
│ ├── search_engine.py # SearchInput/SearchModel — ядро расчёта
│ ├── distance_service.py # Максимальный радиус (КМЧ × коэффициенты)
@@ -187,7 +189,7 @@ vector/
## 6. База данных
**PostgreSQL 16 + PostGIS 3.6**, БД `vector_mchs`. Схема управления — Alembic (`backend/alembic/versions/`), актуальная ревизия **009_e3_operations**.
**PostgreSQL 16 + PostGIS 3.6**, БД `vector_mchs`. Схема управления — Alembic (`backend/alembic/versions/`), актуальная ревизия **010_b23_policy**.
### Основные таблицы
@@ -199,25 +201,30 @@ vector/
| `search_teams`, `field_observations`, `areas_checked`, `found_events` | Оперативные слои (состав групп, наблюдения, проверенные квадраты, находки) |
| `reference_priors` | Слой 1: справочные приоритеты |
| `users`, `mchs_units` | Пользователи; иерархия РЦУ РЧС → 6 ОУМЧС → 135 Г(Р)ОЧС |
| `password_history` | История паролей (bcrypt-хэши; проверка переиспользования, B23) |
| `roles`, `permissions`, `role_permissions`, `user_roles` | RBAC: 4 роли, 9 прав, матрица связей |
| `sessions`, `auth_events` | Server-side сессии (sha256-токены), журнал входов |
| `security_settings` | Политика безопасности (10 параметров) |
| `security_settings` | Политика безопасности (10 параметров, **исполняется кодом с B23**) |
| `search_operations` | Поисковые операции (статусная машина, привязка к кейсу и КОНТУРу) |
| `audit_events`, `audit_changes` | Неизменяемый журнал аудита, field-level изменения (ретенция 90 дней) |
| `planet_osm_*` | Импорт OSM Беларуси (osm2pgsql, SRID 4326/3857): дороги, леса, вода, НП |
### Политика безопасности (`security_settings`, меняется в админке)
| Параметр | Значение |
|----------|----------|
| Минимальная длина пароля | 8 |
| Сложность пароля | требуются буквы+цифры |
| Срок действия пароля | 90 дней |
| История паролей | 5 (нельзя переиспользовать) |
| Блокировка после неудачных входов | 5 (на 15 минут) |
| Тайм-аут сессии / неактивности | 24 ч / 60 мин |
| Макс. параллельных сессий | 3 (старые отзываются) |
| Ретенция журнала аудита | 90 дней |
| Параметр | Значение | Исполнение (B23) |
|----------|----------|------------------|
| Минимальная длина пароля | 8 | ✅ при смене/сбросе пароля |
| Сложность пароля | требуются буквы+цифры | ✅ при смене/сбросе пароля |
| Срок действия пароля | 90 дней | ✅ `enforce_expiry` на каждом запросе → `must_change_password` |
| История паролей | 5 (нельзя переиспользовать) | ✅ таблица `password_history` (5 последних старых хэшей + текущий) |
| Блокировка после неудачных входов | 5 (на 15 минут) | ✅ (с B21) |
| Тайм-аут сессии | 24 ч | ✅ проверка `expires_at` при каждом запросе |
| Тайм-аут неактивности | 60 мин | ⚠️ `last_seen_at` пишется, но не проверяется |
| Макс. параллельных сессий | 3 (старые отзываются) | ✅ (с B21) |
| Ретенция журнала аудита | 90 дней | ✅ реальный DELETE: cron `python -m backend.purge_logs` (03:10) или POST `/admin/users/maintenance/purge-logs` |
Семантика истории: `password_history_count = N` хранит N последних *старых* хэшей;
вместе с текущим паролем защищено N+1 последних значений.
---
@@ -401,7 +408,8 @@ SPA на react-scripts (CRA). Роутинг:
- Прикладное логирование `vector.*`: события анализа, входов, КОНТУРа, аудита (README §13а)
- Интеграция с КОНТУР: отправка зон (контракт B20)
- Журнал аудита пользователей: входы, изменения, отправки
- 239 автотестов (pytest), 5 skipped
- 263 автотеста (pytest), 5 skipped
- B23: исполняемая политика паролей (срок/сложность/история), ретенция журналов реальным DELETE + cron
### В планах