Версия 1.7.0 — 2026-07-27
Релиз безопасности: закрытие требований КБ из реестра ([JRNLS] Требования КБ, Confluence). 16 изменений, каждое в своей feature-ветке, со ссылкой на требование. Плюс 23 новых теста (итого 150 зелёных).
Кратко
| Коммит | Что сделано | Требования КБ |
|---|---|---|
312e35a |
PostgreSQL: sslmode из env, по умолчанию require; поддержка DB_SSL_ROOT_CERT (verify-full) |
А3 |
58f8be8 |
Rate limiting: анти-brute-force входа (5 попыток/мин на логин+IP), частотный + дневной лимит голосового ввода, лимит поиска по докам | В2, А49 (A07), А56 (API4), А72 (LLM10) |
84b842b |
Парольная политика локальных учёток: 12+ символов, оба регистра, цифры, спецсимволы (Password::defaults + установщик) |
В2 |
7e7c2f8 |
Маскирование секретов в логах: Bearer/Basic-токены, ключи password/token/secret/auth_key — рекурсивно по контексту | А28, А64 (LLM02) |
89a576a |
Ошибки голосового ввода не раскрывают детали интеграций: UserFacingError (422) для подсказок, остальное — нейтрально + в лог; APP_DEBUG=false в примере |
А52 (A10) |
f396075 |
Docker: php-fpm работает от www-data, не от root |
А1 (CIS 5.4) |
88018d4 |
Регрессионный тест: у всех моделей явный $fillable, поля ЭЦП/привилегий не массово-присваиваемые |
А55 (API3) |
77ad975 |
Заголовки безопасности (nosniff, X-Frame-Options, Referrer-Policy, Permissions-Policy, HSTS), CSP в Report-Only, Secure-cookie | А44 (A02), А60 (API8) |
e4ce1ec |
Команда db:anonymize: обезличивание ПДн сотрудников и пациентов + транскриптов для тестовых сред; на проде запрещена |
А35, А36 |
f72da76 |
Право JournalPrint.view на печать журналов (миграция выдаёт всем текущим ролям) + печать уже в аудите |
А29 |
03a20d8 |
TLS-верификация вызовов SaluteSpeech/GigaChat вместо жёсткого verify => false; настройка SBER_TLS_VERIFY |
А40, А46, А62 (API10) |
459dba7 |
LLM: защита от prompt injection (правило в промпте), белый список полей вывода GigaChat, ограничение длин | А63 (LLM01), А67 (LLM05), А69 (LLM07) |
2f70133 |
Алерт на серию неудачных входов: 5+ за 15 минут → лог + сообщение в MAX (логин маскируется) | А51 (A09), А32 |
78104e5 |
Инвентаризация всех 48 HTTP-эндпоинтов: docs/security/endpoints.md + проверка особых случаев |
А61 (API9) |
bffebd7 |
scripts/security-audit.sh: composer/npm audit + SBOM (CycloneDX); документация цепочки поставок |
А42, А45 (A03), А50 (A08) |
9de263e |
Закрыта дыра: подпись записей (payload/sign) не проверяла права на журнал — теперь view/update; подписание пишется в аудит; полный IDOR-аудит потоков в docs/security/access-control-audit.md |
А43 (A01), А53 (API1), А57 (API5), А27 |
Главные находки аудита
- Подпись ЭЦП без проверки прав — любой аутентифицированный пользователь мог получить payload (данные записи) и подписать запись любого журнала. Исправлено (
9de263e). - TLS-верификация Sber-API была отключена в коде (
verify => false) — исправлено, теперь настраивается (03a20d8). ActionLogger::signedсуществовал, но не вызывался — подписи не попадали в журнал действий. Подключён.- В журналах хранятся ПДн пациентов (прививки: ФИО+адрес, биопсии, операции, ПКУ, несчастные случаи) — это усиливает применимость ФЗ‑152 (Р1): состав ИСПДн шире, чем «только сотрудники». Учтено в
db:anonymizeи отмечено в реестре КБ.
Действия при деплое
.env: задатьDB_SSLMODE=require(PostgreSQL должен принимать TLS; локально можноprefer)..env: проверитьSESSION_SECURE_COOKIE=true,APP_DEBUG=false.- TLS к Sber-API: если на хосте нет корневого сертификата НУЦ Минцифры —
SBER_TLS_VERIFY=/path/to/russiantrustedca.pem, иначе голосовой ввод получит SSL-ошибку. Временный откат:SBER_TLS_VERIFY=false(как было до релиза). php artisan migrate— одна миграция: правоJournalPrint.view(выдаётся всем текущим ролям автоматически).php artisan config:cache— обязательно после правки env.- Опционально:
VOICE_RATE_PER_MINUTE(деф. 10),VOICE_DAILY_LIMIT(деф. 200). - Docker-образ теперь стартует от
www-data: при первом деплое проверить, что php-fpm поднялся (порт 9000, логи в stderr).
Миграции
2026_07_27_100000_add_journal_print_permission — создаёт право JournalPrint.view, выдаёт всем существующим ролям (отзыв — точечно через админку ролей).
Технические детали
- Версия в
config/journals.php:1.6.6 → 1.7.0. - Тесты: 127 → 150 (23 новых: throttle входа, парольная политика, маскирование логов, mass assignment, security-заголовки, обезличивание, LLM-фильтрация, авторизация подписи).
- Новые документы:
docs/security/endpoints.md,docs/security/access-control-audit.md,docs/security/supply-chain.md,backlog_kn.md(план закрытия остальных требований КБ). - Что осталось на следующие релизы — см.
backlog_kn.md: этап 3 (регуляторка ФЗ‑152, процессы, инфраструктура: PAM, DMZ, VPN+2FA, DLP), перевод CSP из Report-Only в enforcing, ревизия текстов MAX-сводок.