LiteLLM 自托管安全 & 加密常见问题解答
传输中数据加密
产品是否对传输中的数据进行加密?
是的,LiteLLM 使用 TLS/SSL 对传输中的数据进行加密。
开源版和企业版都支持吗?
是的,TLS 加密在开源版和企业版中均可使用。
调用客户端与产品之间的传输是否加密?
是的,通过 SSL 证书配置支持 HTTPS/TLS。
配置
# CLI
litellm --ssl_keyfile_path /path/to/key.pem --ssl_certfile_path /path/to/cert.pem
# Environment Variables
export SSL_KEYFILE_PATH="/path/to/key.pem"
export SSL_CERTFILE_PATH="/path/to/cert.pem"
文档参考: docs/my-website/docs/guides/security_settings.md
产品与 LLM 提供商之间的传输是否加密?
是的,所有与 LLM 提供商的连接默认使用 TLS 加密。
实现细节
- 使用 Python 的
ssl.create_default_context() - 利用启用了 SSL/TLS 的 HTTPX 和 aiohttp 库
- 默认使用 certifi CA 证书包进行 SSL 验证
代码参考: litellm/llms/custom_httpx/http_handler.py (第 43-105 行)
与 LLM 提供商的 TCP 会话是否共享?
是的,TCP 连接被池化并复用。
详情
- 默认启用连接池
- 默认:1000 个最大并发连接,支持 keepalive
- 会话在针对同一提供商的请求之间保持
- 减少了 TLS 握手的开销
代码参考: litellm/llms/custom_httpx/http_handler.py (第 704-712 行)
或者产品是否为每次连续调用与同一个 LLM 提供商协商新的 TLS 会话?
不是,TLS 会话通过连接池复用。不会为每个请求执行新的 TLS 握手。
它是如何加密的?
TLS 1.2 和 TLS 1.3
使用 Python 的默认 SSL 上下文,支持 TLS 1.2 和 TLS 1.3。具体协商的版本取决于:
- Python 版本
- 系统 SSL 库(通常为 OpenSSL)
- 服务器能力
实现: Python 中的 ssl.create_default_context()
它们是如何添加到产品配置中的?
x.509 证书
方法 1:CLI 参数
litellm --ssl_certfile_path /path/to/certificate.pem
方法 2:环境变量
export SSL_CERTFILE_PATH="/path/to/certificate.pem"
私钥
方法 1:CLI 参数
litellm --ssl_keyfile_path /path/to/private_key.pem
方法 2:环境变量
export SSL_KEYFILE_PATH="/path/to/private_key.pem"
证书包/链
对于客户端到代理的连接: 使用标准 SSL 证书设置,并将中间证书捆绑在证书文件中。
对于代理到 LLM 提供商的连接
方法 1:配置 YAML
litellm_settings:
ssl_verify: "/path/to/ca_bundle.pem"
方法 2:环境变量
export SSL_CERT_FILE="/path/to/ca_bundle.pem"
方法 3:客户端证书认证
litellm_settings:
ssl_certificate: "/path/to/client_certificate.pem"
或
export SSL_CERTIFICATE="/path/to/client_certificate.pem"
文档覆盖范围
主要文档
docs/my-website/docs/guides/security_settings.md- SSL/TLS 配置指南
补充参考
litellm/proxy/proxy_cli.py(第 455-467 行) - CLI 选项docs/my-website/docs/completion/http_handler_config.md- 自定义 HTTP 处理程序配置
静态数据加密
产品是否对静态数据进行加密?
部分加密。仅特定的敏感数据在静态存储时进行加密。
哪些数据以加密形式存储?
加密数据:
- LLM API 密钥 -
LiteLLM_ProxyModelTable.litellm_params中的模型凭据 - 提供商凭据 - 存储在
LiteLLM_CredentialsTable.credential_values中 - 配置密钥 -
LiteLLM_Config表中的敏感配置值 - 虚拟密钥 - 使用机密管理服务时(可选功能)
未加密数据:
- 消费日志 (Spend Logs) -
LiteLLM_SpendLogs中的请求/响应数据 - 审计日志 -
LiteLLM_AuditLog中的更改历史 - 用户/团队/组织数据 - 元数据和配置
- 缓存的提示词和补全内容 - 缓存数据以明文形式存储
缓存的提示词和补全内容?
不会,缓存的提示词和补全内容未加密。
缓存后端(Redis、S3、本地磁盘)以明文 JSON 形式存储数据。
代码参考
litellm/caching/redis_cache.pylitellm/caching/s3_cache.pylitellm/caching/caching.py
配置数据?
部分加密.
已加密的内容:
- 模型配置中的 LLM API 密钥和凭据
LiteLLM_Config表中的敏感值LiteLLM_CredentialsTable中的凭据值
未加密的内容:
- 模型名称和别名
- 速率限制和预算设置
- 用户/团队/组织元数据
- 非敏感配置参数
代码参考: litellm/proxy/management_endpoints/model_management_endpoints.py (第 275-308 行)
日志数据?
不会,日志数据未加密。
存储在数据库表中的日志数据为明文
LiteLLM_SpendLogs- 包含请求/响应数据、Token 数、消费金额LiteLLM_ErrorLogs- 错误信息LiteLLM_AuditLog- 变更审计追踪
注意: 您可以禁用日志记录以避免存储敏感数据
general_settings:
disable_spend_logs: True # Disable writing spend logs to DB
disable_error_logs: True # Disable writing error logs to DB
文档: docs/my-website/docs/proxy/db_info.md (第 52-60 行)
它存储在哪里?
在数据库中?
是的,加密数据存储在 PostgreSQL 数据库中。
包含加密数据的核心表
LiteLLM_ProxyModelTable- 带有加密 API 密钥的模型配置LiteLLM_CredentialsTable- 凭据值LiteLLM_Config- 配置密钥
Schema 参考: schema.prisma
在文件系统中?
不会,加密数据默认不存储在文件系统中。
注意: 如果使用磁盘缓存 (disk_cache_dir),缓存的数据将以明文存储。
其他地方?
可选: 使用机密管理服务(AWS Secrets Manager, Azure Key Vault, HashiCorp Vault)时,加密数据可以存储在外部。
配置
general_settings:
key_management_system: "aws_secret_manager" # or "azure_key_vault", "hashicorp_vault"
文档: docs/my-website/docs/secret.md
它是如何加密的?
算法: NaCl SecretBox (XSalsa20-Poly1305 AEAD)
非 AES-256 - LiteLLM 使用 NaCl (Networking and Cryptography Library),它提供:
- XSalsa20 流密码
- Poly1305 MAC 用于身份验证
- 等同于 AES-256 的安全性
密钥派生
- 采用
LITELLM_SALT_KEY(如果未设置盐值,则使用LITELLM_MASTER_KEY) - 使用 SHA-256 进行哈希计算,派生出 256 位加密密钥
- 使用 NaCl SecretBox 进行认证加密
代码参考: litellm/proxy/common_utils/encrypt_decrypt_utils.py (第 69-112 行)
实现
import hashlib
import nacl.secret
# Derive 256-bit key from salt
hash_object = hashlib.sha256(signing_key.encode())
hash_bytes = hash_object.digest()
# Create SecretBox and encrypt
box = nacl.secret.SecretBox(hash_bytes)
encrypted = box.encrypt(value_bytes)
设置加密密钥
所需环境变量
export LITELLM_SALT_KEY="your-strong-random-key-here"
重要提示
- ⚠️ 必须在添加任何模型之前设置
- ⚠️ 切勿更改此密钥 - 否则加密数据将无法恢复
- ⚠️ 使用强随机密钥(推荐:https://1password.com/password-generator/)
- 如果未设置,将回退到
LITELLM_MASTER_KEY
文档: docs/my-website/docs/proxy/prod.md (第 8 节,第 184-196 行)
文档覆盖范围
主要文档
docs/my-website/docs/proxy/prod.md(第 8 节) - LITELLM_SALT_KEY 设置docs/my-website/docs/secret.md- 机密管理系统docs/my-website/docs/proxy/db_info.md- 数据库信息
补充参考
security.md- 通用安全措施docs/my-website/docs/data_security.md- 数据隐私概述schema.prisma- 带有加密字段的数据库结构
安全功能总结
✅ 开箱即用
- 用于客户端到代理连接的 TLS/SSL 加密
- 用于代理到 LLM 提供商连接的 TLS 加密(带连接池)
- LLM API 密钥和凭据的 加密存储
- 支持 TLS 1.2 和 TLS 1.3
- 连接池以减少 TLS 握手开销
⚠️ 重要限制
- 缓存数据未加密(Redis、S3、磁盘缓存)
- 日志数据未加密(消费日志、审计日志)
- 日志中的请求/响应载荷未加密
- 使用 NaCl SecretBox,而非 AES-256 (同等安全性)
- 未显式配置 TLS 版本 - 使用 Python/系统默认值
🔧 配置要求
用于生产环境部署
- 在添加任何模型之前设置 LITELLM_SALT_KEY
- 为 HTTPS 客户端连接配置 SSL 证书
- 如果日志包含敏感数据,请考虑禁用它们
- 使用机密管理服务以增强安全性(可选)
- 如果使用自定义证书,请配置 CA 包
安全快速入门检查清单
# 1. Generate a strong salt key
export LITELLM_SALT_KEY="$(openssl rand -base64 32)"
# 2. Set up SSL certificates (for HTTPS)
export SSL_KEYFILE_PATH="/path/to/private_key.pem"
export SSL_CERTFILE_PATH="/path/to/certificate.pem"
# 3. Configure database
export DATABASE_URL="postgresql://user:password@host:port/dbname"
# 4. (Optional) Disable logs if they contain sensitive data
# Add to config.yaml:
# general_settings:
# disable_spend_logs: True
# disable_error_logs: True
# 5. Start LiteLLM Proxy
litellm --config config.yaml
其他资源
- LiteLLM 文档: https://docs.litellm.com.cn/
- 安全设置指南: https://docs.litellm.com.cn/docs/guides/security_settings
- 生产环境部署: https://docs.litellm.com.cn/docs/proxy/prod
- 机密管理: https://docs.litellm.com.cn/docs/secret
安全咨询请联系: support@berri.ai