Реализация 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 рабочих дней.







