Files
laravel-gost-template/CLAUDE.md
2026-06-24 17:20:43 +09:00

5.5 KiB
Raw Permalink Blame History

CLAUDE.md

Шаблон защищённого Laravel-приложения для ИСПДн (ФСТЭК №21, УЗ-1/К1; ФСБ №378). Используется как основа для новых проектов с персональными данными.

Команды

composer lint            # Pint (стиль)
./vendor/bin/phpstan     # Larastan, level 7 — держать 0 ошибок
./vendor/bin/pest        # тесты (включая tests/Feature/Security)
composer audit           # уязвимости зависимостей
npm run build            # сборка фронтенда (нужна для рендера Inertia-страниц)

php artisan migrate
php artisan migrate --database=audit --path=database/migrations/audit
php artisan db:seed                # роли RBAC
php artisan user:create-admin      # создать администратора
php artisan audit:verify           # контроль целостности журнала (РСБ.3)
php artisan audit:purge            # ротация журнала по сроку (РСБ.4/8)
php artisan security:audit-deps    # composer audit (УКФ.4)

Архитектура безопасности (что где)

  • Конфигурация мер: config/security.php, config/audit.php. Все параметры через .env (пароли, lockout, MFA, шифрование, заголовки).
  • Шифрование ПДн: трейт App\Models\Concerns\HasPdnEncryption + свойство $encrypted в модели. Драйвер за интерфейсом App\Services\Crypto\PdnCipher (LaravelAesCipher / GostCipher), биндинг в SecurityServiceProvider.
  • Аудит: App\Services\Audit\AuditService (фасад App\Facades\Audit). Записи в отдельном соединении audit, подписаны HMAC + хеш-цепочка. Не писать ПДн в журнал — только идентификаторы объектов.
  • Аутентификация: контроллеры в App\Http\Controllers\Auth, блокировка в LoginRequest, MFA в TwoFactorService/EnsureMfaIsVerified, парольная политика в App\Support\PasswordPolicy + PasswordManager + PasswordNotReused.
  • Доступ: spatie/laravel-permission (роли в RolesAndPermissionsSeeder), Policies (PersonalDataPolicy).
  • Middleware-стек защищённой зоны: authmfapassword.freshaudit (см. routes/web.php, алиасы в bootstrap/app.php).

Конвенции

  • Любая новая модель с ПДн: use HasPdnEncryption + $encrypted + checksum (контроль целостности, ОЦЛ.2) + Policy (УПД.2) + регистрация просмотра/изменения через Audit::log() (РСБ.2).
  • Все операции, изменяющие/раскрывающие ПДн, должны журналироваться. Новые типы событий добавлять в config/audit.php и docs/org/perechen-sobytiy.md.
  • Валидация — только через Form Request. Пароли — через PasswordPolicy::rule().
  • Не понижать меры: APP_DEBUG=false, TLS, MFA обязательны в production.
  • После изменений держать зелёными Pint, PHPStan (level 7), Pest.

Фронтенд (Inertia v3 + Vue 3 + NaiveUI)

  • Inertia v3 (@inertiajs/vue3). HTTP — встроенными хелперами: useForm (формы/редиректы, как на страницах входа), useHttp (JSON-эндпоинты), router, <Form>. axios не используется — не добавлять.
  • UI: NaiveUI (перенесён движок из проекта onboard). Подключение в resources/js/app.ts: провайдеры NConfigProvider/NLoadingBar/NDialog/ NNotification/NMessage оборачивают приложение; тема следует системной (plugins/naive.ts → preferredTheme). Discrete API доступен как window.$message/$notification/$dialog/$loadingBar и через this.$....
  • Pinia подключён (для сторов состояния).
  • Структура: resources/js/{pages,layouts,components,composables,plugins}. Макеты: layouts/AuthLayout.vue (страницы входа), layouts/AppLayout.vue (общий каркас с шапкой и индикатором загрузки).
  • Composables: useGlobalLoading (баннер на переходах Inertia), useNotification, useAppDialog (+AppDialog/AppDialogManager).
  • Шрифт Golos Text (public/fonts, @font-face в resources/css/app.css).
  • Проверки фронтенда: npm run lint:check, npm run types:check, npm run build.

Документация

  • docs/security/compliance.md — сопоставление мер ФСТЭК с кодом.
  • docs/security/checklist.md — чек-лист со статусами.
  • docs/security/crypto-gost.md — подключение СКЗИ (ГОСТ/КриптоПро).
  • docs/org/ — шаблоны организационных документов.
  • deploy/ — nginx (TLS/заголовки), docker-compose, Dockerfile, fail2ban.
  • database/sql/audit_grants.sql — права INSERT/SELECT для журнала (РСБ.3).