跳至主要内容

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 处理程序配置

静态数据加密

产品是否对静态数据进行加密?

部分加密。仅特定的敏感数据在静态存储时进行加密。

哪些数据以加密形式存储?

加密数据:

  1. LLM API 密钥 - LiteLLM_ProxyModelTable.litellm_params 中的模型凭据
  2. 提供商凭据 - 存储在 LiteLLM_CredentialsTable.credential_values
  3. 配置密钥 - LiteLLM_Config 表中的敏感配置值
  4. 虚拟密钥 - 使用机密管理服务时(可选功能)

未加密数据:

  1. 消费日志 (Spend Logs) - LiteLLM_SpendLogs 中的请求/响应数据
  2. 审计日志 - LiteLLM_AuditLog 中的更改历史
  3. 用户/团队/组织数据 - 元数据和配置
  4. 缓存的提示词和补全内容 - 缓存数据以明文形式存储

缓存的提示词和补全内容?

不会,缓存的提示词和补全内容未加密

缓存后端(Redis、S3、本地磁盘)以明文 JSON 形式存储数据。

代码参考

  • litellm/caching/redis_cache.py
  • litellm/caching/s3_cache.py
  • litellm/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 的安全性

密钥派生

  1. 采用 LITELLM_SALT_KEY(如果未设置盐值,则使用 LITELLM_MASTER_KEY
  2. 使用 SHA-256 进行哈希计算,派生出 256 位加密密钥
  3. 使用 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 - 带有加密字段的数据库结构

安全功能总结

✅ 开箱即用

  1. 用于客户端到代理连接的 TLS/SSL 加密
  2. 用于代理到 LLM 提供商连接的 TLS 加密(带连接池)
  3. LLM API 密钥和凭据的 加密存储
  4. 支持 TLS 1.2 和 TLS 1.3
  5. 连接池以减少 TLS 握手开销

⚠️ 重要限制

  1. 缓存数据未加密(Redis、S3、磁盘缓存)
  2. 日志数据未加密(消费日志、审计日志)
  3. 日志中的请求/响应载荷未加密
  4. 使用 NaCl SecretBox,而非 AES-256 (同等安全性)
  5. 未显式配置 TLS 版本 - 使用 Python/系统默认值

🔧 配置要求

用于生产环境部署

  1. 在添加任何模型之前设置 LITELLM_SALT_KEY
  2. 为 HTTPS 客户端连接配置 SSL 证书
  3. 如果日志包含敏感数据,请考虑禁用它们
  4. 使用机密管理服务以增强安全性(可选)
  5. 如果使用自定义证书,请配置 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

其他资源

安全咨询请联系: support@berri.ai