Regulatory Compliance

Part of Module 5: Security & Compliance

Navigating the complex regulatory landscape for AI systems requires understanding various compliance frameworks. This module covers HIPAA for healthcare, GDPR for data protection, SOC2 for security controls, ISO standards, and emerging AI-specific regulations like the EU AI Act.

HIPAA Compliance for Healthcare AI

HIPAA Requirements for AI Systems

The Health Insurance Portability and Accountability Act (HIPAA) governs how AI systems handle Protected Health Information (PHI) in healthcare settings.

Key HIPAA Components for AI:

  • Privacy Rule: Controls use and disclosure of PHI
  • Security Rule: Technical safeguards for ePHI
  • Breach Notification: Requirements for incident reporting
  • Minimum Necessary: Limit PHI access to required amount
  • Business Associate Agreements: Third-party compliance
# HIPAA compliance framework for AI systems
import hashlib
import json
from datetime import datetime, timedelta
from typing import Dict, List, Optional, Any
from cryptography.fernet import Fernet
from dataclasses import dataclass
import logging

@dataclass
class PHIAccess:
    """Track PHI access for HIPAA audit"""
    user_id: str
    patient_id: str
    data_accessed: List[str]
    purpose: str
    timestamp: datetime
    ip_address: str

class HIPAACompliantAI:
    """HIPAA-compliant AI system for healthcare"""
    
    def __init__(self):
        self.encryption_key = Fernet.generate_key()
        self.cipher = Fernet(self.encryption_key)
        self.audit_log = []
        self.setup_logging()
    
    def setup_logging(self):
        """Configure HIPAA-compliant audit logging"""
        logging.basicConfig(
            filename='hipaa_audit.log',
            level=logging.INFO,
            format='%(asctime)s - %(levelname)s - %(message)s'
        )
    
    def encrypt_phi(self, phi_data: Dict) -> bytes:
        """Encrypt PHI data at rest"""
        json_data = json.dumps(phi_data)
        encrypted = self.cipher.encrypt(json_data.encode())
        return encrypted
    
    def decrypt_phi(self, encrypted_data: bytes) -> Dict:
        """Decrypt PHI data with audit trail"""
        decrypted = self.cipher.decrypt(encrypted_data)
        return json.loads(decrypted.decode())
    
    def de_identify_data(self, patient_data: Dict) -> Dict:
        """Remove HIPAA identifiers (Safe Harbor method)"""
        
        # 18 HIPAA identifiers to remove
        identifiers = [
            'name', 'address', 'dates', 'phone', 'fax',
            'email', 'ssn', 'medical_record_number',
            'health_plan_number', 'account_number',
            'license_number', 'vehicle_id', 'device_id',
            'url', 'ip_address', 'biometric',
            'photo', 'unique_identifier'
        ]
        
        de_identified = patient_data.copy()
        
        for identifier in identifiers:
            if identifier in de_identified:
                # Replace with hash for consistency
                de_identified[identifier] = self._hash_identifier(
                    de_identified[identifier]
                )
        
        # Handle dates (keep year only if age < 90)
        if 'birth_date' in de_identified:
            birth_year = de_identified['birth_date'][:4]
            age = datetime.now().year - int(birth_year)
            if age >= 90:
                de_identified['birth_date'] = '90+'
            else:
                de_identified['birth_date'] = birth_year
        
        return de_identified
    
    def _hash_identifier(self, identifier: str) -> str:
        """Create consistent hash for identifier"""
        return hashlib.sha256(str(identifier).encode()).hexdigest()[:10]
    
    def check_minimum_necessary(self,
                                user_role: str,
                                requested_fields: List[str]) -> List[str]:
        """Enforce minimum necessary standard"""
        
        role_permissions = {
            'physician': ['diagnosis', 'treatment', 'medications', 
                          'lab_results', 'medical_history'],
            'nurse': ['vitals', 'medications', 'allergies'],
            'researcher': ['de_identified_data'],
            'billing': ['procedure_codes', 'insurance'],
            'ai_model': ['de_identified_data', 'lab_results']
        }
        
        allowed_fields = role_permissions.get(user_role, [])
        
        # Return only permitted fields
        return [field for field in requested_fields 
                if field in allowed_fields]
    
    def log_phi_access(self, access: PHIAccess):
        """Log PHI access for HIPAA audit trail"""
        
        log_entry = {
            'timestamp': access.timestamp.isoformat(),
            'user_id': access.user_id,
            'patient_id': self._hash_identifier(access.patient_id),
            'data_accessed': access.data_accessed,
            'purpose': access.purpose,
            'ip_address': access.ip_address
        }
        
        self.audit_log.append(log_entry)
        logging.info(f"PHI Access: {json.dumps(log_entry)}")
    
    def detect_potential_breach(self,
                                access_patterns: List[PHIAccess]) -> bool:
        """Detect potential HIPAA breaches"""
        
        # Check for suspicious patterns
        user_access_count = {}
        
        for access in access_patterns:
            user_id = access.user_id
            if user_id not in user_access_count:
                user_access_count[user_id] = 0
            user_access_count[user_id] += 1
        
        # Flag if user accessed too many records
        for user_id, count in user_access_count.items():
            if count > 100:  # Threshold for suspicious activity
                logging.warning(
                    f"Potential breach: User {user_id} accessed {count} records"
                )
                return True
        
        return False
    
    def generate_baa_requirements(self) -> Dict:
        """Generate Business Associate Agreement requirements"""
        
        return {
            'safeguards': [
                'Implement administrative safeguards',
                'Implement physical safeguards',
                'Implement technical safeguards'
            ],
            'permitted_uses': [
                'Perform functions on behalf of covered entity',
                'Provide data aggregation services',
                'Management and administration'
            ],
            'required_provisions': [
                'Report breaches to covered entity',
                'Ensure subcontractors sign BAA',
                'Make PHI available for access',
                'Return or destroy PHI at termination'
            ]
        }

HIPAA Technical Safeguards for AI

  • Access Control: Unique user identification, automatic logoff
  • Audit Controls: Hardware, software, procedural mechanisms
  • Integrity: PHI not improperly altered or destroyed
  • Transmission Security: Encryption in transit

GDPR Compliance for AI

General Data Protection Regulation Requirements

GDPR sets strict rules for AI systems processing personal data of EU residents, emphasizing transparency, consent, and individual rights.

# GDPR compliance framework for AI systems
import uuid
from enum import Enum
from typing import Dict, List, Optional

class LawfulBasis(Enum):
    CONSENT = "consent"
    CONTRACT = "contract"
    LEGAL_OBLIGATION = "legal_obligation"
    VITAL_INTERESTS = "vital_interests"
    PUBLIC_TASK = "public_task"
    LEGITIMATE_INTERESTS = "legitimate_interests"

class GDPRCompliantAI:
    """GDPR-compliant AI system"""
    
    def __init__(self):
        self.consent_records = {}
        self.processing_activities = []
        self.data_subjects = {}
    
    def obtain_consent(self,
                       data_subject_id: str,
                       purposes: List[str],
                       data_categories: List[str]) -> str:
        """Obtain and record GDPR-compliant consent"""
        
        consent_id = str(uuid.uuid4())
        
        self.consent_records[consent_id] = {
            'data_subject_id': data_subject_id,
            'timestamp': datetime.now().isoformat(),
            'purposes': purposes,
            'data_categories': data_categories,
            'freely_given': True,
            'specific': True,
            'informed': True,
            'unambiguous': True,
            'withdrawable': True,
            'version': '1.0'
        }
        
        return consent_id
    
    def withdraw_consent(self, consent_id: str) -> bool:
        """Process consent withdrawal"""
        
        if consent_id in self.consent_records:
            self.consent_records[consent_id]['withdrawn'] = True
            self.consent_records[consent_id]['withdrawn_at'] = \
                datetime.now().isoformat()
            
            # Stop processing based on this consent
            self._halt_processing(consent_id)
            return True
        
        return False
    
    def conduct_dpia(self, ai_system: Dict) -> Dict:
        """Conduct Data Protection Impact Assessment"""
        
        dpia = {
            'system_name': ai_system['name'],
            'assessment_date': datetime.now().isoformat(),
            'high_risk_processing': False,
            'risks': [],
            'mitigations': []
        }
        
        # Check for high-risk processing
        high_risk_indicators = [
            ai_system.get('automated_decision_making', False),
            ai_system.get('large_scale_processing', False),
            ai_system.get('sensitive_data', False),
            ai_system.get('systematic_monitoring', False),
            ai_system.get('profiling', False)
        ]
        
        if sum(high_risk_indicators) >= 2:
            dpia['high_risk_processing'] = True
            dpia['requires_dpo_consultation'] = True
        
        # Identify risks
        if ai_system.get('automated_decision_making'):
            dpia['risks'].append({
                'risk': 'Automated decision without human oversight',
                'severity': 'high',
                'likelihood': 'medium'
            })
            dpia['mitigations'].append(
                'Implement human review process'
            )
        
        if ai_system.get('profiling'):
            dpia['risks'].append({
                'risk': 'Discriminatory profiling',
                'severity': 'high',
                'likelihood': 'medium'
            })
            dpia['mitigations'].append(
                'Regular bias testing and fairness audits'
            )
        
        return dpia
    
    def handle_data_subject_request(self,
                                   request_type: str,
                                   data_subject_id: str) -> Dict:
        """Handle GDPR data subject rights requests"""
        
        response = {
            'request_id': str(uuid.uuid4()),
            'request_type': request_type,
            'data_subject_id': data_subject_id,
            'received_at': datetime.now().isoformat(),
            'status': 'processing'
        }
        
        if request_type == 'access':
            # Right to access (Article 15)
            response['data'] = self._get_subject_data(data_subject_id)
            response['processing_purposes'] = self._get_processing_purposes(
                data_subject_id
            )
            
        elif request_type == 'rectification':
            # Right to rectification (Article 16)
            response['rectification_form'] = self._generate_rectification_form()
            
        elif request_type == 'erasure':
            # Right to erasure/be forgotten (Article 17)
            response['erasure_result'] = self._erase_subject_data(
                data_subject_id
            )
            
        elif request_type == 'portability':
            # Right to data portability (Article 20)
            response['portable_data'] = self._export_portable_data(
                data_subject_id
            )
            
        elif request_type == 'restriction':
            # Right to restriction (Article 18)
            response['restriction_applied'] = self._restrict_processing(
                data_subject_id
            )
            
        elif request_type == 'object':
            # Right to object (Article 21)
            response['objection_result'] = self._process_objection(
                data_subject_id
            )
        
        response['status'] = 'completed'
        response['completed_at'] = datetime.now().isoformat()
        
        return response
    
    def implement_privacy_by_design(self) -> Dict:
        """Implement privacy by design principles"""
        
        return {
            'proactive': 'Preventive not remedial approach',
            'default': 'Privacy as default setting',
            'embedded': 'Privacy embedded into design',
            'positive_sum': 'Full functionality with privacy',
            'lifecycle': 'End-to-end security',
            'visibility': 'Transparency and openness',
            'user_centric': 'Respect for user privacy'
        }

GDPR Penalties

  • Up to €20 million or 4% of annual global turnover (whichever is higher)
  • Applies to data controllers and processors
  • Extraterritorial scope - applies globally if processing EU resident data

SOC2 Compliance

SOC2 Trust Service Criteria for AI

Service Organization Control 2 (SOC2) compliance demonstrates that AI systems meet security, availability, processing integrity, confidentiality, and privacy standards.

Five Trust Service Criteria:

  • Security: Protection against unauthorized access
  • Availability: System accessible as agreed
  • Processing Integrity: Complete, valid, accurate processing
  • Confidentiality: Information designated as confidential is protected
  • Privacy: Personal information handled per privacy notice
# SOC2 compliance monitoring for AI systems
class SOC2ComplianceMonitor:
    """Monitor and ensure SOC2 compliance"""
    
    def __init__(self):
        self.controls = {}
        self.evidence = []
        self.exceptions = []
    
    def implement_security_controls(self) -> Dict:
        """Implement SOC2 security criteria controls"""
        
        controls = {
            'CC6.1': {
                'description': 'Logical and physical access controls',
                'implementation': [
                    'Multi-factor authentication',
                    'Role-based access control',
                    'Biometric data center access'
                ]
            },
            'CC6.2': {
                'description': 'Encryption at rest and in transit',
                'implementation': [
                    'AES-256 encryption for data at rest',
                    'TLS 1.3 for data in transit',
                    'Key management system'
                ]
            },
            'CC6.3': {
                'description': 'Vulnerability management',
                'implementation': [
                    'Weekly vulnerability scans',
                    'Quarterly penetration testing',
                    'Patch management process'
                ]
            }
        }
        
        self.controls.update(controls)
        return controls
    
    def monitor_availability(self, 
                            uptime_percentage: float,
                            response_time_ms: float) -> Dict:
        """Monitor availability criteria"""
        
        availability_status = {
            'uptime': uptime_percentage,
            'meets_sla': uptime_percentage >= 99.9,
            'response_time': response_time_ms,
            'acceptable_response': response_time_ms < 1000
        }
        
        if not availability_status['meets_sla']:
            self.exceptions.append({
                'criteria': 'Availability',
                'issue': f"Uptime {uptime_percentage}% below 99.9% SLA",
                'timestamp': datetime.now().isoformat()
            })
        
        return availability_status
    
    def validate_processing_integrity(self,
                                     model_outputs: List[Dict]) -> Dict:
        """Validate AI model processing integrity"""
        
        integrity_checks = {
            'completeness': True,
            'validity': True,
            'accuracy': True,
            'timeliness': True,
            'authorization': True
        }
        
        for output in model_outputs:
            # Check completeness
            if not all(k in output for k in ['input', 'output', 'timestamp']):
                integrity_checks['completeness'] = False
            
            # Check validity
            if output.get('confidence', 0) < 0.7:
                integrity_checks['validity'] = False
        
        return integrity_checks
    
    def generate_soc2_report(self) -> Dict:
        """Generate SOC2 Type II report evidence"""
        
        return {
            'report_type': 'SOC2 Type II',
            'period': {
                'start': (datetime.now() - timedelta(days=365)).isoformat(),
                'end': datetime.now().isoformat()
            },
            'controls_tested': len(self.controls),
            'exceptions_noted': len(self.exceptions),
            'opinion': 'Unqualified' if len(self.exceptions) == 0 else 'Qualified',
            'controls': self.controls,
            'exceptions': self.exceptions,
            'management_assertion': True
        }

ISO 27001 Certification

ISO 27001 Information Security Management

ISO 27001 provides a framework for establishing, implementing, maintaining, and continuously improving information security management systems for AI.

Key ISO 27001 Controls for AI:

  • A.5: Information security policies
  • A.6: Organization of information security
  • A.8: Asset management
  • A.9: Access control
  • A.12: Operations security
  • A.14: System acquisition and development
  • A.16: Incident management
  • A.18: Compliance

EU AI Act Compliance

EU AI Act Risk Categories

The EU AI Act categorizes AI systems by risk level and imposes requirements accordingly.

Risk Level Examples Requirements
Unacceptable Risk Social scoring, real-time biometric identification Prohibited
High Risk Healthcare AI, recruitment, credit scoring Conformity assessment, registration, ongoing monitoring
Limited Risk Chatbots, emotion recognition Transparency obligations
Minimal Risk Spam filters, AI-enabled games No obligations
# EU AI Act compliance assessment
class EUAIActCompliance:
    """Assess and ensure EU AI Act compliance"""
    
    def classify_ai_system(self, system: Dict) -> str:
        """Classify AI system risk level per EU AI Act"""
        
        # Check for prohibited uses
        prohibited_uses = [
            'social_scoring',
            'real_time_biometric_id',
            'subliminal_manipulation',
            'exploiting_vulnerabilities'
        ]
        
        if any(use in system.get('use_cases', []) for use in prohibited_uses):
            return 'UNACCEPTABLE_RISK'
        
        # Check for high-risk applications
        high_risk_areas = [
            'biometric_identification',
            'critical_infrastructure',
            'education_vocational',
            'employment',
            'essential_services',
            'law_enforcement',
            'migration_asylum',
            'justice'
        ]
        
        if any(area in system.get('application_area', []) for area in high_risk_areas):
            return 'HIGH_RISK'
        
        # Check for limited risk
        if system.get('interacts_with_humans') or system.get('generates_content'):
            return 'LIMITED_RISK'
        
        return 'MINIMAL_RISK'
    
    def high_risk_requirements(self) -> Dict:
        """Requirements for high-risk AI systems"""
        
        return {
            'risk_management': 'Establish risk management system',
            'data_governance': 'Training data quality and governance',
            'documentation': 'Technical documentation before market',
            'record_keeping': 'Automatic recording of events',
            'transparency': 'Clear information to users',
            'human_oversight': 'Appropriate human oversight measures',
            'accuracy': 'Appropriate accuracy, robustness, cybersecurity',
            'conformity': 'Conformity assessment before market',
            'registration': 'Register in EU database'
        }

Compliance Checklist Matrix

Requirement HIPAA GDPR SOC2 ISO 27001 EU AI Act
Data Encryption Required Recommended Required Required Depends on risk
Access Controls Required Required Required Required Required for high-risk
Audit Trails Required Required Required Required Required for high-risk
Consent Management Sometimes Required If applicable If applicable Transparency required
Data Portability Not required Required Not required Not required Not specified
Risk Assessment Required DPIA required Required Required Required
Breach Notification 60 days 72 hours As agreed Without delay Serious incidents

Regulatory Compliance Best Practices

  • Map data flows: Understand where data comes from and goes
  • Document everything: Maintain comprehensive compliance documentation
  • Regular audits: Conduct internal and external compliance audits
  • Privacy by design: Build compliance into system architecture
  • Training programs: Ensure staff understand compliance requirements
  • Incident response: Have clear procedures for compliance breaches
  • Legal counsel: Engage legal experts for complex requirements
  • Continuous monitoring: Track regulatory changes and updates
  • Cross-functional teams: Involve legal, security, and engineering
  • Automated compliance: Use tools to automate compliance checks

Module 5: Security & Compliance Topics