ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Presto 集群 TLS 安全配置实战:Java Keystore 与 Truststore 全解析

Presto 集群 TLS 安全配置实战:Java Keystore 与 Truststore 全解析 大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载Presto 分布式 SQL 查询引擎在启用 Kerberos、LDAP 或密码文件认证时客户端与 coordinator 之间的访问必须通过 HTTPS 进行而这一切都建立在 Java Keystore 与 Truststore 文件之上。本文以 Presto 官方安全文档中关于 TLS 证书仓库的章节为主线完整讲解服务端 Keystore 的生成与配置、客户端 Truststore 的导入与验证、内部节点间 SSL/TLS 通信的证书策略并结合本仓库源码给出可复制、可运行的实操方案。读完本文你将掌握使用keytool为 Presto 集群生成证书、配置config.properties中的 HTTPS 参数、以及排查证书与密码类故障的完整技能。TLS 在 Presto 安全体系中的位置在 Presto 中TLS/HTTPS 是其他一切认证机制Kerberos、LDAP、密码文件认证的安全底座。当使用这些认证方式时访问 Presto coordinator 必须走 HTTPS 通道否则用户名、密码或票据在网络上以明文传输认证形同虚设。根据 server.rst 的描述coordinator 的 TLS 配置由 Java Keystore 文件承载其中保存着 coordinator 的私钥与证书客户端Presto CLI、JDBC/ODBC 驱动则通过 Truststore 文件来决定是否信任 coordinator 出示的证书如果还要进一步加固集群内部 worker 与 coordinator 之间的通信则需要为每个节点配置相同的 SSL/TLS 参数与 keystore。这三层关系可以用一句话概括Keystore 证明我是谁Truststore 决定我信谁。Java Keystore File for TLS服务端证书仓库使用 keytool 生成密钥对Presto coordinator 使用的密钥对由 JDK 自带的keytool工具生成并保存在 Java KeystoreJKS文件中。文档给出的标准命令如下keytool -genkeypair -alias presto -keyalg RSA -keystore presto_keystore.jks Enter keystore password: Re-enter new password: What is your first and last name? [Unknown]: presto-coordinator.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 CNpresto-coordinator.example.com, OUUnknown, OUnknown, LUnknown, STUnknown, CUnknown correct? [no]: yes Enter key password for presto (RETURN if same as keystore password):这条命令的含义与注意点如下参数说明-genkeypair生成新的密钥对公钥 私钥与自签名证书-alias presto证书条目的别名。在 server.rst 的 Kerberos 场景中别名应与 coordinator 使用的 Kerberos principal 相匹配即presto-keyalg RSA密钥算法使用 RSA-keystore presto_keystore.jks输出 keystore 文件名在交互提示中最重要的输入是 first and last name即证书的Common NameCN这里必须填写Presto coordinator 的完整主机名如presto-coordinator.example.com因为客户端在校验证书时会比对证书 CN 与访问的域名。交互结束后会回显CNpresto-coordinator.example.com, OUUnknown, OUnknown, LUnknown, STUnknown, CUnknown供你确认确认无误后输入yes并可选设置独立的密钥密码。本地开发提示如果你只是想在本机搭建安全客户端到 coordinator 通信的测试环境、使用自签名证书那么 Common Name 应直接填写localhost否则浏览器或 CLI 在校验证书时会因域名不匹配而报错。在 config.properties 中启用 HTTPS生成的 keystore 文件需要配置到 coordinator 的config.properties中。文档给出的最小配置为http-server.https.keystore.path/etc/presto_keystore.jks http-server.https.keystore.keykeystore_password结合 server.rst 的完整 HTTPS 配置段落一个典型的启用 HTTPS 的配置片段如下http-server.https.enabledtrue http-server.https.port7778 http-server.https.keystore.path/etc/presto_keystore.jks http-server.https.keystore.keykeystore_password属性说明http-server.https.enabled是否启用 HTTPS 访问应设为truehttp-server.https.portHTTPS 监听端口http-server.https.keystore.pathJava Keystore 文件的路径http-server.https.keystore.keykeystore 的密码必须与生成 keystore 时设置的密码一致http-server.http2.enabled是否在服务端启用 HTTP/2注意http-server.https.keystore.key是 keystore 文件的密码而文档示例中按回车让密钥密码与 keystore 密码相同这两者必须保持一致才能正常加载证书。在 Kerberos 认证场景下还需要同时配置http-server.authentication.typeKERBEROS以及 krb5 相关的 service-name、keytab 等参数详见 server.rst。仓库中 presto-main/etc/config.properties 与 docker/etc/config.properties.example 提供了可直接参考的完整配置骨架可在此基础上追加上述 HTTPS 参数。Java Truststore File for TLS客户端信任仓库Truststore 的作用Truststore 文件中保存的是受信任的 TLS/SSL 服务器证书或受信任的证书颁发机构CA证书。对于 Presto CLI 而言要让它信任 coordinator就必须把 coordinator 的证书导入到 CLI 使用的 truststore 中。这里有两种常见情况证书由知名 CA 签发此时证书很可能已经存在于 JVM 默认的信任库JAVA_HOME/jre/lib/security/cacerts中现代 JDK 该路径多为JAVA_HOME/lib/security/cacerts无需再次导入也无需自建 truststore。证书由私有 CA 签发或使用自签名证书测试此时需要将证书导入默认 Java truststore或导入到一个自定义 truststore。文档特别提醒如果选择修改默认 truststore务必谨慎因为可能需要删除你不信任的 CA 证书以免因信任了不该信任的 CA 而带来安全风险。使用 keytool 导入证书使用keytool将 coordinator 的证书导入自定义 truststore 的命令如下$ keytool -import -v -trustcacerts -alias presto_trust -file presto_certificate.cer -keystore presto_trust.jks -keypass truststore_pass执行后keytool会提示你确认是否信任该证书输入yes完成导入。各参数含义参数说明-import导入证书到 truststore-v详细verbose输出-trustcacerts将被信任的 CA 证书作为信任锚参与校验-alias presto_trust该证书条目在 truststore 中的别名-file presto_certificate.cer待导入的证书文件通常是导出自 coordinator keystore 的证书-keystore presto_trust.jks目标 truststore 文件-keypass truststore_passtruststore 密码客户端如何使用 truststore在 cli.rst 描述的 Kerberos 认证场景中CLI 通过以下参数指定 keystore这里 CLI 侧实际使用的是 coordinator 的 keystore 文件或导出的 truststore./presto \ --server https://presto-coordinator.example.com:7778 \ --krb5-config-path /etc/krb5.conf \ --krb5-principal someuserEXAMPLE.COM \ --krb5-keytab-path /home/someuser/someuser.keytab \ --krb5-remote-service-name presto \ --keystore-path /tmp/presto.jks \ --keystore-password password \ --catalog catalog \ --schema schema其中--server必须使用 HTTPS 地址且端口要指向 coordinator 的 HTTPS 监听端口如上面的 7778--keystore-path与--keystore-password即对应本文所述的证书仓库文件与其密码。JDBC/ODBC 驱动同理在连接字符串中提供信任库路径与密码即可完成对 coordinator 的身份校验。内部节点通信集群内 SSL/TLS 的 Keystore 策略除客户端到 coordinator 的 HTTPS 之外Presto 还支持对 coordinator 与 worker 之间的内部通信启用 SSL/TLS。根据 internal-communication.rst集群内每个节点的 keystore 配置属性完全一致任何未配置或配置错误的节点都将无法与其他节点通信。其核心步骤与 keystore 相关的部分如下1. 生成证书优先使用通配符证书由于集群内每个节点都要能与其他任意节点建立 TLS 连接为每个主机生成唯一证书虽然可行需要在客户端侧 keystore 中包含所有主机公钥但更简单的做法是生成一个包含通配符的证书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 ... Is CN*.example.com, OUUnknown, OUnknown, LUnknown, STUnknown, CUnknown correct? [no]: yes Enter key password for presto (RETURN if same as keystore password):这里 CN 填写*.example.com请将example.com替换为你实际的域名一个通配符证书即可覆盖coordinator.example.com、worker1.example.com、worker2.example.com等所有同域节点。2. 分发 keystore 并启用 HTTPS将生成的 keystore 分发到集群所有节点然后在每个节点的config.properties中配置http-server.https.enabledtrue http-server.https.porthttps port http-server.https.keystore.pathkeystore path http-server.https.keystore.keykeystore password将http-server.https.port设为0会使用临时ephemeral端口。3. 配置发现服务与强制内部 HTTPSdiscovery.urihttps://coordinator fqdn:https port internal-communication.https.requiredtrue internal-communication.https.keystore.pathkeystore path internal-communication.https.keystore.keykeystore passwordinternal-communication.https.requiredtrue强制内部通信必须走 HTTPS这是保障集群内流量不被窃听的关键开关。此外为保证节点之间通过全限定域名FQDN互相发现建议配置node.internal-address-sourceFQDN或在每台主机上显式指定node.internal-addressnode fqdn确保证书 CN 与节点实际访问地址一致。从源码结构看仓库中的 ReactorNettyHttpClientConfig.java 提供了内部通信客户端的 HTTPS 配置项如reactor.https-enabled、reactor.keystore-path、reactor.keystore-password、reactor.truststore-path与reactor.cipher-suites它们与文档所述的内部 TLS 配置相辅相成可用于基于 Reactor Netty 的 HTTP/2 内部通信链路。密码套件与随机数源HTTPS 性能调优启用 HTTPS 之后coordinator 的 CPU 占用是需要重点监控的指标。根据 server.rst 的说明如果让 Java 从一大串密码套件中自由选择它会倾向选择 CPU 密集型的套件。此时可以通过限制密码套件来降低 CPU 开销http-server.https.included-cipherTLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256 http-server.https.excluded-cipher注意非前向保密non-FS密码套件默认是禁用的因此如果你想选用非 FS 套件必须把http-server.https.excluded-cipher设为空列表以覆盖默认排除规则。前向保密Forward SecrecyFS指即使私钥泄露历史会话流量也无法被解密因此默认排除非 FS 套件是更安全的姿态。另一个性能调优点来自 internal-communication.rst默认情况下 TLS 加密使用/dev/urandom作为熵源其吞吐有限在高带宽环境如 InfiniBand下可能成为瓶颈。此时可以在 coordinator 与所有 worker 的config.properties中切换随机数生成算法http-server.https.secure-random-algorithmSHA1PRNG同时需要注意SHA1PRNG的初始种子取自阻塞式的/dev/random设备如果环境熵不足可通过在jvm.config中添加以下参数将种子源改为/dev/urandom-Djava.security.egdfile:/dev/urandom故障排查验证 Keystore 与证书链验证 keystore 密码与内容当遇到 HTTPS 无法建立连接、或加载 keystore 时报密码错误时第一件事是验证 keystore 文件的密码与内容。使用keytool列出并详细查看 keystore$ keytool -list -v -keystore /etc/presto/presto.jks该命令会要求输入 keystore 密码随后以详细模式输出所有证书条目的指纹、有效期、所有者与颁发者等信息。通过它你可以确认keystore 密码是否正确密码错误会直接报错证书 CN 是否与主机名一致证书是否过期。结合 Kerberos 场景的排查如果 TLS 是配合 Kerberos 认证使用的server.rst 建议在 Presto 之外独立验证基础环境以缩小问题范围$ telnet kdc.example.com 88 $ kinit -kt /etc/presto/presto.keytab prestoEXAMPLE.COM $ klisttelnet kdc.example.com 88确认 coordinator 能连通 KDC 的 88 端口kinit -kt ...确认 keytab 能成功换取票据klist查看当前票据缓存。若仍需更深入的 Kerberos 调试信息可在jvm.config中加入-Dsun.security.krb5.debugtrue -Dlog.enable-consoletrue-Dsun.security.krb5.debugtrue会输出 JRE Kerberos 库的调试信息到stdoutPresto 将其重定向到日志系统-Dlog.enable-consoletrue则让stdout输出真正出现在日志中。调试信息的详略程度取决于认证失败的具体环节异常消息与堆栈也是定位问题的关键线索。小结Presto 的 TLS 安全配置围绕两个核心文件展开保存私钥与自身证书的Java Keystore服务端和保存受信 CA 或对端证书的Truststore客户端。本文完整覆盖了用keytool -genkeypair为 coordinator 生成密钥对CN 填写主机名本地测试填localhost在config.properties中通过http-server.https.keystore.path/key启用 HTTPS用keytool -import将 coordinator 证书导入 CLI 的 truststore集群内部通信使用通配符证书 internal-communication.https.requiredtrue强制 TLS通过限制密码套件与切换随机数算法进行性能调优用keytool -list -v等命令排查证书与密码故障。相关文档与源码可继续深入阅读tls.rst、server.rst、internal-communication.rst、cli.rst以及内部通信客户端 HTTPS 配置实现 ReactorNettyHttpClientConfig.java。赞分享大数据数据库后端【免费下载链接】prestoThe official home of the Presto distributed SQL query engine for big data项目地址https://gitcode.com/gh_mirrors/pre/presto点击查看免费下载相关推荐Alertmanager 安全加固实战Web 服务 TLS、Basic Auth 与集群 Gossip 双向 TLS 完整配置指南Alertmanager 安全加固实战Web 服务 TLS、Basic Auth 与集群 Gossip 双向 TLS 完整配置指南 Alertmanager后端可观测性告警消息路由Presto C 集群 Connector Federation 实战FlightShim 与 Arrow Flight 部署配置详解Presto C 集群 Connector Federation 实战FlightShim 与 Arrow Flight 部署配置详解 本指南基于当前仓库大数据数据库后端Presto CPrestissimoDocker 安装指南Java Coordinator 与 Velox 原生 Worker 集群搭建实战Presto CPrestissimoDocker 安装指南Java Coordinator 与 Velox 原生 Worker 集群搭建实战 本篇技大数据数据库后端上一篇foobox-cn远程控制手机变身桌面音乐控制中心下一篇PhotoGIMP从Photoshop到开源图像编辑的无缝迁移完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表