安全

Dask Cloudprovider 旨在平衡易用性和安全最佳实践。两者并非总是兼容,因此本文档旨在概述此库中做出的权衡和决策。

公共调度器

每个集群管理器要正常工作,必须能够连接到端口 8786 上的 Dask 调度器。在许多集群管理器中,默认选项是通过公共 IP 地址将 Dask 调度器和仪表板暴露给互联网。这使得新用户可以快速轻松地启动和运行,但从长远来看可能会带来安全风险。

许多组织有不允许用户分配公共 IP 地址或打开端口的策略。我们的最佳实践建议是从云平台内部使用 Dask Cloudprovider,无论是从虚拟机还是托管环境。然后禁用公共网络。例如

>>> import dask.config, dask_cloudprovider
>>> dask.config.set({"cloudprovider.gcp.public_ingress": False})

请参阅每个集群管理器以了解配置选项。

认证和加密

集群管理器,例如 dask_cloudprovider.aws.EC2Clusterdask_cloudprovider.azure.AzureVMClusterdask_cloudprovider.gcp.GCPClusterdask_cloudprovider.digitalocean.DropletCluster,默认启用基于证书的认证和加密。

当使用这些集群管理器中的任何一个启动集群时,将生成一组临时密钥,并通过它们的启动脚本分发给集群节点。然后,客户端、调度器和工作节点之间的所有通信都将被加密,并且只有具有有效证书的客户端和工作节点才能连接到调度器。

您还可以使用 distributed.security.Security 对象指定您自己的证书。

>>> from dask_cloudprovider.gcp import GCPCluster
>>> from dask.distributed import Client
>>> from distributed.security import Security
>>> sec = Security(tls_ca_file='cluster_ca.pem',
...                tls_client_cert='cli_cert.pem',
...                tls_client_key='cli_key.pem',
...                require_encryption=True)
>>> cluster = GCPCluster(n_workers=1, security=sec)
>>> client = Client(cluster)
>>> client
<Client: 'tls://10.142.0.29:8786' processes=0 threads=0, memory=0 B>

通过将 security 关键字参数设置为 False,可以禁用安全连接。在故障排除或在受信任的网络上运行(例如,完全在 VPC 内部)时,这可能是可取的。