TLS/SSL

Dask distributed 支持 TLS/SSL 通信,提供集群端点(客户端、调度器和工作节点)之间的相互认证和通信加密。

通过使用诸如 tls://tls 地址来启用 TLS(默认是 tcp,它发送未认证和未加密的数据)。在 TLS 模式下,所有集群端点必须出示由指定证书颁发机构(CA)签发的有效 TLS 证书。通常建议为您的组织使用自定义 CA,因为这将允许为内部主机名或 IP 地址签发证书。

参数

使用 TLS 时,必须提供附加参数

  • 一个 CA 证书文件,它允许 TLS 决定端点的证书是否由正确的机构签发;

  • 每个端点的 证书文件,用于向其他端点出示以实现相互认证;

  • 一个 私钥文件,这是向其他端点证明您是给定证书的授权用户的加密手段。

注意

根据 OpenSSL 的要求,所有这些文件都应采用 PEM 格式。另外,可以将证书和私钥合并到一个文件中(此时只需指定 certificate 参数,而省略 private key 参数)。

您可以选择每个端点使用不同的证书和私钥,或者所有端点共享相同的证书和私钥,或者每种类型的端点(客户端、调度器、工作节点)拥有自己的证书/密钥对。然而,除非您有特殊需求,否则 CA 证书对于所有端点应该都是相同的。

还可以传递其他参数

  • 一组允许的 加密套件,如果您对哪些算法被认为是安全的有严格要求;此设置的值应是一个 OpenSSL 加密套件字符串

  • 支持的 最低 和/或 最高 TLS 版本。出于安全考虑,distributed 仅支持 TLS 版本 >= 1.2。

  • 是否 要求加密,以避免误用纯 TCP 通信。

所有这些参数可以通过几种方式传递

  • 通过 Dask 配置文件

  • 如果使用命令行,通过 dask schedulerdask worker 的选项;

  • 如果使用 API,通过一个 Security 对象。例如,以下是如何为客户端使用配置 Security 对象:

    from 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)
    
    client = Client(..., security=sec)
    

安全策略

Dask 始终根据配置的 CA 证书验证远程端点出示的证书。证书会针对“客户端”和“服务器”端点(在 TCP 意义上)进行验证,以确保端点相互认证。证书颁发的主机名或 IP 地址不会被检查;如果您使用自己的内部证书颁发机构,这应该不成问题。

无法禁用证书验证,因为这将使通信容易受到中间人攻击。

性能影响

在最新的 CPU 上,加密速度很快,其中大多数 CPU 都具有基于 AES 的硬件加速。除非您强制 ciphers 参数为其他值,否则 TLS 层通常会选择 AES。然而,如果您通过高速网络链接传输非常大的数据,加密仍然可能产生不可忽略的开销。

另请参阅

一项关于 AES-NI 加速的研究 表明,最新的 x86 CPU 可以在每个 CPU 核心上以超过每秒 1 GB 的速度进行 AES 加密。

API

class distributed.security.Security(require_encryption=None, **kwargs)[source]

Dask 集群的安全配置。

默认值从 Dask 的配置文件加载,并可以在构造函数中覆盖。

参数
require_encryptionbool, 可选

是否对所有连接要求 TLS 加密。

tls_ca_filestr, 可选

CA 证书文件的路径,采用 PEM 格式编码。

tls_ciphersstr, 可选

允许的 OpenSSL 加密套件字符串。如果未提供,将使用系统默认值。

tls_min_versionssl.TLSVersion, 可选

支持的最低 TLS 版本。默认为 TLS 1.2。

tls_max_versionssl.TLSVersion, 可选

支持的最高 TLS 版本。默认为支持的最高版本。

tls_client_certstr, 可选

客户端证书文件的路径,采用 PEM 格式编码。

tls_client_keystr, 可选

客户端密钥文件的路径,采用 PEM 格式编码。或者,密钥可以附加到证书文件中,此时可以省略此参数。

tls_scheduler_certstr, 可选

调度器证书文件的路径,采用 PEM 格式编码。

tls_scheduler_keystr, 可选

调度器密钥文件的路径,采用 PEM 格式编码。或者,密钥可以附加到证书文件中,此时可以省略此参数。

tls_worker_certstr, 可选

工作节点证书文件的路径,采用 PEM 格式编码。

tls_worker_keystr, 可选

工作节点密钥文件的路径,采用 PEM 格式编码。或者,密钥可以附加到证书文件中,此时可以省略此参数。

extra_conn_argsmapping, 可选

包含要传递给连接的关键字参数的映射。

get_connection_args(role)[source]

获取具有给定 *role* 的 connect() 调用的 *connection_args* 参数。

get_listen_args(role)[source]

获取具有给定 *role* 的 listen() 调用的 *connection_args* 参数。

get_tls_config_for_role(role)[source]

以扁平字典形式返回给定角色的 TLS 配置。

classmethod temporary(**kwargs)[source]

创建一个新的临时 Security 对象。

这将创建一个新的自签名密钥/证书对,适用于保护 Dask 集群中所有角色的通信安全。这些密钥/证书仅存在于内存中,并存储在此对象中。

此方法需要安装 cryptography 库。