安全性#
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 可以在单个集群中调度多个不同的 Job,但不会尝试强制它们之间的隔离。同样,Ray 不会对与给定集群交互的开发者实施访问控制。
Ray 开发者负责确定哪些应用需要分开,平台提供商负责提供这种隔离。