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 принцип.