LDAP 身份驗證

Presto 可以設定為啟用透過 HTTPS 針對用戶端(例如 Presto CLI 或 JDBC 和 ODBC 驅動程式)的前端 LDAP 身份驗證。目前僅支援涉及使用者名稱和密碼的簡單 LDAP 身份驗證機制。Presto 用戶端會將使用者名稱和密碼傳送至協調器,而協調器會使用外部 LDAP 服務驗證這些憑證。

若要為 Presto 啟用 LDAP 身份驗證,請在 Presto 協調器上進行組態變更。不需要變更工作節點設定;只會驗證從用戶端到協調器的通訊。但是,如果您想使用 SSL/TLS 保護 Presto 節點之間的通訊,請設定 安全內部通訊

Presto 伺服器設定

環境設定

安全 LDAP

Presto 需要安全 LDAP (LDAPS),因此請確定您在 LDAP 伺服器上已啟用 TLS。

Presto 協調器上的 TLS 設定

您需要將 LDAP 伺服器的 TLS 憑證匯入 Presto 協調器的預設 Java 信任儲存區,以保護 TLS 連線。您可以使用下列範例 keytool 命令,將憑證 ldap_server.crt 匯入協調器上的信任儲存區。

$ keytool -import -keystore <JAVA_HOME>/jre/lib/security/cacerts -trustcacerts -alias ldap_server -file ldap_server.crt

除此之外,應透過 HTTPS 存取 Presto 協調器。您可以在協調器上建立 用於 TLS 的 Java 金鑰儲存檔案 來進行。

Presto 協調器節點設定

您必須在設定 Presto 協調器以使用 LDAP 身份驗證和 HTTPS 之前,對環境進行下列變更。

您也需要變更 Presto 設定檔。LDAP 身份驗證會在協調器上分為兩個部分進行設定。第一部分是在協調器的 config.properties 檔案中啟用 HTTPS 支援和密碼驗證。第二部分是將 LDAP 設定為密碼驗證器外掛程式。

伺服器設定屬性

以下是需要新增至協調器的 config.properties 檔案的必要屬性範例

http-server.authentication.type=PASSWORD

http-server.https.enabled=true
http-server.https.port=8443

http-server.https.keystore.path=/etc/presto_keystore.jks
http-server.https.keystore.key=keystore_password

屬性

描述

http-server.authentication.type

啟用 Presto 協調器的密碼驗證。必須設定為 PASSWORD

http-server.https.enabled

啟用 Presto 協調器的 HTTPS 存取。應設定為 true。預設值為 false

http-server.https.port

HTTPS 伺服器連接埠。

http-server.https.keystore.path

將用來保護 TLS 的 Java 金鑰儲存檔案的位置。

http-server.https.keystore.key

金鑰儲存的密碼。這必須與您在建立金鑰儲存時指定的密碼相符。

http-server.authentication.allow-forwarded-https

啟用將透過 HTTP 轉送的 HTTPS 要求視為安全。需要將轉送要求上的 X-Forwarded-Proto 標頭設定為 https。預設值為 false

密碼驗證器設定

需要將密碼驗證設定為使用 LDAP。在協調器上建立 etc/password-authenticator.properties 檔案。範例

password-authenticator.name=ldap
ldap.url=ldaps://ldap-server:636
ldap.user-bind-pattern=<Refer below for usage>

屬性

描述

ldap.url

LDAP 伺服器的 URL。由於 Presto 只允許安全 LDAP,因此 URL 協定必須是 ldaps://

ldap.user-bind-pattern

此屬性可用來指定密碼驗證的 LDAP 使用者繫結字串。此屬性必須包含 ${USER} 模式,在密碼驗證期間會將其取代為實際的使用者名稱。範例:${USER}@corp.example.com

根據 LDAP 伺服器實作類型,ldap.user-bind-pattern 屬性可以使用如下所述的方式。

Active Directory
ldap.user-bind-pattern=${USER}@<domain_name_of_the_server>

範例

ldap.user-bind-pattern=${USER}@corp.example.com
OpenLDAP
ldap.user-bind-pattern=uid=${USER},<distinguished_name_of_the_user>

範例

ldap.user-bind-pattern=uid=${USER},OU=America,DC=corp,DC=example,DC=com

基於 LDAP 群組成員資格的授權

除了基本 LDAP 身份驗證屬性之外,您還可以透過設定選用的 ldap.group-auth-patternldap.user-base-dn 屬性,進一步限制允許連線至 Presto 協調器的使用者集。

屬性

描述

ldap.user-base-dn

嘗試連線至伺服器的使用者的基本 LDAP 識別名稱。範例:OU=America,DC=corp,DC=example,DC=com

ldap.group-auth-pattern

此屬性用來指定 LDAP 群組成員資格授權的 LDAP 查詢。此查詢會針對 LDAP 伺服器執行,如果成功,則會授權使用者。此屬性必須包含 ${USER} 模式,在群組授權搜尋查詢中會將其取代為實際的使用者名稱。請參閱以下範例。

根據 LDAP 伺服器實作類型,ldap.group-auth-pattern 屬性可以使用如下所述的方式。

Active Directory
ldap.group-auth-pattern=(&(objectClass=<objectclass_of_user>)(sAMAccountName=${USER})(memberof=<dn_of_the_authorized_group>))

範例

ldap.group-auth-pattern=(&(objectClass=person)(sAMAccountName=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))
OpenLDAP
ldap.group-auth-pattern=(&(objectClass=<objectclass_of_user>)(uid=${USER})(memberof=<dn_of_the_authorized_group>))

範例

ldap.group-auth-pattern=(&(objectClass=inetOrgPerson)(uid=${USER})(memberof=CN=AuthorizedGroup,OU=Asia,DC=corp,DC=example,DC=com))

對於 OpenLDAP,若要讓此查詢運作,請確定您已啟用 memberOf 覆蓋

您也可以將此屬性用於需要根據複雜的群組授權搜尋查詢來授權使用者的情況。例如,如果您想要授權屬於多個群組(在 OpenLDAP 中)的任何一個使用者,則可以將此屬性設定如下

ldap.group-auth-pattern=(&(|(memberOf=CN=normal_group,DC=corp,DC=com)(memberOf=CN=another_group,DC=com))(objectClass=inetOrgPerson)(uid=${USER}))

Presto CLI

環境設定

TLS 設定

使用 LDAP 驗證時,應透過 HTTPS 連線至 Presto 協調器。Presto CLI 可以使用 Java 金鑰儲存庫 檔案或 Java 信任儲存庫 來進行 TLS 設定。

如果您使用金鑰儲存庫檔案,可以將其複製到用戶端機器並用於其 TLS 設定。如果您使用信任儲存庫,則可以使用預設的 Java 信任儲存庫,或在 CLI 上建立自訂的信任儲存庫。我們不建議在生產環境中使用自我簽署的憑證。

Presto CLI 執行

除了連線到不需要 LDAP 驗證的 Presto 協調器時所需的選項之外,啟用 LDAP 支援時呼叫 CLI 還需要一些額外的命令列選項。您可以使用 --keystore-*--truststore-* 屬性來保護 TLS 連線。呼叫 CLI 的最簡單方法是使用包裝腳本。

#!/bin/bash

./presto \
--server https://presto-coordinator.example.com:8443 \
--keystore-path /tmp/presto.jks \
--keystore-password password \
--truststore-path /tmp/presto_truststore.jks \
--truststore-password password \
--catalog <catalog> \
--schema <schema> \
--user <LDAP user> \
--password

選項

描述

--server

Presto 協調器的位址和連接埠。連接埠必須設定為 Presto 協調器正在偵聽 HTTPS 連線的連接埠。使用 LDAP 驗證時,Presto CLI 不支援為 URL 使用 http 協定。

--keystore-path

將用來保護 TLS 的 Java 金鑰儲存檔案的位置。

--keystore-password

金鑰儲存的密碼。這必須與您在建立金鑰儲存時指定的密碼相符。

--truststore-path

將用於保護 TLS 的 Java 信任儲存庫檔案的位置。

--truststore-password

信任儲存庫的密碼。這必須與您建立信任儲存庫時指定的密碼相符。

--user

LDAP 使用者名稱。對於 Active Directory,這應該是您的 sAMAccountName,對於 OpenLDAP,這應該是使用者的 uid。此使用者名稱將用於替換 config.properties 中指定的屬性中的 ${USER} 預留位置模式。

--password

提示輸入 user 的密碼。

疑難排解

Java 金鑰儲存庫檔案驗證

使用 Java 金鑰儲存庫檔案驗證,驗證金鑰儲存庫檔案的密碼並檢視其內容。

Presto CLI 的 SSL 偵錯

如果在執行 Presto CLI 時遇到任何與 SSL 相關的錯誤,可以使用 -Djavax.net.debug=ssl 參數執行 CLI 以進行偵錯。您應使用 Presto CLI 可執行 JAR 來啟用此功能。例如

java -Djavax.net.debug=ssl \
-jar \
presto-cli-<version>-executable.jar \
--server https://coordinator:8443 \
<other_cli_arguments>

常見的 SSL 錯誤

java.security.cert.CertificateException: No subject alternative names present

當 Presto 協調器的憑證無效,且在 CLI 的 --server 引數中沒有您提供的 IP 時,會出現此錯誤。您必須重新產生協調器的 SSL 憑證,並新增適當的 SAN

在以下情況下,必須將 SAN 新增至此憑證:當 https:// 在 URL 中使用 IP 位址,而不是協調器憑證中包含的網域,且憑證不包含具有相符 IP 位址作為替代屬性的 SAN 參數時。