Files
portal/.gitleaks.toml
T

172 lines
8.6 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Конфигурация gitleaks для проекта Лидерра
# Правило §5.2 правил Claude: запрет на ПДн / токены / API-ключи в коммитах
#
# ВАЖНО: gitleaks использует Go RE2, который НЕ поддерживает lookbehind/lookahead.
# Все правила ниже написаны без (?<=...), (?<!...), (?=...), (?!...).
# Границы — через \b (word boundary).
title = "gitleaks Лидерра"
# Расширяем встроенный набор правил gitleaks
[extend]
useDefault = true
# ============================================================================
# Кастомные правила для российского контекста (152-ФЗ + ПДн)
# ============================================================================
# 1. Российский телефонный номер +7XXXXXXXXXX (без маски)
[[rules]]
id = "ru-phone-unmasked"
description = "Российский телефон без маскирования (правило §5.1 правил Claude)"
regex = '''\b(?:\+?7|8)[\s\-]?\(?[34589]\d{2}\)?[\s\-]?\d{3}[\s\-]?\d{2}[\s\-]?\d{2}\b'''
tags = ["pii", "phone", "152-fz"]
# 2. ИНН — 10 цифр (юр. лица) или 12 цифр (физ. лица)
[[rules]]
id = "ru-inn"
description = "Российский ИНН (10 или 12 цифр)"
regex = '''(?i)\b(?:inn|инн)[:=\s]+\d{10,12}\b'''
tags = ["pii", "ru-tax"]
# 3. ОГРН — 13 цифр (юр. лица) или 15 цифр (ИП)
[[rules]]
id = "ru-ogrn"
description = "Российский ОГРН/ОГРНИП (13 или 15 цифр)"
regex = '''(?i)\b(?:ogrn|огрн|огрнип)[:=\s]+\d{13,15}\b'''
tags = ["pii", "ru-tax"]
# 4. Российский паспорт (XX XX XXXXXX)
[[rules]]
id = "ru-passport"
description = "Российский паспорт RF (4 цифры серии + 6 цифр номера)"
regex = '''(?i)\b(?:passport|паспорт)[:=\s]+\d{4}\s?\d{6}\b'''
tags = ["pii"]
# 5. Email — детектируется default-правилами gitleaks. Дополнительно — через
# allowlist пропускаем известные плейсхолдеры (см. секцию allowlist ниже).
# 6. Yandex Cloud OAuth-token (формат `y0_...`)
[[rules]]
id = "yandex-cloud-oauth"
description = "Yandex Cloud OAuth/IAM-token"
regex = '''\by[0-9]_[A-Za-z0-9_-]{40,}\b'''
tags = ["secret", "yandex"]
# 7. Yandex Cloud API-key (формат AQVN...)
[[rules]]
id = "yandex-cloud-api-key"
description = "Yandex Cloud API-key"
regex = '''\bAQVN[A-Za-z0-9_-]{40,}\b'''
tags = ["secret", "yandex"]
# 8. Webhook signing secrets / HMAC keys
[[rules]]
id = "webhook-secret"
description = "Webhook signing secret (HMAC) с явным префиксом ключа"
regex = '''(?i)(?:webhook[_-]?(?:secret|token|signature)|signing[_-]?secret|hmac[_-]?key)[\s:=]+["']?[A-Za-z0-9_+/=\-]{20,}["']?'''
tags = ["secret"]
# ============================================================================
# Глобальный allowlist: что НЕ считать секретом
# ============================================================================
[allowlist]
description = "Что игнорировать (плейсхолдеры, тестовые данные, публичные реквизиты)"
paths = [
'''node_modules/''',
'''package-lock\.json''',
'''\.git/''',
'''bin/''',
'''cspell-words\.txt''',
'''\.gitleaks\.toml''',
# HTML-концепты handoff Платона (v8 Forest) — демо-данные для визуализации,
# не реальные ПДн. Дублирующие пути в liderra_v8_handoff/concepts/ и web/v8/
'''liderra_v8_handoff/concepts/.*\.html''',
'''web/v8/.*\.html''',
# Composer lock — содержит хеши/строки, иногда ловятся регулярками false-positive
'''app/composer\.lock''',
# Pest-тесты с фиктивными data-фикстурами (не реальные ПДн)
'''app/tests/.*\.php''',
# Database seeders с демо-данными (admin@demo.local + +7916123XXXX демо-телефоны)
'''app/database/seeders/.*\.php''',
# Database factories — генераторы тестовых фикстур (фейковые телефоны/ИНН,
# напр. TenantFactory::withRequisites +79150000000), не реальные ПДн. Та же
# категория, что seeders/tests.
'''app/database/factories/.*\.php''',
# Audit-internal docs (findings/blocked/report/plan) — содержат демо-телефоны и
# script-смешанные artifacts как finding'и для review (не реальные ПДн)
'''docs/superpowers/audits/.*\.md''',
'''docs/superpowers/plans/.*\.md''',
# Приёмочные ранбуки (R0–R5) — синтетические тест-телефоны (79990001122 и
# пр.) в матрицах провижининга/инъекции, не реальные ПДн. Та же категория,
# что plans/specs/audits.
'''docs/superpowers/runbooks/.*\.md''',
# Internal design specs — внутренние проектные доки с демо-данными (демо-телефоны
# в примерах, напр. spec про log-PII-scrubbing), не реальные ПДн. Как plans/audits.
'''docs/superpowers/specs/.*\.md''',
# Mock-данные для UI-разводки фронтенда (фиктивные имена/телефоны)
'''app/resources/js/composables/mockDeals\.ts''',
# Vitest-тесты с assertion на mock-данные (mock-телефоны из mockDeals)
'''app/tests/Frontend/.*\.(spec|test)\.ts''',
# Settings-вкладки с фиктивными mock-данными (профиль/сессии — UI-разводка)
'''app/resources/js/views/settings/.*\.vue''',
# Публичные реквизиты ПРОДАВЦА (ИП) — единый источник для футера/оферты/цен.
# По требованию ЮKassa контакты продавца (телефон/почта) обязаны быть публично
# на сайте; это не клиентские ПДн, а опубликованные бизнес-реквизиты.
'''app/resources/js/constants/legal\.ts''',
# Test fixtures for the observer PII filter — contains synthetic JWT / AWS /
# Yandex tokens that the filter is supposed to redact. Not real secrets.
'''tools/observer-pii-filter\.test\.mjs''',
# Test fixture for the secret-scanner / read-path-deny (M5) — PEM-header marker +
# AWS EXAMPLE key, used to verify detection. Not a real key; file deleted in brain split.
'''tools/enforce-read-path-deny\.test\.mjs'''
]
regexTarget = "match"
regexes = [
# Маскированные ПДн (правило §5.1 правил Claude)
'''\+7XXXXXXXXXX''',
'''\+7\s\(\*{3}\)\s\*{3}-\*{2}-\d{2}''',
'''\*{3}@\*{3}''',
'''u\*{3}@d\*{3}''',
# Шаблонные плейсхолдеры из шаблонов оферты/РКН/брендбука
'''\{\{[a-z_]+\}\}''',
'''\[ИНН\]''',
'''\[ОГРН\]''',
'''\[АДРЕС\]''',
'''\[ФИО[^\]]*\]''',
'''\[БАНК\]''',
'''\[Р/С\]''',
'''\[К/С\]''',
'''\[БИК\]''',
# Известные публичные реквизиты Yandex Cloud (публичная информация)
'''7704458262''',
# Стандартные плейсхолдеры для test/example email (не считаются ПДн)
'''[a-zA-Z0-9._%+-]+@(?:example\.|test\.|localhost|.*\.local|.*\.test)[a-zA-Z0-9.-]*''',
'''noreply@.*''',
'''support@.*''',
# Тестовые/демо-токены
'''sk-test-[A-Za-z0-9]+''',
'''pk_test_[A-Za-z0-9]+''',
'''example_[a-z_]+_token''',
# Известные publicly known keys из документации (для embed-примеров)
'''xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx''',
'''YOUR_TOKEN_HERE''',
'''YOUR_API_KEY''',
# Тестовые/демо-номера телефонов (не настоящие ПДн)
'''(?:\+?7|8)\s?\(?9000\)?\s?[\s\-]?000[\s\-]?00[\s\-]?00''',
'''(?:\+?7|8)\s?\(?900\)?\s?123[\s\-]?45[\s\-]?67''',
'''(?:\+?7|8)\s?\(?XXX\)?\s?XXX[\s\-]?XX[\s\-]?XX''',
'''79000000000''',
'''79991234567''',
'''74955551212''',
'''89991234567''',
# Plan 2: ABC-коды городов с тестовым tail "1234567" (PhonePrefixService docs/tests)
'''7\d{3}1234567''',
'''799912345678''',
'''7999123456''',
'''\+79991234567''',
'''7 999 123 45 67''',
# 12-значные номера-маски для скриншотов и тестов
'''[78]\(?[*X]{3}\)?\s?[*X]{3}[\s\-]?[*X]{2}[\s\-]?[*X0-9]{2}'''
]