Версия 1.7.0 — 2026-07-27

Версия 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 и отмечено в реестре КБ.

Действия при деплое

  1. .env: задать DB_SSLMODE=require (PostgreSQL должен принимать TLS; локально можно prefer).
  2. .env: проверить SESSION_SECURE_COOKIE=true, APP_DEBUG=false.
  3. TLS к Sber-API: если на хосте нет корневого сертификата НУЦ Минцифры — SBER_TLS_VERIFY=/path/to/russiantrustedca.pem, иначе голосовой ввод получит SSL-ошибку. Временный откат: SBER_TLS_VERIFY=false (как было до релиза).
  4. php artisan migrate — одна миграция: право JournalPrint.view (выдаётся всем текущим ролям автоматически).
  5. php artisan config:cache — обязательно после правки env.
  6. Опционально: VOICE_RATE_PER_MINUTE (деф. 10), VOICE_DAILY_LIMIT (деф. 200).
  7. 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-сводок.