5.5 KiB
5.5 KiB
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-стек защищённой зоны:
auth→mfa→password.fresh→audit(см.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).