hetu-core/hetu-docs/zh/security/internal-communication.md

5.8 KiB
Raw Permalink Blame History

内部通信安全

openLooKeng集群可以通过配置使用安全通信。 可使用SSL/TLS确保openLooKeng节点间的通信安全。

内部SSL/TLS配置

config.properties文件中进行SSL/TLS配置。使用相同的属性对工作worker)节点和协调(coordinator)节点上的SSL/TLS进行配置。集群中每个节点都需要进行配置。未配置SSL/TLS或配置错误的节点将无法与集群中的其他节点进行通信。

为openLooKeng内部通信启用SSL/TLS功能执行以下步骤

  1. 禁用HTTP端点。

    http-server.http.enabled=false
    

    警告

    可以在不禁用HTTP的情况下开启HTTPS。但在大多数情况下这会有安全风险。 如果您确定要使用此配置则应考虑使用防火墙来确保HTTP端点不被非法的主机访问。

  2. 配置集群使用集群节点的FQDN全量域名进行通信。可通过以下两种方式实现

    • 如果DNS服务配置正常可以让节点使用从系统配置获得的主机名hostname --fqdn)向协调节点介绍自己。

      node.internal-address-source=FQDN
      
    • 手动指定每个节点的完全限定主机名。每台主机的主机名应该不同。主机应该在同一个域中以便创建正确的SSL/TLS证书。如coordinator.example.com, worker1.example.com, worker2.example.com.

      node.internal-address=<node fqdn>
      
  3. 生成Java 密钥库文件。每个openLooKeng节点必须能够连接到同一集群中的任何其他节点。可以使用每台主机的完全限定主机名为每个节点创建唯一的证书创建包含所有主机的所有公钥的密钥库并为客户端指定密钥库见下面的步骤8)。在大多数情况下,在证书中使用通配符会更简单,如下所示。

    keytool -genkeypair -alias openLooKeng -keyalg RSA -keystore keystore.jks -keysize 2048
    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, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
      [no]:  yes
    
    Enter key password for <openLooKeng>
            (RETURN if same as keystore password):
    

    建议keysize不小于2048

  4. 为openLooKeng集群分发Java密钥库文件。

  5. 启用HTTPS端点。

    http-server.https.enabled=true
    http-server.https.port=<https port>
    http-server.https.keystore.path=<keystore path>
    http-server.https.keystore.key=<keystore password>
    
  6. 将discovery URI修改为HTTPS地址。

    discovery.uri=https://<coordinator fqdn>:<https port>
    
  7. 配置内部通信需要使用HTTPS协议。

    internal-communication.https.required=true
    
  8. 配置内部通信使用Java密钥库文件。

    internal-communication.https.keystore.path=<keystore path>
    internal-communication.https.keystore.key=<keystore password>
    

使用Kerberos进行内部SSL/TLS通信

如果启用了Kerberos认证除了配置SSL/TLS属性外还需要配置有效的Kerberos凭证用于内部通信。

internal-communication.kerberos.enabled=true

注意

用于内部Kerberos认证的服务名和keytab文件来自于服务器Kerberos认证属性这些属性分别在Kerberos</security/server>, http.server.authentication.krb5.service-namehttp.server.authentication.krb5.keytab文档中设置。在worker节点上也必须完成Kerberos设置。用于内部通信的Kerberos主体是通过http.server.authentication.krb5.service-name后面追加主机名运行openLooKeng服务的节点的和默认域Kerberos配置来构建的。

开启SSL/TLS后性能

启用加密会影响性能。性能下降可能因环境、查询数和并发度而异。

对于不需要在openLooKeng节点之间传输太多数据的查询例如SELECT count(* FROM table),对性能影响可以忽略。

但是对于需要在节点之间传输大量数据的CPU密集型查询例如需要重分区的分布式联接、聚合和窗口函数性能影响可能相当大。 根据网络流量和CPU利用率的不同可能会有10%到100%以上的减速。

高级性能调优

在某些情况下,改变随机数的来源可显著提高性能。

TLS加密默认使用系统设备/dev/urandom作为熵源。这种设备吞吐量有限在具有高网络带宽例如InfiniBand的环境中可能会成为瓶颈。在这种情况下建议尝试将随机数生成器算法切换为SHA1PRNG。方法是在协调节点和所有worker节点通过config.properties中的http-server.https.secure-random-algorithm属性进行设置。

http-server.https.secure-random-algorithm=SHA1PRNG

请注意,此算法从阻塞/dev/random设备获取初始种子。对于没有足够熵来生成SHAPRNG算法的环境,可以通过在jvm.config中添加java.security.egd属性,将源改为/dev/urandom

-Djava.security.egd=file:/dev/urandom