5.3 安全与合规 — 大模型应用开发从零到一 关键词短语 本节导读:掌握大模型应用的安全防护措施和合规管理要求,确保系统安全可靠地运行,保护用户隐私和数据安全。 学习目标 理解大模型应用的安全风险和防护需求 掌握API安全、数据安全、输入过滤等防护措施 学会实施访问控制和权限管理 理解数据隐私保护和合规要求 构建完整的安全防护体系 核心概念 大模型应用的安全风险 大模型应用面临多种安全风险,需要全面防护: 主要风险类型: API安全风险:未授权访问、API滥用、密钥泄露 数据安全风险:敏感数据泄露、数据污染、隐私侵犯 输入安全风险:提示词注入、越权访问、数据注入 输出安全风险:有害内容生成、信息泄露、幻觉内容 安全防护原则 最小权限原则:只授予必要的访问权限
本节导读:掌握大模型应用的安全防护措施和合规管理要求,确保系统安全可靠地运行,保护用户隐私和数据安全。
大模型应用面临多种安全风险,需要全面防护:
主要风险类型:
# 安全相关依赖 pip install cryptography bcrypt python-jwt pip install pydantic-settings python-multipart pip install sqlparse bleach html-sanitizer
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ API安全防护实现 """ import time import jwt from typing import Dict, Optional, List from dataclasses import dataclass from functools import wraps import loguru @dataclass class RateLimit: """速率限制配置""" max_requests: int window_seconds: int requests: List[float] = None def __post_init__(self): if self.requests is None: self.requests = [] class APIProtection: """API安全防护器""" def __init__(self): self.logger = loguru.logger self.logger.add("logs/api_security.log", rotation="1 day") # 速率限制器 self.rate_limits: Dict[str, RateLimit] = {} # API密钥管理 self.api_keys: Dict[str, Dict] = {} def rate_limiter(self, max_requests: int = 100, window_seconds: int = 60): """速率限制装饰器""" def decorator(func): @wraps(func) def wrapper(*args, **kwargs): # 获取客户端标识 client_id = self._get_client_id(args, kwargs) # 检查速率限制 if not self._check_rate_limit(client_id, max_requests, window_seconds): error_msg = f"请求频率过高: {client_id}" self.logger.warning(error_msg) return {"error": error_msg, "status": "429"}, 429 return func(*args, **kwargs) return wrapper return decorator def api_key_auth(self, required_scopes: List[str] = None): """API密钥认证装饰器""" def decorator(func): @wraps(func) def wrapper(*args, **kwargs): # 获取API密钥 api_key = self._get_api_key(args, kwargs) if not api_key: error_msg = "缺少API密钥" self.logger.warning(error_msg) return {"error": error_msg, "status": "401"}, 401 # 验证API密钥 auth_result = self._verify_api_key(api_key, required_scopes or []) if not auth_result["valid"]: error_msg = f"API密钥无效: {auth_result['error']}" self.logger.warning(error_msg) return {"error": error_msg, "status": "401"}, 401 # 添加用户信息到请求上下文 kwargs['user_info'] = auth_result['user_info'] return func(*args, **kwargs) return wrapper return decorator def _get_client_id(self, args, kwargs) -> str: """获取客户端标识""" client_id = kwargs.get('client_ip', 'unknown') user_id = kwargs.get('user_id', 'anonymous') return f"{client_id}:{user_id}" def _check_rate_limit(self, client_id: str, max_requests: int, window_seconds: int) -> bool: """检查速率限制""" current_time = time.time() # 获取或创建速率限制器 if client_id not in self.rate_limits: self.rate_limits[client_id] = RateLimit(max_requests, window_seconds) rate_limiter = self.rate_limits[client_id] # 清理过期请求记录 rate_limiter.requests = [ req_time for req_time in rate_limiter.requests if current_time - req_time <= window_seconds ] # 检查是否超过限制 if len(rate_limiter.requests) >= max_requests: return False # 记录当前请求 rate_limiter.requests.append(current_time) return True def _verify_api_key(self, api_key: str, required_scopes: List[str]) -> Dict: """验证API密钥""" # 这里简化处理,实际应该查询数据库验证 if api_key in self.api_keys: key_info = self.api_keys[api_key] # 检查密钥是否过期 if key_info.get('expires_at') and datetime.now() > key_info['expires_at']: return {"valid": False, "error": "API密钥已过期"} # 检查权限范围 user_scopes = key_info.get('scopes', []) for scope in required_scopes: if scope not in user_scopes: return {"valid": False, "error": f"缺少权限: {scope}"} return { "valid": True, "user_info": { "user_id": key_info.get('user_id'), "username": key_info.get('username'), "scopes": user_scopes } } return {"valid": False, "error": "API密钥不存在"} # 使用示例 def api_protection_example(): """API安全防护示例""" protection = APIProtection() print("=== API安全防护测试 ===") # 添加到API密钥管理 protection.api_keys["test_key"] = { 'user_id': 'user123', 'scopes': ['chat', 'generate'], 'expires_at': datetime.now() + timedelta(hours=24) } # 测试请求 @protection.rate_limiter(max_requests=5, window_seconds=60) @protection.api_key_auth() def test_api_call(user_info, **kwargs): return {"result": "success", "user": user_info} # 测试正常请求 result = test_api_call( client_ip="127.0.0.1", user_id="user123", headers={"Authorization": "Bearer test_key"} ) print(f"正常请求结果: {result}") # 测试速率限制 for i in range(10): result = test_api_call( client_ip="192.168.1.100", user_id="test_user", headers={"Authorization": "Bearer test_key"} ) print(f"请求 {i+1}: {result}") if __name__ == "__main__": api_protection_example()
#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 数据安全保护实现 """ import hashlib import base64 from typing import Dict, List from dataclasses import dataclass from cryptography.fernet import Fernet import loguru @dataclass class DataFieldConfig: """数据字段配置""" name: str data_type: str # "sensitive", "personal", "normal" encryption_required: bool = False anonymization_required: bool = False class DataProtection: """数据安全保护器""" def __init__(self): self.logger = loguru.logger self.logger.add("logs/data_security.log", rotation="1 day") # 初始化加密器 self.fernet_key = Fernet.generate_key() self.fernet = Fernet(self.fernet_key) def encrypt_data(self, data: str) -> str: """加密数据""" encrypted_data = self.fernet.encrypt(data.encode()) return base64.b64encode(encrypted_data).decode('utf-8') def decrypt_data(self, encrypted_data: str) -> str: """解密数据""" decoded_data = base64.b64decode(encrypted_data.encode()) decrypted_data = self.fernet.decrypt(decoded_data) return decrypted_data.decode('utf-8') def anonymize_data(self, data: str) -> str: """数据脱敏""" import re # 邮箱脱敏 email_pattern = r'([\\w\\.-]+)@([\\w\\.-]+)\\.([\\w]+)' data = re.sub(email_pattern, r'***@***.***', data) # 手机号脱敏 phone_pattern = r'(1[3-9]\\d{9})' data = re.sub(phone_pattern, '***********', data) return data def hash_sensitive_data(self, data: str) -> str: """敏感数据哈希""" return hashlib.sha256(data.encode()).hexdigest() # 使用示例 def data_protection_example(): """数据安全保护示例""" protection = DataProtection() # 测试数据 test_data = { 'email': 'user@example.com', 'phone': '13812345678', 'name': '张三', 'password': 'hashed_password_here' } print("=== 数据安全保护测试 ===") for field, value in test_data.items(): print(f"原始 {field}: {value}") # 根据字段类型进行保护 if field in ['email', 'password']: encrypted = protection.encrypt_data(str(value)) print(f"加密 {field}: {encrypted[:20]}...") elif field == 'phone': anonymized = protection.anonymize_data(str(value)) print(f"脱敏 {field}: {anonymized}") elif field == 'name': hashed = protection.hash_sensitive_data(str(value)) print(f"哈希 {field}: {hashed}") else: print(f"保持 {field}: {value}") if __name__ == "__main__": data_protection_example()
A: 采用多因素认证,结合API密钥、JWT令牌和IP白名单。实施速率限制防止滥用,定期轮换密钥,使用HTTPS加密传输。
A: 敏感数据使用AES-256加密,传输使用TLS 1.3,哈希使用SHA-256。密钥管理使用专业密钥管理系统,避免硬编码密钥。
A: 实施多层过滤:长度限制、字符白名单、关键词黑名单、格式验证、SQL注入检测、XSS防护。定期更新过滤规则库。
A: 记录操作时间、用户身份、操作类型、数据类型、IP地址、用户代理、操作结果。确保审计日志不可篡改,保留足够时间。
A: 建立应急响应流程:检测、分析、遏制、清除、恢复。定期进行安全演练,建立安全事件库,持续改进防护措施。
通过本节的学习,你已经掌握了:
✅ API安全的认证、授权、防护机制 ✅ 数据加密、脱敏、访问控制技术
✅ 输入过滤和输出安全控制 ✅ 合规管理和审计跟踪系统
✅ 完整的安全防护体系设计
这些技术将帮助你构建安全可靠的大模型应用,保护用户隐私和数据安全,满足合规要求。
关键词:大模型应用开发从零到一, API安全, 数据安全, 输入过滤, 访问控制, 合规管理, 安全防护
难度:进阶
预计阅读:40 分钟