跳到内容

安全

节点间通信

多节点 vLLM 部署中的所有节点间通信默认不安全,必须通过将节点置于隔离网络上来进行保护。这包括

  1. PyTorch Distributed 通信
  2. KV 缓存传输通信
  3. 张量、流水线和数据并行通信

节点间通信的配置选项

以下选项控制 vLLM 中的节点间通信

1. 环境变量:

  • VLLM_HOST_IP:设置 vLLM 进程通信的 IP 地址

2. KV 缓存传输配置:

  • --kv-ip:KV 缓存传输通信的 IP 地址(默认:127.0.0.1)
  • --kv-port:KV 缓存传输通信的端口(默认:14579)

3. 数据并行配置:

  • data_parallel_master_ip:数据并行主节点的 IP(默认:127.0.0.1)
  • data_parallel_master_port:数据并行主节点的端口(默认:29500)

关于 PyTorch Distributed 的注意事项

vLLM 使用 PyTorch 的分布式功能进行一些节点间通信。有关 PyTorch Distributed 安全注意事项的详细信息,请参阅PyTorch 安全指南

PyTorch 安全指南中的要点

  • PyTorch Distributed 功能仅用于内部通信
  • 它们不是为在不受信任的环境或网络中使用而设计的
  • 出于性能原因,不包含任何授权协议
  • 消息以未加密的方式发送
  • 接受来自任何地方的连接,不进行检查

安全建议

1. 网络隔离:

  • 将 vLLM 节点部署在专用、隔离的网络上
  • 使用网络分段来防止未经授权的访问
  • 实施适当的防火墙规则

2. 配置最佳实践:

  • 始终将 VLLM_HOST_IP 设置为特定 IP 地址,而不是使用默认值
  • 配置防火墙,仅允许节点之间必要的端口通信

3. 访问控制:

  • 限制对部署环境的物理和网络访问
  • 为管理界面实施适当的身份验证和授权
  • 对所有系统组件遵循最小权限原则

4. 限制媒体 URL 的域名访问:

通过设置 --allowed-media-domains 来限制 vLLM 可以访问媒体 URL 的域名,以防止服务器端请求伪造 (SSRF) 攻击。(例如:--allowed-media-domains upload.wikimedia.org github.com www.bogotobogo.com

此外,请考虑设置 VLLM_MEDIA_URL_ALLOW_REDIRECTS=0 以防止 HTTP 重定向被跟踪以绕过域名限制。

安全与防火墙:保护暴露的 vLLM 系统

虽然 vLLM 被设计为允许不安全的网络服务隔离到私有网络,但有些组件—如依赖项和底层框架—可能会打开监听所有网络接口的不安全服务,有时这超出了 vLLM 的直接控制范围。

一个主要问题是使用 torch.distributed,vLLM 利用它进行分布式通信,包括在单个主机上使用 vLLM 时。当 vLLM 使用 TCP 初始化时(参见PyTorch TCP 初始化文档),PyTorch 会创建一个 TCPStore,该存储默认监听所有网络接口。这意味着,除非采取额外的保护措施,否则这些服务可能会被任何能够通过任何网络接口访问您机器的主机访问。

从 PyTorch 的角度来看,任何使用 torch.distributed 的行为都应被视为默认不安全。 这是 PyTorch 团队已知且故意的行为。

防火墙配置指南

保护 vLLM 系统的最佳方法是仔细配置防火墙,仅暴露最小必需的网络表面积。在大多数情况下,这意味着

  • 阻止所有入站连接,除了 API 服务器监听的 TCP 端口。

  • 确保用于内部通信的端口(例如 torch.distributed 和 KV 缓存传输的端口)只能从受信任的主机或网络访问。

  • 切勿将这些内部端口暴露给公共互联网或不受信任的网络。

有关具体的防火墙配置说明,请查阅您的操作系统或应用程序平台文档。

API 密钥认证的局限性

概述

--api-key 标志(或 VLLM_API_KEY 环境变量)为 vLLM 的 HTTP 服务器提供了身份验证,但仅限于 /v1 路径前缀下的 OpenAI 兼容 API 端点。许多其他敏感端点在此 HTTP 服务器上暴露,但没有任何身份验证强制执行。

重要提示: 在保护 vLLM 访问时,不要仅依赖 --api-key。生产部署需要额外的安全措施。

受保护的端点(需要 API 密钥)

当配置了 --api-key 时,以下 /v1 端点需要 Bearer token 认证

  • /v1/models - 列出可用模型
  • /v1/chat/completions - 聊天补全
  • /v1/completions - 文本补全
  • /v1/embeddings - 生成嵌入
  • /v1/audio/transcriptions - 音频转录
  • /v1/audio/translations - 音频翻译
  • /v1/messages - Anthropic 兼容的消息 API
  • /v1/responses - 响应管理
  • /v1/score - 评分 API
  • /v1/rerank - 重排 API

未受保护的端点(无需 API 密钥)

即使配置了 --api-key,以下端点也不需要身份验证

推理端点

  • /invocations - SageMaker 兼容的端点(路由到与 /v1 端点相同的推理函数)
  • /inference/v1/generate - 生成补全
  • /pooling - 池化 API
  • /classify - 分类 API
  • /score - 评分 API(非 /v1 版本)
  • /rerank - 重排 API(非 /v1 版本)

操作控制端点(始终启用)

  • /pause - 暂停生成(导致拒绝服务)
  • /resume - 恢复生成
  • /scale_elastic_ep - 触发扩展操作

实用工具端点

  • /tokenize - 对文本进行分词
  • /detokenize - 对分词进行反向分词
  • /health - 健康检查
  • /ping - SageMaker 健康检查
  • /version - 版本信息
  • /load - 服务器负载指标

分词器信息端点(仅当设置了 --enable-tokenizer-info-endpoint 时)

此端点仅在设置了 --enable-tokenizer-info-endpoint 标志时可用。它可能会暴露敏感信息,如聊天模板和分词器配置

  • /tokenizer_info - 获取全面的分词器信息,包括聊天模板和配置

开发端点(仅当 VLLM_SERVER_DEV_MODE=1 时)

这些端点仅在环境变量 VLLM_SERVER_DEV_MODE 设置为 1 时可用。它们仅用于开发和调试目的,绝不应在生产环境中启用

  • /server_info - 获取详细的服务器配置
  • /reset_prefix_cache - 重置前缀缓存(可能中断服务)
  • /reset_mm_cache - 重置多模态缓存(可能中断服务)
  • /sleep - 使引擎进入睡眠状态(导致拒绝服务)
  • /wake_up - 唤醒处于睡眠状态的引擎
  • /is_sleeping - 检查引擎是否处于睡眠状态
  • /collective_rpc - 在引擎上执行任意 RPC 方法(极其危险)

Profiler 端点(仅当设置了 VLLM_TORCH_PROFILER_DIRVLLM_TORCH_CUDA_PROFILE 时)

这些端点仅在启用 Profiling 时可用,并且仅应用于本地开发

  • /start_profile - 启动 PyTorch Profiler
  • /stop_profile - 停止 PyTorch Profiler

注意: /invocations 端点尤其令人担忧,因为它提供了对与受保护的 /v1 端点相同的推理功能的未经身份验证的访问。

安全影响

能够访问 vLLM HTTP 服务器的攻击者可以

  1. 绕过身份验证,通过使用非 /v1 端点(如 /invocations/inference/v1/generate/pooling/classify/score/rerank)在没有凭据的情况下运行任意推理
  2. 导致拒绝服务,方法是调用 /pause/scale_elastic_ep 而无需 token
  3. 访问操作控制以操纵服务器状态(例如,暂停生成)
  4. 如果设置了 --enable-tokenizer-info-endpoint 访问敏感的分词器配置,包括聊天模板,这可能会泄露提示工程策略或其他实现细节
  5. 如果设置了 VLLM_SERVER_DEV_MODE=1 通过 /collective_rpc 执行任意 RPC 命令,重置缓存,使引擎进入睡眠状态,并访问详细的服务器配置

1. 最小化暴露的端点

关键:切勿在生产环境中设置 VLLM_SERVER_DEV_MODE=1。开发端点暴露了极其危险的功能,包括

  • 通过 /collective_rpc 执行任意 RPC
  • 可能中断服务的缓存操纵
  • 详细的服务器配置泄露

同样,切勿在生产环境中启用 Profiler 端点(VLLM_TORCH_PROFILER_DIRVLLM_TORCH_CUDA_PROFILE)。

谨慎使用 --enable-tokenizer-info-endpoint 仅当您需要公开分词器配置信息时才启用 /tokenizer_info 端点。此端点会显示聊天模板和分词器设置,其中可能包含敏感的实现细节或提示工程策略。

2. 部署在反向代理后面

最有效的方法是将 vLLM 部署在反向代理(如 nginx、Envoy 或 Kubernetes Gateway)后面,该代理

  • 明确地仅允许您想向最终用户公开的端点
  • 阻止所有其他端点,包括未经身份验证的推理和操作控制端点
  • 在代理层实现额外的身份验证、速率限制和日志记录

报告安全漏洞

如果您认为发现了 vLLM 的安全漏洞,请按照项目的安全策略进行报告。有关如何报告安全问题以及项目安全策略的更多信息,请参阅vLLM 安全策略