安全內部通訊¶
Presto 叢集可以設定為使用安全的通訊。Presto 節點之間的通訊可以使用 SSL/TLS 來保護。
內部 SSL/TLS 設定¶
SSL/TLS 是在 config.properties
檔案中設定。工作節點和協調器節點上的 SSL/TLS 是使用相同的一組屬性來設定。叢集中的每個節點都必須設定。未設定或設定不正確的節點將無法與叢集中的其他節點通訊。
若要為 Presto 內部通訊啟用 SSL/TLS,請執行下列操作
停用 HTTP 端點。
http-server.http.enabled=false
警告
您可以在啟用 HTTP 的情況下啟用 HTTPS。在大多數情況下,這是一個安全漏洞。如果您確定要使用此設定,則應考慮使用防火牆來限制對 HTTP 端點的存取,僅允許應該使用它的主機存取。
設定叢集以使用叢集節點的完整網域名稱 (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>
產生 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):
在 Presto 叢集中散佈 Java 金鑰庫檔案。
啟用 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>
將探索 uri 變更為 HTTPS。
discovery.uri=https://<coordinator fqdn>:<https port>
設定內部通訊以要求 HTTPS。
internal-communication.https.required=true
設定內部通訊以使用 Java 金鑰庫檔案。
internal-communication.https.keystore.path=<keystore path> internal-communication.https.keystore.key=<keystore password>
內部驗證¶
可以啟用內部驗證以驗證叢集節點之間的所有內部通訊。它是
有幾種方法可以啟用以下章節中描述的內部驗證
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-name
和 http.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