Проблема: Presidio оптимізований для США
Microsoft Presidio спочатку розроблений командою Microsoft з сильним фокусом на англомовний контент і американські ідентифікатори. Це чудовий інструмент — але для GDPR-відповідності в ЄС він потребує значного розширення.
Що Presidio виявляє добре
Стандартні ідентифікатори (всі юрисдикції):
- EMAIL_ADDRESS
- PHONE_NUMBER (міжнародний формат)
- PERSON (NER через spaCy)
- URL
- IP_ADDRESS
- CREDIT_CARD
US-специфічні:
- US_SSN
- US_BANK_NUMBER
- US_PASSPORT
- US_DRIVER_LICENSE
Що Presidio НЕ виявляє (EU-Gap)
Країни ЄС без покриття в Presidio (базовий)
| Країна | Ідентифікатор | Статус у Presidio |
|---|---|---|
| Італія | Codice Fiscale | Відсутній |
| Іспанія | NIF/NIE | Відсутній |
| Данія | CPR | Відсутній |
| Польща | PESEL | Відсутній |
| Нідерланди | BSN | Відсутній |
| Австрія | Sozialversicherungsnummer | Відсутній |
| Швеція | Personnummer | Відсутній |
| Норвегія | Personnummer | Відсутній |
| Фінляндія | Henkilötunnus | Відсутній |
| Греція | AFM/AMKA | Відсутній |
| Угорщина | TAJ-szám | Відсутній |
| Японія | My Number | Відсутній |
| Бразилія | CPF/CNPJ | Відсутній |
Критична прогалина: Якщо ваша організація обробляє дані резидентів ЄС і використовує лише базовий Presidio — ви пропускаєте більшість країна-специфічних ідентифікаторів.
Вирішення: Кастомні recognizers
Presidio дозволяє додавати кастомні recognizers через PatternRecognizer або EntityRecognizer.
Приклад: Codice Fiscale (Італія)
from presidio_analyzer import PatternRecognizer, Pattern
cf_pattern = Pattern(
name="codice_fiscale",
regex=r'[A-Z]{6}[0-9]{2}[A-Z][0-9]{2}[A-Z][0-9]{3}[A-Z]',
score=0.7
)
cf_recognizer = PatternRecognizer(
supported_entity="IT_CODICE_FISCALE",
patterns=[cf_pattern],
context=["codice fiscale", "CF", "C.F.", "codice"],
supported_language="it"
)
analyzer.registry.add_recognizer(cf_recognizer)
Приклад: PESEL (Польща)
Представляє більшу складність — алгоритм перевірки Luhn-подібний:
def validate_pesel(pesel: str) -> bool:
if len(pesel) != 11 or not pesel.isdigit():
return False
weights = [1, 3, 7, 9, 1, 3, 7, 9, 1, 3, 1]
total = sum(int(pesel[i]) * weights[i] for i in range(11))
return total % 10 == 0
class PeselRecognizer(EntityRecognizer):
def analyze(self, text, entities, nlp_artifacts):
results = []
for match in re.finditer(r'\b[0-9]{11}\b', text):
if validate_pesel(match.group()):
results.append(RecognizerResult(
entity_type='PL_PESEL',
start=match.start(),
end=match.end(),
score=0.9
))
return results
Підхід anonym.legal до покриття EU-ідентифікаторів
anonym.legal використовує Presidio як основу, але значно розширює його за допомогою:
- 285+ кастомних recognizers для 40+ юрисдикцій
- Алгоритмічна валідація для ідентифікаторів з контрольними цифрами (PESEL, CPR, IBAN)
- Контекстне покращення специфічне для кожної мови та юрисдикції
- Регулярне оновлення при змінах у стандартах ідентифікаторів
Пріоритетизація прогалин для вашої організації
Не потрібно закривати всі прогалини одразу. Пріоритизуйте на основі:
- Яких резидентів ЄС ви обслуговуєте? Якщо 80% клієнтів — з Польщі, PESEL — пріоритет 1
- Які ідентифікатори з'являються у ваших даних? Проведіть аудит існуючих даних
- Які ризики для регулятора? Якщо Garante вже розслідував вашу галузь — Codice Fiscale критичний
Висновок
Presidio — потужна основа, але для GDPR-відповідності в ЄС потребує розширення. Кастомні recognizers для країна-специфічних ідентифікаторів — необхідний крок для організацій, що обробляють дані резидентів ЄС.
Джерела: