Kepatuhan Regulasi: GDPR dan SOC2
Minimalisasi data, pelacakan persetujuan, dan kontrol akses untuk agen yang patuh.
Kepatuhan Regulasi: GDPR dan SOC2 adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Mengapa Peraturan Berlaku bagi Agen AI
Agen AI memproses data pengguna, membuat keputusan, dan melakukan tindakan. Hal ini membuat agen tersebut secara langsung termasuk dalam cakupan peraturan perlindungan data (GDPR) dan kerangka kerja keamanan (SOC 2).
Kepatuhan bukanlah pilihan — pelanggaran dapat dikenai denda hingga 4% dari pendapatan tahunan global berdasarkan GDPR.
GDPR: Minimalisasi Data
Prinsip minimalisasi data dalam GDPR mengharuskan pengumpulan hanya data pribadi yang benar-benar diperlukan untuk tujuan yang dinyatakan. Agen tidak boleh menyimpan transkrip percakapan lengkap jika hanya hasilnya (terselesaikan/belum terselesaikan) yang diperlukan untuk analitik.
def minimized_log_entry(conversation: list[dict], user_id: str) -> dict:
'''Store only what is needed — not the full transcript.'''
return {
'user_id': user_id,
'timestamp': conversation[-1].get('timestamp'),
'turns': len(conversation),
'resolved': conversation[-1].get('resolved', False),
'intent': conversation[-1].get('intent'),
'satisfaction': conversation[-1].get('csat_score'),
# NOT stored: full message text, PII mentioned in conversation
}
# WRONG — stores raw messages which may contain PII
# {'messages': conversation, 'user_id': user_id}
if __name__ == '__main__':
conversation = [
{'timestamp': 1717000000, 'resolved': True, 'intent': 'reset_password', 'csat_score': 5}
]
print('Minimized log entry:', minimized_log_entry(conversation, user_id='u42'))
GDPR: Melacak Persetujuan
Sebelum agen memproses data pribadi, Anda harus memiliki dasar hukum — biasanya persetujuan pengguna. Lacak kapan persetujuan diberikan, hal-hal yang dicakupnya, dan hormati pencabutannya.
from datetime import datetime, timezone
consent_store: dict[str, dict] = {} # user_id -> consent record
def record_consent(user_id: str, purpose: str, version: str = '1.0'):
if user_id not in consent_store:
consent_store[user_id] = {'purposes': {}}
consent_store[user_id]['purposes'][purpose] = {
'granted': True,
'timestamp': datetime.now(timezone.utc).isoformat(),
'version': version
}
def withdraw_consent(user_id: str, purpose: str):
if user_id in consent_store:
consent_store[user_id]['purposes'].pop(purpose, None)
def has_consent(user_id: str, purpose: str) -> bool:
return bool(
consent_store.get(user_id, {}).get('purposes', {}).get(purpose, {}).get('granted')
)
if __name__ == '__main__':
record_consent('u42', 'marketing_emails')
print('Has consent:', has_consent('u42', 'marketing_emails'))
withdraw_consent('u42', 'marketing_emails')
print('Has consent after withdrawal:', has_consent('u42', 'marketing_emails'))
GDPR: Hak untuk Menghapus (Hak untuk Dilupakan)
Ketika pengguna meminta penghapusan, agen harus menghapus semua data pribadi yang terkait dengan pengguna tersebut — termasuk catatan agen, riwayat percakapan, dan profil yang disimpan sementara. Hal ini harus dilakukan dalam waktu 30 hari sejak permintaan diterima.
import os
def erase_user_data(user_id: str, conn) -> dict:
'''Delete all personal data for a user across all storage systems.'''
deleted = {}
# 1. Delete from audit log (if not using WORM storage)
with conn.cursor() as cur:
cur.execute('DELETE FROM agent_audit_log WHERE user_id = %s', (user_id,))
deleted['audit_log_rows'] = cur.rowcount
# 2. Delete conversation history
with conn.cursor() as cur:
cur.execute('DELETE FROM conversation_history WHERE user_id = %s', (user_id,))
deleted['conversations'] = cur.rowcount
# 3. Remove consent record
consent_store.pop(user_id, None)
deleted['consent_record'] = 1
# 4. Clear cached profile
profile_cache = {} # reference to your cache
profile_cache.pop(user_id, None)
deleted['profile_cache'] = 1
conn.commit()
return {'user_id': user_id, 'erased': deleted}GDPR: Portabilitas Data
Pengguna berhak menerima datanya dalam format yang dapat dibaca mesin (misalnya, JSON atau CSV). Bangun fungsi ekspor yang mengumpulkan semua data tentang pengguna yang tersimpan di seluruh sistem agen.
import json
def export_user_data(user_id: str, conn) -> str:
export = {'user_id': user_id, 'data': {}}
with conn.cursor() as cur:
cur.execute(
'SELECT timestamp, action_type, result FROM agent_audit_log '
'WHERE user_id = %s ORDER BY timestamp',
(user_id,)
)
rows = cur.fetchall()
export['data']['audit_log'] = [
{'timestamp': r[0], 'action': r[1], 'result': r[2]}
for r in rows
]
export['data']['consent'] = consent_store.get(user_id, {})
return json.dumps(export, indent=2)SOC 2: Pengendalian Akses
SOC 2 Tipe II mengharuskan pembuktian bahwa akses ke sistem dan data dibatasi hanya bagi pihak yang berwenang. Untuk agen, hal ini berarti: akses berbasis peran ke alat agen, MFA untuk akses administrator, dan peninjauan akses secara berkala.
ROLE_PERMISSIONS = {
'agent_basic': {'web_search', 'read_file', 'query_database'},
'agent_email': {'web_search', 'read_file', 'query_database', 'send_email'},
'agent_admin': {'web_search', 'read_file', 'write_file', 'query_database',
'send_email', 'create_ticket', 'execute_python_sandbox'},
'human_admin': {'*'} # all permissions
}
def get_permitted_actions(role: str) -> set:
perms = ROLE_PERMISSIONS.get(role, set())
if '*' in perms:
return ALLOWED_ACTIONS # reference to full allowlist
return perms
def check_role_permission(role: str, action: str) -> bool:
return action in get_permitted_actions(role)SOC 2: Enkripsi Data Saat Tersimpan dan Saat Transit
SOC 2 mewajibkan enkripsi data sensitif saat tersimpan (enkripsi basis data, disk terenkripsi) dan saat transit (TLS 1.2+). Untuk agen, ini berarti: penyimpanan percakapan terenkripsi, penggunaan TLS pada semua pemanggilan API, serta tidak adanya rahasia dalam bentuk teks biasa di catatan.
from cryptography.fernet import Fernet
import os
# Key stored in environment variable, never in code
ENCRYPTION_KEY = os.environ.get('LOG_ENCRYPTION_KEY', Fernet.generate_key())
cipher = Fernet(ENCRYPTION_KEY)
def encrypt_sensitive_field(value: str) -> str:
return cipher.encrypt(value.encode()).decode()
def decrypt_sensitive_field(encrypted: str) -> str:
return cipher.decrypt(encrypted.encode()).decode()
# Usage: encrypt PII before storing in audit log
encrypted_email = encrypt_sensitive_field('user@example.com')
print(encrypted_email[:30], '...') # starts with gAAAA...SOC 2: Catatan Audit untuk Peristiwa Keamanan
Auditor SOC 2 ingin melihat catatan peristiwa keamanan: upaya login, akses ke data sensitif, perubahan konfigurasi, dan pelanggaran kebijakan. Catatan ini harus disimpan dengan aman dan dipertahankan setidaknya selama 1 tahun.
import logging, json, time
security_logger = logging.getLogger('agent.security')
SECURITY_EVENTS = {
'auth_success', 'auth_failure', 'policy_violation',
'data_access_pii', 'admin_action', 'config_change'
}
def log_security_event(event_type: str, agent_id: str,
user_id: str, details: dict):
assert event_type in SECURITY_EVENTS, f'Unknown security event: {event_type}'
entry = {
'timestamp': time.time(),
'event_type': event_type,
'agent_id': agent_id,
'user_id': user_id,
'details': details
}
security_logger.warning(json.dumps(entry))
if __name__ == '__main__':
import sys
security_logger.addHandler(logging.StreamHandler(sys.stdout))
log_security_event('auth_failure', 'agent-1', 'user-42', {'reason': 'bad_token'})
Melacak PII dalam Keluaran Agen
Agen sebaiknya tidak menyertakan PII dalam keluaran yang dicatat atau dikirim ke layanan pihak ketiga (analitik, pemantauan). Pindai konten yang akan dikirim untuk menemukan pola PII sebelum transmisi.
import re
PII_PATTERNS = [
(r'\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b', 'email'),
(r'\b\d{3}[-.]?\d{3}[-.]?\d{4}\b', 'phone'),
(r'\b\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}\b', 'credit_card'),
(r'\b\d{3}-\d{2}-\d{4}\b', 'ssn')
]
def redact_pii(text: str) -> tuple[str, list[str]]:
redacted = text
found_types = []
for pattern, pii_type in PII_PATTERNS:
if re.search(pattern, redacted):
found_types.append(pii_type)
redacted = re.sub(pattern, f'[{pii_type.upper()}_REDACTED]', redacted)
return redacted, found_types
text, types = redact_pii('Contact john@example.com or call 555-867-5309')
print(text)
print('PII found:', types)Menyusun Daftar Periksa Kepatuhan
Sebelum menerapkan agen yang menangani data pribadi, pastikan kontrol berikut telah tersedia.
COMPLIANCE_CHECKLIST = [
('GDPR', 'Consent captured before processing personal data'),
('GDPR', 'Data minimization: only necessary data is collected'),
('GDPR', 'Right-to-erasure endpoint implemented and tested'),
('GDPR', 'Data portability export available'),
('GDPR', 'Data retention policy enforced (auto-delete after N days)'),
('SOC2', 'Role-based access control implemented for all agent tools'),
('SOC2', 'All data encrypted at rest and in transit (TLS 1.2+)'),
('SOC2', 'Security events logged and retained for 12+ months'),
('SOC2', 'Access reviews scheduled quarterly'),
('SOC2', 'Incident response plan documented'),
('BOTH', 'PII redaction applied to logs and analytics exports'),
('BOTH', 'Vendor DPAs signed for all third-party APIs used'),
]
for framework, control in COMPLIANCE_CHECKLIST:
print(f'[ ] [{framework}] {control}')Otomatisasi Penyimpanan Data
GDPR mewajibkan data dihapus ketika tidak lagi diperlukan untuk tujuan awalnya. Otomatiskan hal ini dengan tugas kebijakan penyimpanan yang menghapus catatan lama berdasarkan periode penyimpanan yang dapat dikonfigurasi.
from datetime import datetime, timedelta, timezone
RETENTION_POLICIES = {
'conversation_history': 90, # days
'agent_audit_log': 365,
'cached_profiles': 1,
'session_data': 30
}
def purge_expired_data(conn):
purged = {}
for table, retention_days in RETENTION_POLICIES.items():
cutoff = datetime.now(timezone.utc) - timedelta(days=retention_days)
try:
with conn.cursor() as cur:
cur.execute(
f'DELETE FROM {table} WHERE timestamp < %s',
(cutoff.timestamp(),)
)
purged[table] = cur.rowcount
except Exception as e:
purged[table] = f'Error: {e}'
conn.commit()
return purged
if __name__ == '__main__':
class FakeCursor:
def __enter__(self):
return self
def __exit__(self, *exc):
return False
def execute(self, sql, params):
self.rowcount = 3
class FakeConn:
def cursor(self):
return FakeCursor()
def commit(self):
pass
result = purge_expired_data(FakeConn())
print('Rows purged per table:')
for table, count in result.items():
print(f' {table}: {count}')
Apa prinsip minimisasi data dalam GDPR?
Minimisasi data merupakan salah satu prinsip utama GDPR dan secara langsung memengaruhi cara sistem agen harus dirancang sejak awal.
Rangkuman Kepatuhan terhadap GDPR dan SOC 2
Kepatuhan terhadap GDPR memerlukan: pelacakan persetujuan, minimisasi data, penerapan hak untuk menghapus data, ekspor portabilitas, dan penyamaran PII dalam catatan.
SOC 2 memerlukan: kontrol akses berbasis peran, enkripsi saat data tersimpan dan saat transit, pencatatan peristiwa keamanan, serta peninjauan akses. Otomatiskan kebijakan penyimpanan untuk menghapus data yang sudah kedaluwarsa.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Kepatuhan Regulasi: GDPR dan SOC2” gratis?
Ya — teks lengkap “Kepatuhan Regulasi: GDPR dan SOC2” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Kepatuhan Regulasi: GDPR dan SOC2”?
Minimalisasi data, pelacakan persetujuan, dan kontrol akses untuk agen yang patuh. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Kepatuhan Regulasi: GDPR dan SOC2” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Pencatatan Tindakan Agen yang Tidak Dapat Diubah
- Penegakan Kebijakan untuk Tindakan Agen
- Kepatuhan Regulasi: GDPR dan SOC2
- Gerbang Persetujuan dengan Keterlibatan Manusia