Реалізація Data Processing Agreement (DPA) для SaaS-приложення
Data Processing Agreement (DPA) — договір між контролером даних (клієнт SaaS) та обробником даних (SaaS-провайдер), обов'язковий за GDPR. Без DPA клієнт не може законно передавати персональні дані своїх користувачів SaaS-платформі.
Кому потрібен DPA від кого
Сценарій 1: Ваш SaaS обробляє дані користувачів клієнта Клієнт = контролер, ви = обробник. Клієнт запрошує у вас DPA.
Сценарій 2: Ваш SaaS використовує сторонні сервіси (AWS, Stripe, Mailgun) Ви = контролер або обробник, сторонній сервіс = субобробник. Потрібен DPA з кожним.
Що повинен містити DPA
1. Предмет і тривалість обробки
2. Природа та мета обробки
3. Тип персональних даних
4. Категорії суб'єктів даних
5. Зобов'язання та права контролера
Зобов'язання обробника (ст. 28 GDPR):
- Обробляти дані тільки по документованим інструкціям
- Гарантувати конфіденційність персоналу
- Прийняти технічні та організаційні заходи (TOM)
- Не залучати субобробників без згоди контролера
- Сприяти реалізації прав суб'єктів
- Видалити або повернути дані по закінченні договору
- Надати докази відповідності по запиту
Реалізація DPA-процесу в SaaS
class DPAManager:
def generate_dpa(self, customer_id: int) -> str:
"""Генерувати DPA для конкретного клієнта"""
customer = db.get_customer(customer_id)
dpa_variables = {
'customer_name': customer.legal_name,
'customer_address': customer.registered_address,
'customer_country': customer.country,
'saas_name': 'Our SaaS Company LLC',
'saas_address': '...',
'data_types': customer.data_types, # які дані обробляємо
'purposes': customer.processing_purposes,
'subprocessors': self.get_current_subprocessors(),
'date': datetime.now().strftime('%d.%m.%Y'),
'signature_placeholder': '__________'
}
template = self.load_template('dpa_template.md')
return template.format(**dpa_variables)
def get_current_subprocessors(self) -> list:
"""Актуальний список субобробників"""
return [
{'name': 'Amazon Web Services', 'purpose': 'Hosting', 'country': 'US',
'transfer_mechanism': 'SCCs'},
{'name': 'Stripe', 'purpose': 'Payment processing', 'country': 'US',
'transfer_mechanism': 'SCCs'},
{'name': 'SendGrid', 'purpose': 'Transactional email', 'country': 'US',
'transfer_mechanism': 'SCCs'},
{'name': 'Cloudflare', 'purpose': 'CDN and security', 'country': 'US',
'transfer_mechanism': 'SCCs'},
]
Підписання DPA через DocuSign/HelloSign
@app.route('/api/dpa/sign', methods=['POST'])
@require_admin
def initiate_dpa_signing():
customer_id = current_user.customer_id
dpa_content = dpa_manager.generate_dpa(customer_id)
# Створити підписний конверт
envelope = docusign_client.create_envelope(
document_content=dpa_content,
signers=[{
'email': request.json['signatory_email'],
'name': request.json['signatory_name'],
'role': 'Customer Signatory'
}, {
'email': DPA_INTERNAL_SIGNER_EMAIL,
'name': 'Our Legal Representative',
'role': 'Company Signatory'
}],
subject='Data Processing Agreement - Our SaaS',
message='Please review and sign the DPA.'
)
db.save_dpa_record(customer_id, envelope['envelope_id'], 'pending')
return jsonify({'envelope_id': envelope['envelope_id']})
@app.route('/webhooks/docusign', methods=['POST'])
def docusign_webhook():
event = request.json
if event['event'] == 'envelope-completed':
envelope_id = event['envelopeId']
dpa_record = db.get_dpa_by_envelope(envelope_id)
# Скачати підписаний PDF
pdf = docusign_client.get_document(envelope_id)
storage.upload(f"dpa/{dpa_record.customer_id}/dpa-signed.pdf", pdf)
db.update_dpa_record(envelope_id, status='signed',
signed_at=datetime.utcnow())
# Уведомити клієнта
send_email(dpa_record.customer_email,
subject='DPA підписан',
template='dpa_signed_confirmation')
Сторінка субобробників
GDPR вимагає уведомляти клієнтів про зміни списку субобробників:
class SubprocessorManager:
def add_subprocessor(self, name, purpose, country, transfer_mechanism):
# Зберегти новий субобробник
db.add_subprocessor(name, purpose, country, transfer_mechanism)
# Уведомити всіх клієнтів з активним DPA
customers_with_dpa = db.get_customers_with_signed_dpa()
for customer in customers_with_dpa:
send_email(
to=customer.dpa_contact_email,
subject=f'Зміна списку субобробників: додан {name}',
template='subprocessor_change',
vars={
'new_subprocessor': name,
'purpose': purpose,
'country': country,
'effective_date': (datetime.now() + timedelta(days=30)).strftime('%d.%m.%Y'),
'subprocessors_url': 'https://saas.com/legal/subprocessors'
}
)
# Клієнт має право возразити в течение 30 днів
Публічна сторінка субобробників
# Субобробники даних
Останнє оновлення: 01.03.2024
| Назва | Мета | Країна | Основання передачі |
|---|---|---|---|
| Amazon Web Services | Хостинг | США | SCC |
| Stripe | Платежі | США | SCC |
| SendGrid | Email | США | SCC |
| Cloudflare | CDN, безопасность | США | SCC |
SCC = Standard Contractual Clauses (Стандартні договірні положення ЄС)
Срок выполнения
Реалізація DPA-процесу з генерацією, підписанням та управлінням субобробниками — 3–5 робочих днів.







