安全內部通訊

Presto 叢集可以設定為使用安全的通訊。Presto 節點之間的通訊可以使用 SSL/TLS 來保護。

內部 SSL/TLS 設定

SSL/TLS 是在 config.properties 檔案中設定。工作節點和協調器節點上的 SSL/TLS 是使用相同的一組屬性來設定。叢集中的每個節點都必須設定。未設定或設定不正確的節點將無法與叢集中的其他節點通訊。

若要為 Presto 內部通訊啟用 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.comworker1.example.comworker2.example.com

      node.internal-address=<node fqdn>
      
  3. 產生 Java 金鑰庫檔案。每個 Presto 節點都必須能夠連線到同一個叢集內的任何其他節點。可以使用每個主機的完整主機名稱為每個節點建立唯一的憑證,建立包含所有主機公鑰的金鑰庫,並為用戶端指定它(請參閱下面的步驟 #8)。在大多數情況下,使用憑證中的萬用字元會比較簡單,如下所示。

    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, OU=Unknown, O=Unknown, L=Unknown, ST=Unknown, C=Unknown correct?
      [no]:  yes
    
    Enter key password for <presto>
            (RETURN if same as keystore password):
    
  4. 在 Presto 叢集中散佈 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. 將探索 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>
    

內部驗證

可以啟用內部驗證以驗證叢集節點之間的所有內部通訊。它是

  • 在僅設定叢集節點之間的內部 TLS 加密時為選用

  • 在僅設定用戶端和協調器之間的外部驗證方法時為選用

  • 在同時設定上述兩者(即內部 TLS 以及外部驗證)時為強制性。

有幾種方法可以啟用以下章節中描述的內部驗證

1. JWT

啟用 JWT 驗證以驗證叢集節點之間的所有通訊。啟用 JWT 並使用以下設定,在叢集的所有節點上的 config.properties 中將共用密碼設定為相同的值

internal-communication.jwt.enabled=true
internal-communication.shared-secret=<secret>

對於共用密碼值,建議使用大型隨機金鑰,並且可以使用下列 Linux 命令產生

openssl rand 512 | base64

2. CERTIFICATE

設定與外部驗證方法不同的 CERTIFICATE 驗證方法。

例如,如果用戶端和協調器之間使用 PASSWORD 驗證,則可以使用 CERTIFICATE 驗證於內部,方法是在以下給出的相同設定中指定此驗證方法。在 內部 ssl/tls 設定 中設定的現有金鑰庫設定將用於憑證驗證。

http-server.authentication.type=PASSWORD,CERTIFICATE

3. KERBEROS

如果已啟用Kerberos驗證,除了 SSL/TLS 屬性之外,還需指定用於內部通訊的有效 Kerberos 認證。

internal-communication.kerberos.enabled=true

注意

用於內部 Kerberos 驗證的服務名稱和 keytab 檔案取自伺服器 Kerberos 驗證屬性,記錄在Kerberos中,分別為 http.server.authentication.krb5.service-namehttp.server.authentication.krb5.keytab。請確保您也在工作節點上完成了 Kerberos 設定。用於內部通訊的 Kerberos 主體是從 http.server.authentication.krb5.service-name 建立,在將其附加 Presto 運行的節點的主機名稱和 Kerberos 設定中的預設領域之後。

啟用 SSL/TLS 的效能

啟用加密會影響效能。效能降低可能會因環境、查詢和並行而異。

對於不需要在 Presto 節點之間傳輸太多資料的查詢(例如 SELECT count(*) FROM table),效能影響可以忽略不計。

但是,對於需要在節點之間傳輸大量資料的 CPU 密集型查詢(例如,分散式聯結、彙總和視窗函式,需要重新分區),效能影響可能會相當大。根據網路流量和 CPU 使用率,速度減慢可能會從 10% 到甚至 100%+ 不等。

進階效能調校

在某些情況下,變更亂數來源將顯著提高效能。

依預設,TLS 加密使用 /dev/urandom 系統裝置作為熵的來源。此裝置的吞吐量有限,因此在高網路頻寬(例如 InfiniBand)的環境中,它可能會成為瓶頸。在這種情況下,建議嘗試將亂數產生器演算法切換為 SHA1PRNG,方法是在協調器和所有工作節點上的 config.properties 中透過 http-server.https.secure-random-algorithm 屬性進行設定

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

請注意,此演算法從阻塞的 /dev/random 裝置中取得初始種子。對於沒有足夠熵來種植 SHAPRNG 演算法的環境,可以透過將 java.security.egd 屬性新增至 jvm.config,將來源變更為 /dev/urandom

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