TLS/SSL

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

通过使用 tls 地址(如 tls://,默认是 tcp,发送未认证和未加密的数据)启用 TLS。在 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)[源代码]

Dask 集群的安全配置。

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

参数
require_encryptionbool, 可选

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

tls_ca_filestr, 可选

指向以 PEM 格式编码的 CA 证书文件的路径。

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_args映射,可选

使用关键字参数映射传递给连接。

get_connection_args(role)[源代码]

获取带有指定 role 的 connect() 调用的 connection_args 参数。

get_listen_args(role)[源代码]

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

get_tls_config_for_role(role)[源代码]

返回给定角色的TLS配置,作为一个扁平的字典。

classmethod temporary(**kwargs)[源代码]

创建一个新的临时安全对象。

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

此方法要求安装 cryptography 库。