anonym.legal
Назад к блогуGDPR и соблюдение

GDPR минимизация данных: обнаружение источника в...

GDPR требует минимизировать источник PII 'при сборке'. Узнайте как реализовать API-уровень обнаружение источника для соответствия Data Minimization...

April 21, 20267 мин чтения
GDPR data minimizationArticle 5real-time detectionAPI integrationform validation

GDPR Принцип: Data Minimization (Минимизация данных)

Статья 5(1)(c) GDPR

Личные данные должны быть адекватны, релевантны и ограничены необходимым в отношении целей, для которых они обрабатываются.

Что означает это?

Если вам не нужна полная история болезни для анализа, не собирайте её. Если вам не нужен SSN для открытия счета, не запрашивайте его.

Проблема: Собранные источники часто не соответствуют необходимости

Типичный сценарий

API для создания профиля пользователя:

ПОСТ /api/users
{
  "name": "John Smith",
  "email": "john@example.com",
  "phone": "+1-555-0123",
  "ssn": "123-45-6789",           // Не нужен для профиля!
  "medical_history": "...",      // Не нужна!
  "salary": "€50,000",            // Не нужна!
  "annual_revenue": "€5,000,000", // Не нужна!
}

GDPR нарушение: Собраны лишние данные (SSN, история болезни, зарплата, доход).

Решение: API-уровень обнаружение и отказ

Архитектура

Client Request
     |
     v
[API Gateway]
     |
     v
[Schema Validator] - JSON Schema проверка
     |
     v
[PII Analyzer] - Обнаружение неприемлемых данных
     |
     v
[Decision Engine] - Допустить или отказать
     |
     v
[Response/Rejection]

Пример реализации

from fastapi import FastAPI, HTTPException
from presidio_analyzer import AnalyzerEngine

app = FastAPI()
analyzer = AnalyzerEngine()

# Определяем какие поля требуют какие типы данных
EXPECTED_ENTITY_TYPES = {
    "name": ["PERSON"],
    "email": ["EMAIL_ADDRESS"],
    "phone": ["PHONE_NUMBER"],
    # SSN НЕ в списке - значит не допустим
    # medical_history НЕ в списке - значит не допустим
}

@app.post("/api/users")
async def create_user(user_data: dict):
    # Шаг 1: Проверяем каждое поле
    for field, value in user_data.items():
        if field not in EXPECTED_ENTITY_TYPES:
            raise HTTPException(
                status_code=400,
                detail=f"Field '{field}' not allowed by GDPR Data Minimization"
            )
        
        # Шаг 2: Анализируем содержимое
        results = analyzer.analyze(
            text=str(value),
            language="en"
        )
        
        # Шаг 3: Проверяем что только ожидаемые типы присутствуют
        expected_types = set(EXPECTED_ENTITY_TYPES[field])
        found_types = set(r.entity_type for r in results)
        unexpected_types = found_types - expected_types
        
        if unexpected_types:
            raise HTTPException(
                status_code=400,
                detail=f"Field '{field}' contains unexpected PII: {unexpected_types}"
            )
    
    # Шаг 4: Если всё ОК, создаём пользователя
    return create_user_in_db(user_data)

Источник обнаружения в действии

Сценарий 1: Легитимный запрос

ПОСТ /api/users
{
  "name": "John Smith",
  "email": "john@example.com",
  "phone": "+1-555-0123"
}

Ответ: 201 Created
User ID: user_12345

✅ Данные соответствуют ожиданиям GDPR Data Minimization.

Сценарий 2: Нарушение Data Minimization

ПОСТ /api/users
{
  "name": "John Smith",
  "email": "john@example.com",
  "phone": "+1-555-0123",
  "ssn": "123-45-6789"
}

Ответ: 400 Bad Request
{
  "error": "Field 'ssn' not allowed by GDPR Data Minimization",
  "status": "GDPR_VIOLATION"
}

❌ Попытка собрать SSN заблокирована.

Сценарий 3: Скрытое нарушение

ПОСТ /api/users
{
  "name": "John Smith",
  "email": "john@example.com",
  "phone": "+1-555-0123",
  "notes": "Patient with diagnosis of Type 2 Diabetes, SSN: 123-45-6789"
}

Ответ: 400 Bad Request
{
  "error": "Field 'notes' contains unexpected PII: SSN, MEDICAL_DIAGNOSIS",
  "status": "GDPR_VIOLATION"
}

❌ Попытка скрыть PII в поле 'notes' обнаружена.

Практическая реализация для разных API

REST API

# Используем middleware для всех POST/PUT запросов
from fastapi import Request
from fastapi.middleware.base import BaseHTTPMiddleware

class GDPRDataMinimizationMiddleware(BaseHTTPMiddleware):
    async def dispatch(self, request: Request, call_next):
        if request.method in ["POST", "PUT"]:
            body = await request.json()
            # Проверяем data minimization
            validate_data_minimization(body)
        
        response = await call_next(request)
        return response

GraphQL API

from graphene import ObjectType, String, Mutation

class CreateUserMutation(Mutation):
    class Arguments:
        name = String(required=True)
        email = String(required=True)
        phone = String(required=True)
        # ssn НЕ допустим
    
    @staticmethod
    def mutate(root, info, **kwargs):
        # Проверяем GDPR Data Minimization
        expected_fields = {"name", "email", "phone"}
        provided_fields = set(kwargs.keys())
        unexpected = provided_fields - expected_fields
        
        if unexpected:
            raise Exception(
                f"GDPR Violation: Unexpected fields {unexpected}"
            )
        
        return create_user_in_db(**kwargs)

Аудит требования

Для GDPR Data Minimization соответствия:

  • ✅ Все API endpoints должны иметь явное определение необходимых полей
  • ✅ API должна отклонять лишние PII данные с HTTP 400
  • ✅ Логирование всех попыток нарушения Data Minimization
  • ✅ Регулярная проверка логов на нарушения
  • ✅ Документация какие данные собираются и почему

Вывод

API-уровень обнаружение источника — это правильный способ реализовать GDPR Data Minimization принцип.

Готовы защитить ваши данные?

Начните анонимизацию PII с 285+ типов сущностей на 48 языках.