安全#

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

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

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

Ray 允许任何客户端运行任意代码。请极其小心地控制哪些内容可以访问您的 Ray 集群。

如果你公开这些服务(Ray 仪表盘、Ray 作业、Ray 客户端),任何能够访问相关端口的人都可以在你的 Ray 集群上执行任意代码。这可能会发生:

  • 明确地说:通过提交一个 Ray 作业,或使用 Ray 客户端

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

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

Ray 仪表板、Ray 作业和 Ray 客户端是开发者工具,您应该仅在使用必要的访问控制措施来限制仅对可信方开放的情况下使用。

角色#

在考虑运行 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 开发者负责确定哪些应用程序需要分离,而平台提供者负责提供这种隔离。