172 lines
8.6 KiB
TOML
172 lines
8.6 KiB
TOML
# Конфигурация 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}'''
|
||
]
|