ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Presto 内部通信安全加固指南:SSL/TLS 加密、内部认证(JWT/CERTIFICATE/KERBEROS)与性能调优

Presto 内部通信安全加固指南:SSL/TLS 加密、内部认证(JWT/CERTIFICATE/KERBEROS)与性能调优 Presto 内部通信安全加固指南SSL/TLS 加密、内部认证JWT/CERTIFICATE/KERBEROS与性能调优【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto导读本文基于 presto-docs/src/main/sphinx/security/internal-communication.rst 编写系统讲解 Presto 集群节点间Coordinator 与 Worker 之间内部通信的安全加固方案包括完整的 SSL/TLS 加密配置八步流程、JWT / CERTIFICATE / KERBEROS 三种内部认证机制的选择与启用方法以及开启加密后的性能影响分析与随机数源调优实践。读完本文你将能够为生产环境的 Presto 集群独立配置端到端加密的内部通道并根据查询负载特征评估和缓解加密带来的性能损耗。一、为什么需要保护 Presto 内部通信Presto 是一个分布式 SQL 查询引擎一次查询会被拆分成多个任务Task分发到集群各节点并行执行节点之间会持续交换中间结果、任务状态与分片元数据。默认情况下这些内部通信是明文 HTTP任何能接入集群网络的攻击者都可能嗅探到查询数据。Presto 支持对节点间通信启用 SSL/TLS 加密并在此基础上进一步启用内部认证Internal Authentication从而保证机密性节点间传输的中间结果与元数据被加密完整性数据在传输中无法被篡改真实性可选只有持有合法凭证的节点才能与集群内其他节点通信。所有内部通信安全相关的属性均在config.properties中配置。Worker 与 Coordinator 使用同一套属性且集群内每一个节点都必须配置——未配置或配置错误的节点将无法与集群内其他节点通信。这一点从源码中可以印证内部通信配置统一由 InternalCommunicationConfig.java 解析该配置类被 Coordinator 与 Worker 共同装载。二、启用内部 SSL/TLS 加密八步配置流程以下流程与官方文档一致完整覆盖从关闭 HTTP 到指定内部通信 keystore 的全部步骤。第 1 步禁用 HTTP 端点http-server.http.enabledfalse警告也可以保留 HTTP 端点、仅额外开启 HTTPS但在绝大多数场景下这是一个安全漏洞。如果确实需要此配置应当使用防火墙将 HTTP 端点的访问限制在允许的主机上。第 2 步让集群使用节点的 FQDN 通信SSL 证书基于主机名校验因此节点必须以完全限定域名FQDN互相标识。两种方式任选其一方式一推荐DNS 配置正确时让节点用系统主机名hostname --fqdn的输出向 Coordinator 自我介绍node.internal-address-sourceFQDN方式二手动指定每个节点的 FQDN。该值每台主机都不同且主机应位于同一域名下便于签发覆盖全集群的 SSL 证书。例如coordinator.example.com、worker1.example.com、worker2.example.comnode.internal-address节点 fqdn第 3 步生成 Java Keystore 文件集群内每个 Presto 节点都必须能连接同集群内的任意其他节点。理论上可以为每台主机按其 FQDN 签发唯一证书再把所有主机公钥合并进一个 keystore 指定给客户端见第 8 步但大多数情况下直接在证书中使用通配符wildcard更简单示例如下keytool -genkeypair -alias example.com -keyalg RSA -keystore keystore.jks Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: *.example.com What is the name of your organizational unit? [Unknown]: What is the name of your organization? [Unknown]: What is the name of your City or Locality? [Unknown]: What is the name of your State or Province? [Unknown]: What is the two-letter country code for this unit? [Unknown]: Is CN*.example.com, OUUnknown, OUnknown, LUnknown, STUnknown, CUnknown correct? [no]: yes Enter key password for presto (RETURN if same as keystore password):注意将example.com替换为你的实际域名。命令输出中Enter key password for presto里的presto会显示为创建时填写的别名alias。第 4 步将 keystore 分发到整个集群keystore 文件需要复制到所有 Coordinator 与 Worker 节点上并确保各节点配置中的路径一致。第 5 步启用 HTTPS 端点http-server.https.enabledtrue http-server.https.porthttps 端口 http-server.https.keystore.pathkeystore 路径 http-server.https.keystore.keykeystore 密码说明将http-server.https.port设为0会使用临时ephemeral端口。第 6 步将 discovery URI 改为 HTTPSdiscovery.urihttps://coordinator fqdn:https 端口discovery 服务是节点发现与注册的中心Worker 通过该 URI 向 Coordinator 注册并获取集群拓扑必须与第 5 步的 HTTPS 端口保持一致。第 7 步要求内部通信必须使用 HTTPSinternal-communication.https.requiredtrue该属性对应 InternalCommunicationConfig.java 中的setHttpsRequired方法。从测试用例 TestInternalCommunicationConfig.java 可以确认其默认值为false即默认不强制 HTTPS只有显式开启后节点间 HTTP 明文通信才会被拒绝。第 8 步为内部通信指定 Java Keystoreinternal-communication.https.keystore.pathkeystore 路径 internal-communication.https.keystore.keykeystore 密码这两个属性在源码中分别对应setKeyStorePath与setKeyStorePassword后者带有ConfigSecuritySensitive注解即安全敏感配置见 InternalCommunicationConfig.java。完整配置示例仓库中的产品测试配置提供了可直接对照的完整示例。Coordinator 端配置见 multinode-tls-master.propertiesnode.internal-address-sourceFQDN coordinatortrue discovery-server.enabledtrue discovery.urihttps://presto-master.docker.cluster:7778 http-server.http.enabledfalse http-server.https.enabledtrue http-server.https.port7778 http-server.https.keystore.path/docker/volumes/conf/presto/etc/docker.cluster.jks http-server.https.keystore.key123456 internal-communication.https.requiredtrue internal-communication.https.keystore.path/docker/volumes/conf/presto/etc/docker.cluster.jks internal-communication.https.keystore.key123456Worker 端配置见 multinode-tls-worker.properties与 Coordinator 唯一的实质差异是coordinatorfalse且不启用discovery-server其余 SSL/TLS 与内部通信属性完全一致——这正印证了官方文档同一套属性、每节点必配的原则。信任库与密码套件的扩展配置除文档主流程外InternalCommunicationConfig.java 还支持以下可选属性用于更精细的安全控制属性作用internal-communication.https.trust-store-path内部通信信任库路径internal-communication.https.trust-store-password内部通信信任库密码安全敏感internal-communication.https.included-cipher仅允许指定的密码套件internal-communication.https.excluded-cipher排除指定的密码套件三、内部认证Internal Authentication仅启用 TLS 加密解决的是数据在传输中保密而内部认证解决的是谁在通信。启用后所有节点间通信请求都必须携带合法凭证未认证的请求会被拒绝。内部认证的启用具有如下约束关系文档原文语义仅配置内部 TLS 加密时内部认证可选仅配置客户端与 Coordinator 之间的外部认证时内部认证可选同时配置内部 TLS 与外部认证时内部认证为强制项Mandatory。内部认证有三种实现方式JWT、CERTIFICATE、KERBEROS。方式一JWT推荐且最常用在所有节点的config.properties中启用 JWT 并把共享密钥设置为同一个值internal-communication.jwt.enabledtrue internal-communication.shared-secretsecret共享密钥建议使用足够大的随机值可用以下 Linux 命令生成openssl rand 512 | base64源码实现细节从 InternalCommunicationConfig.java 可以看到一条内置校验规则AssertTrue(message When internal JWT(...) authentication is enabled, a shared secret(...) is required)——即启用了 JWT 就必须提供 shared-secret二者缺一不可配置不合法时集群将无法启动。实际认证逻辑在 InternalAuthenticationManager.java 中实现使用HS256HMAC-SHA256算法以 shared-secret 的 SHA-256 哈希作为签名密钥第 L60-L62 行出站请求通过filterRequest在头部添加X-Presto-Internal-Bearer头携带 JWT第 L124-L134 行入站请求通过authenticateInternalRequest解析并校验该头JWT 的subject为发送方节点的node.id第 L74-L122 行JWT 有效期仅5 分钟第 L79 行过期即失效避免令牌长期有效带来的风险。产品测试配置中同时启用 TLS 与 JWT 的示例见 multinode-tls-master.properties 与 singlenode-kerberized.properties。方式二CERTIFICATECERTIFICATE 内部认证与外部认证机制相互独立。例如若客户端与 Coordinator 之间使用 PASSWORD 认证仍可在内部使用 CERTIFICATE 认证只需在同一个配置中同时指定http-server.authentication.typePASSWORD,CERTIFICATE此时内部认证将复用上文内部 SSL/TLS 配置中已经建立的 keystore 配置即internal-communication.https.keystore.*基于节点证书完成身份验证。方式三KERBEROS如果已启用 Kerberos 服务器认证见 Presto Kerberos 认证文档可在 SSL/TLS 属性之外为内部通信指定有效的 Kerberos 凭证internal-communication.kerberos.enabledtrue该属性在源码中的常量定义为INTERNAL_COMMUNICATION_KERBEROS_ENABLED见 InternalCommunicationConfig.java。关键注意点内部 Kerberos 认证使用的service name 与 keytab 文件取自服务器 Kerberos 认证属性即http.server.authentication.krb5.service-name与http.server.authentication.krb5.keytab详见 Presto Kerberos 认证文档必须确保Worker 节点也完成 Kerberos 配置内部通信使用的 Kerberos principal 由http.server.authentication.krb5.service-name拼接运行 Presto 节点的 hostname再加上 Kerberos 配置中的默认 realm 构成可选属性internal-communication.kerberos.use-canonical-hostname默认true控制是否使用规范化主机名相关实现同样位于 InternalCommunicationConfig.java。仓库中同时启用 Kerberos 外部认证、CERTIFICATE 内部认证与 JWT 的完整参考配置见 singlenode-kerberized.properties。四、启用加密后的性能影响启用加密必然带来性能损耗且损耗幅度随环境、查询类型与并发度差异很大节点间数据传输量小的查询如SELECT count(*) FROM table性能影响可忽略不计CPU 密集型且需要大量节点间数据传输的查询如分布式 join、聚合、窗口函数等需要重分区repartition的操作性能影响可能相当显著根据网络流量与 CPU 利用率的不同降速幅度约在 10% 到 100% 以上。因此在决定启用内部加密前建议先评估集群中数据密集型查询尤其是大规模分布式聚合与 join的占比并在测试环境实测加密前后的吞吐差异。五、高级性能调优随机数源在某些场景下调整随机数来源可以显著改善性能。问题根源默认情况下TLS 加密使用系统设备/dev/urandom作为熵源。该设备的吞吐量有限在网络带宽很高的环境例如 InfiniBand 网络中它可能成为性能瓶颈。调优方案一切换随机数算法为 SHA1PRNG在 Coordinator 与所有 Worker 的config.properties中设置http-server.https.secure-random-algorithmSHA1PRNG调优方案二调整种子来源需要注意SHA1PRNG算法会从阻塞式的/dev/random设备获取初始种子。对于熵不足以完成播种的环境可以通过在jvm.config中添加java.security.egd属性将种子来源改回/dev/urandom-Djava.security.egdfile:/dev/urandom使用建议先在小范围节点上验证SHA1PRNG的收益与稳定性再逐步推广到全集群若环境熵源充足/dev/urandom默认配置通常已足够安全。六、配置自检清单完成上述配置后建议按以下清单核对依据本文与仓库源码归纳所有节点均已配置 SSL/TLS 属性无遗漏、无错配任一节点配置错误都会导致无法与其他节点通信已禁用 HTTP 端点或已用防火墙限制 HTTP 端点的访问范围各节点以 FQDN 互相标识node.internal-address-sourceFQDN或手动指定node.internal-address且证书 CN/通配符与主机名匹配discovery.uri已切换为 HTTPS 并指向 Coordinator 的 HTTPS 端口同时启用内部 TLS 与外部认证时已配置内部认证JWT / CERTIFICATE / KERBEROS 三者之一启用 JWT 时已同步在所有节点配置相同的internal-communication.shared-secret生产环境使用openssl rand 512 | base64生成的高强度随机共享密钥而非示例中的明文弱口令已在测试环境验证加密后典型工作负载的性能损耗并按需应用随机数源调优。相关资源本文档源文件presto-docs/src/main/sphinx/security/internal-communication.rst内部通信配置解析实现InternalCommunicationConfig.javaJWT 内部认证实现InternalAuthenticationManager.java配置默认值验证测试TestInternalCommunicationConfig.java端到端参考配置Coordinator / Workermultinode-tls-master.properties、multinode-tls-worker.properties、singlenode-kerberized.properties关联文档Presto 安全总览、Presto Kerberos 服务器认证、config.properties 属性参考【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址: https://gitcode.com/gh_mirrors/pre/presto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表