AI Agents · درس

الامتثال التنظيمي: GDPR وSOC2

تقليل البيانات إلى الحد الأدنى، وتتبع الموافقات، والتحكم في الوصول للوكلاء الممتثلين.

الدرس 3 من 413 خطوة

الامتثال التنظيمي: GDPR وSOC2 درس مجاني في AI Agents على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في AI Agents، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة AI Agents 4 دروس في المجموع.

لماذا تنطبق اللوائح على وكلاء الذكاء الاصطناعي؟

يعالج وكلاء الذكاء الاصطناعي بيانات المستخدمين، ويتخذون قرارات، وينفذون إجراءات. ويضعهم ذلك مباشرةً ضمن نطاق لوائح حماية البيانات (GDPR) وأطر الأمان (SOC 2).

الامتثال ليس اختياريًا — إذ قد تصل غرامات الانتهاكات بموجب GDPR إلى 4% من الإيرادات السنوية العالمية.

GDPR: تقليل البيانات

يفرض مبدأ تقليل البيانات في GDPR جمع البيانات الشخصية الضرورية تمامًا للغرض المحدد فقط. فلا ينبغي للوكيل تخزين نصوص المحادثات الكاملة إذا كانت النتيجة فقط (تم الحل/لم يتم الحل) هي المطلوبة لأغراض التحليلات.

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: تتبع الموافقة

قبل أن يعالج الوكيل البيانات الشخصية، يجب أن يتوفر لديك أساس قانوني — وعادةً ما يكون موافقة المستخدم. تتبّع وقت تقديم الموافقة، وما تغطيه، واحترم عمليات سحبها.

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: الحق في المحو (الحق في النسيان)

عندما يطلب المستخدم حذف بياناته، يجب على الوكيل محو جميع البيانات الشخصية المرتبطة به — بما في ذلك سجلات الوكيل، وسجل المحادثات، والملفات الشخصية المخزنة مؤقتًا. ويجب تنفيذ ذلك خلال 30 يومًا من تقديم الطلب.

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: قابلية نقل البيانات

يحق للمستخدمين تلقي بياناتهم بتنسيق قابل للقراءة آليًا (مثل JSON أو CSV). أنشئ وظيفة تصدير تجمع جميع البيانات المخزنة عن المستخدم عبر أنظمة الوكيل.

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: التحكم في الوصول

يتطلب SOC 2 Type II إثبات تقييد الوصول إلى الأنظمة والبيانات على الأفراد المصرح لهم. وبالنسبة إلى الوكيل، يعني ذلك: وصولًا قائمًا على الأدوار إلى أدوات الوكيل، وMFA لوصول المسؤولين، ومراجعات دورية للوصول.

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: التشفير أثناء التخزين وأثناء النقل

يتطلب SOC 2 تشفير البيانات الحساسة أثناء التخزين (تشفير قواعد البيانات والأقراص المشفّرة) وأثناء النقل (باستخدام TLS 1.2 أو إصدار أحدث). وبالنسبة إلى الوكلاء، يعني ذلك: تخزين المحادثات بشكل مشفّر، واستخدام TLS في جميع استدعاءات API، وعدم تسجيل الأسرار بنص واضح في السجلات.

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: سجلات التدقيق لأحداث الأمان

يريد مدققو SOC 2 الاطلاع على سجلات أحداث الأمان، مثل: محاولات تسجيل الدخول، والوصول إلى البيانات الحساسة، وتغييرات الإعدادات، وانتهاكات السياسات. ويجب تخزين هذه السجلات بأمان والاحتفاظ بها لمدة سنة واحدة على الأقل.

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'})

تتبّع معلومات التعريف الشخصية في مخرجات الوكيل

يجب ألا تتضمن مخرجات الوكلاء معلومات التعريف الشخصية (PII) في البيانات التي يتم تسجيلها أو إرسالها إلى خدمات تابعة لجهات خارجية (مثل التحليلات والمراقبة). افحص المحتوى الصادر بحثًا عن أنماط PII قبل إرساله.

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)

إنشاء قائمة تحقق للامتثال

قبل نشر وكيل يتعامل مع البيانات الشخصية، تحقّق من تطبيق عناصر التحكم التالية.

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}')

أتمتة الاحتفاظ بالبيانات

تتطلب اللائحة العامة لحماية البيانات (GDPR) حذف البيانات عندما لا تعود مطلوبة للغرض الأصلي الذي جُمعت من أجله. أتمت ذلك باستخدام مهمة لسياسة الاحتفاظ تحذف السجلات القديمة استنادًا إلى فترات احتفاظ قابلة للتهيئة.

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}')

ما مبدأ تقليل البيانات في GDPR؟

يُعد تقليل البيانات أحد المبادئ الأساسية في GDPR، ويؤثر مباشرةً في كيفية تصميم أنظمة الوكلاء منذ البداية.

مراجعة الامتثال لـ GDPR وSOC 2

يتطلب الامتثال لـ GDPR: تتبّع الموافقة، وتقليل البيانات، وتطبيق الحق في المحو، وتصديرات قابلية نقل البيانات، وتنقيح PII في السجلات.

يتطلب SOC 2: التحكم في الوصول المستند إلى الأدوار، وتشفير البيانات أثناء التخزين والنقل، وتسجيل أحداث الأمان، ومراجعات الوصول. أتمت سياسات الاحتفاظ لحذف البيانات منتهية الصلاحية.

البدء مجانًا

تعلم AI Agents مع معلم ذكاء اصطناعي — مجانًا

اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.

الدورات
60
الدروس
239

الأسئلة الشائعة

هل درس «الامتثال التنظيمي: GDPR وSOC2» مجاني؟

نعم — نص درس «الامتثال التنظيمي: GDPR وSOC2» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة AI Agents، انتقل إلى CoddyKit PRO. تتضمن دورة AI Agents 4 دروس في المجموع.

ماذا ستتعلم في «الامتثال التنظيمي: GDPR وSOC2»؟

تقليل البيانات إلى الحد الأدنى، وتتبع الموافقات، والتحكم في الوصول للوكلاء الممتثلين. تتمرن على AI Agents مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ AI Agents؟

لا تُشترط خبرة سابقة. AI Agents على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الامتثال التنظيمي: GDPR وSOC2»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس AI Agents هذا؟

نعم. كل درس في AI Agents يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تسجيل الإجراءات غير القابل للتغيير للوكلاء
  2. فرض السياسات على إجراءات الوكيل
  3. الامتثال التنظيمي: GDPR وSOC2
  4. بوابات الموافقة بوجود الإنسان ضمن الحلقة
← العودة إلى AI Agents