Доки B23: README (010, password_history, таблица политики с колонкой «исполнение»), SETUP_GUIDE (cron бэкапа+purge, alembic 010, диагностика 400-пароль), чек-листы
This commit is contained in:
@@ -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
|
||||
|
||||
### В планах
|
||||
|
||||
|
||||
Reference in New Issue
Block a user