安全#

Ray 是一个易于使用的框架,用于在 Ray 集群的一个或多个节点上运行任意代码。Ray 提供容错、优化调度、任务编排和自动扩展功能,以运行给定的工作负载。

为了实现高性能和分布式工作负载,Ray 组件需要集群内通信。这种通信包括分布式内存和节点心跳等核心要素,以及指标和日志等辅助功能。Ray 大部分通信都利用 gRPC。

Ray 提供额外的服务来改善开发者体验。这些服务包括 Ray Dashboard(用于集群内省和调试)、Ray Jobs(与 Dashboard 一起托管,负责 Ray Job 提交)和 Ray Client(允许与远程集群进行本地交互式开发)。这些服务提供对 Ray 集群和底层计算资源的完全访问。

Ray 允许任何客户端运行任意代码。请务必注意允许什么访问您的 Ray 集群。

如果您公开了这些服务(Ray Dashboard、Ray Jobs、Ray Client),任何能够访问相关端口的人都可以在您的 Ray 集群上执行任意代码。这可能发生

  • 显式地:通过提交 Ray Job 或使用 Ray Client

  • 间接地:通过调用这些服务的 Dashboard REST API

  • 隐式地:Ray 大量使用 cloudpickle 来序列化任意 Python 对象。有关 Pickle 安全模型的更多详细信息,请参阅 pickle 文档

Ray Dashboard、Ray Jobs 和 Ray Client 是开发者工具,您应该仅在采取必要的访问控制措施以限制访问仅限于受信任方的情况下使用它们。

角色#

在考虑运行 Ray 的安全职责时,请考虑与 Ray 交互的不同角色。

  • Ray 开发者编写依赖于 Ray 的代码。他们可以在本地运行单节点 Ray 集群,或在提供的计算基础设施上远程运行多节点集群。

  • 平台提供商提供 开发者 运行 Ray 的计算环境。

  • 用户与 Ray 驱动的应用程序的输出进行交互。

最佳实践#

安全和隔离必须在 Ray 集群外部强制执行。 Ray 期望在安全的网络环境中运行,并处理受信任的代码。开发者和平台提供商必须维护以下不变性以确保 Ray 集群的安全运行。

在受控网络环境中部署 Ray 集群#

  • 核心 Ray 组件和附加 Ray 组件之间的网络流量应始终在受控、隔离的网络中进行。对附加服务的访问应通过严格的网络控制和/或外部身份验证/授权代理进行限制。

  • gRPC 通信可以通过 TLS 加密,但这不能替代网络隔离。

  • 平台提供商负责确保 Ray 在足够受控的网络环境中运行,并且开发者能够以安全的方式访问 Ray Dashboard 等功能。

仅在 Ray 中执行受信任的代码#

  • Ray 会忠实地执行传递给它的代码——Ray 无法区分调优实验、rootkit 安装或 S3 存储桶检查。

  • Ray 开发者负责在理解这一点的前提下构建他们的应用程序。

使用多个 Ray 集群在 Ray 外部强制执行隔离#

  • 如果工作负载需要相互隔离,请使用单独的、隔离的 Ray 集群。Ray 可以在单个集群中调度多个不同的作业,但不会尝试强制它们之间的隔离。同样,Ray 不会为与给定集群交互的开发者实施访问控制。

  • Ray 开发者负责确定哪些应用程序需要分离,平台提供商负责提供这种隔离。

启用令牌身份验证#

  • 从 Ray 2.52.0 开始,Ray 支持内置令牌身份验证,它提供了额外的措施来防止对集群的未经授权访问(包括不受信任的代码执行)。有关详细信息,请参阅 Ray 令牌身份验证

  • 令牌身份验证不能替代在受控网络环境中部署 Ray 集群。相反,它是纵深防御措施,增强了网络级别的安全性。