AuthenticationFilter 篩選器是 Hadoop Auth 的伺服器端元件。
此篩選器必須在所有需要經過驗證要求的 Web 應用程式資源前面進行組態。例如
Hadoop Auth 和相依的 JAR 檔案必須在 Web 應用程式類別路徑中(通常是 WEB-INF/lib
目錄)。
Hadoop Auth 使用 SLF4J-API 進行記錄。Auth Maven POM 相依性定義了 SLF4J API 相依性,但未定義對具體記錄實作的相依性,這必須明確新增至 Web 應用程式。例如,如果 Web 應用程式使用 Log4j,則 SLF4J-LOG4J12 和 LOG4J jar 檔案必須是 Web 應用程式類別路徑的一部分,以及 Log4j 組態檔案。
config.prefix
:如果已指定,所有其他組態參數名稱都必須以該字首開頭。預設值為沒有字首。
[PREFIX.]type
:驗證類型關鍵字(simple
或
kerberos
)或驗證處理常式實作。
[PREFIX.]signature.secret.file
:當 signer.secret.provider
設為 file
時,這是包含用於簽署 HTTP cookie 的機密的檔案位置。
[PREFIX.]token.validity
:已產生驗證令牌的有效時間(以秒為單位)。預設值為 36000
秒。當 signer.secret.provider
設為 random
或 zookeeper
時,這也會用於翻轉間隔。
[PREFIX.]cookie.domain
:用於儲存驗證令牌的 HTTP cookie 要使用的網域。
[PREFIX.]cookie.path
:用於儲存驗證令牌的 HTTP cookie 要使用的路徑。
signer.secret.provider
:指出要使用的 SignerSecretProvider 類別名稱。可能的數值有:file
、random
、zookeeper
或類別名稱。如果未指定,將使用 file
實作;如果失敗,將使用 random
實作。如果要使用「file」,需要指定 signature.secret.file
並指向機密檔案。
重要事項:必須組態並執行 KDC。
若要使用 Kerberos SPNEGO 作為驗證機制,必須使用下列初始化參數組態驗證篩選器
[PREFIX.]type
:關鍵字 kerberos
。
[PREFIX.]kerberos.principal
:Web 應用程式 Kerberos 主體名稱。Kerberos 主體名稱必須以 HTTP/...
開頭。例如:HTTP/localhost@LOCALHOST
。沒有預設值。
[PREFIX.]kerberos.keytab
:包含 kerberos 主體憑證的金鑰表檔案路徑。例如:/Users/tucu/tucu.keytab
。沒有預設值。
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <filter-name>kerberosFilter</filter-name> <filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class> <init-param> <param-name>type</param-name> <param-value>kerberos</param-value> </init-param> <init-param> <param-name>token.validity</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>cookie.domain</param-name> <param-value>.foo.com</param-value> </init-param> <init-param> <param-name>cookie.path</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>kerberos.principal</param-name> <param-value>HTTP/localhost@LOCALHOST</param-value> </init-param> <init-param> <param-name>kerberos.keytab</param-name> <param-value>/tmp/auth.keytab</param-value> </init-param> </filter> <filter-mapping> <filter-name>kerberosFilter</filter-name> <url-pattern>/kerberos/*</url-pattern> </filter-mapping> ... </web-app>
若要使用 Pseudo/Simple 作為驗證機制(信任查詢字串參數「user.name」的值),必須使用下列初始化參數組態驗證篩選器
[PREFIX.]type
:關鍵字 simple
。
[PREFIX.]simple.anonymous.allowed
:布林參數,指出是否允許匿名要求。預設值為 false
。
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <filter-name>simpleFilter</filter-name> <filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class> <init-param> <param-name>type</param-name> <param-value>simple</param-value> </init-param> <init-param> <param-name>token.validity</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>cookie.domain</param-name> <param-value>.foo.com</param-value> </init-param> <init-param> <param-name>cookie.path</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>simple.anonymous.allowed</param-name> <param-value>false</param-value> </init-param> </filter> <filter-mapping> <filter-name>simpleFilter</filter-name> <url-pattern>/simple/*</url-pattern> </filter-mapping> ... </web-app>
重要事項:必須組態並執行 KDC。
AltKerberos 驗證機制是 Kerberos SPNEGO 驗證機制的部份實作衍生,允許「混合」驗證形式,其中非瀏覽器使用 Kerberos SPNEGO,而瀏覽器使用其他驗證形式(由使用者實作)。若要使用 AltKerberos 作為驗證機制(除了提供實作外),除了先前提到的 Kerberos SPNEGO 驗證機制外,還必須使用下列初始化參數組態驗證篩選器
[PREFIX.]type
:要使用的 AltKerberosAuthenticationHandler 實作的完整類別名稱。
[PREFIX.]alt-kerberos.non-browser.user-agents
:應視為非瀏覽器的使用者代理的逗號分隔清單。
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <filter-name>kerberosFilter</filter-name> <filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class> <init-param> <param-name>type</param-name> <param-value>org.my.subclass.of.AltKerberosAuthenticationHandler</param-value> </init-param> <init-param> <param-name>alt-kerberos.non-browser.user-agents</param-name> <param-value>java,curl,wget,perl</param-value> </init-param> <init-param> <param-name>token.validity</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>cookie.domain</param-name> <param-value>.foo.com</param-value> </init-param> <init-param> <param-name>cookie.path</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>kerberos.principal</param-name> <param-value>HTTP/localhost@LOCALHOST</param-value> </init-param> <init-param> <param-name>kerberos.keytab</param-name> <param-value>/tmp/auth.keytab</param-value> </init-param> </filter> <filter-mapping> <filter-name>kerberosFilter</filter-name> <url-pattern>/kerberos/*</url-pattern> </filter-mapping> ... </web-app>
重要事項:必須設定 LDAP 伺服器並執行。當為與 LDAP 伺服器通訊啟用 TLS(透過 ldaps 架構或「啟動 TLS」擴充功能),請在本地端信任儲存區中設定 LDAP 伺服器的公開憑證。
LDAP 驗證機制使用 HTTP 基本驗證架構,根據設定的 LDAP(或 Active Directory)伺服器驗證使用者指定的憑證。驗證篩選器必須設定為下列初始化參數
[PREFIX.]type
:關鍵字 ldap
。
[PREFIX.]ldap.providerurl
:LDAP 伺服器的網址。
[PREFIX.]ldap.basedn
:要與 LDAP 伺服器一起使用的基本識別名稱 (DN)。此值會附加到提供的使用者 ID 以進行驗證目的。此屬性在 Active Directory 伺服器的情況下並無用處。
[PREFIX.]ldap.binddomain
:要與 LDAP 伺服器一起使用的 LDAP 繫結網域值。此屬性是選用的,僅在 Active Directory 伺服器(例如 example.com)的情況下才有用。
[PREFIX.]ldap.enablestarttls
:用於定義 LDAP 伺服器是否支援「啟動 TLS」擴充功能的布林值。
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <filter-name>authFilter</filter-name> <filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class> <init-param> <param-name>type</param-name> <param-value>ldap</param-value> </init-param> <init-param> <param-name>ldap.providerurl</param-name> <param-value>ldap://ldap-server-host:8920</param-value> </init-param> <init-param> <param-name>ldap.basedn</param-name> <param-value>ou=users,dc=example,dc=com</param-value> </init-param> <init-param> <param-name>ldap.enablestarttls</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>authFilter</filter-name> <url-pattern>/ldap/*</url-pattern> </filter-mapping> ... </web-app>
重要事項:此設定同時支援多種驗證機制(例如 kerberos、ldap 等)。請參閱各別架構的說明文件,以取得與設定相關的詳細資料。
多重架構驗證機制透過實作 HTTP 驗證協商機制來支援多種驗證機制(例如 kerberos、ldap 等)(請參閱 RFC-2616)。若要啟用各種類型的驗證機制(例如 ldap),必須設定對應的驗證處理常式。請參閱下列設定參數
[PREFIX.]type
:關鍵字 multi-scheme
。
[PREFIX.]multi-scheme-auth-handler.schemes
:此處理常式支援的 HTTP 驗證機制的逗號分隔清單。此為必要參數,且沒有預設值(例如 multi-scheme-auth-handler.schemes=basic,negotiate)。
[PREFIX.]multi-scheme-auth-handler.schemes.<scheme-name>.handler
:要針對指定的驗證架構使用的驗證處理常式實作。此沒有預設值(例如 multi-scheme-auth-handler.schemes.negotiate.handler=kerberos)。為設定的每個架構新增此處理常式設定。
除了這些參數之外,請也指定各個已設定處理常式的初始化參數。
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <filter-name>authFilter</filter-name> <filter-class>org.apache.hadoop.security.authentication.server.AuthenticationFilter</filter-class> <init-param> <param-name>type</param-name> <param-value>multi-scheme</param-value> </init-param> <init-param> <param-name>multi-scheme-auth-handler.schemes</param-name> <param-value>basic,negotiate</param-value> </init-param> <init-param> <param-name>multi-scheme-auth-handler.basic.handler</param-name> <param-value>ldap</param-value> </init-param> <init-param> <param-name>multi-scheme-auth-handler.negotiate.handler</param-name> <param-value>kerberos</param-value> </init-param> <init-param> <param-name>ldap.providerurl</param-name> <param-value>ldap://ldap-server-host:8920</param-value> </init-param> <init-param> <param-name>ldap.basedn</param-name> <param-value>ou=users,dc=example,dc=com</param-value> </init-param> <init-param> <param-name>ldap.enablestarttls</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>token.validity</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>cookie.domain</param-name> <param-value>.foo.com</param-value> </init-param> <init-param> <param-name>cookie.path</param-name> <param-value>/</param-value> </init-param> <init-param> <param-name>kerberos.principal</param-name> <param-value>HTTP/localhost@LOCALHOST</param-value> </init-param> <init-param> <param-name>kerberos.keytab</param-name> <param-value>/tmp/auth.keytab</param-value> </init-param> </filter> <filter-mapping> <filter-name>authFilter</filter-name> <url-pattern>/multi-scheme/*</url-pattern> </filter-mapping> ... </web-app>
SignerSecretProvider 用於提供簽署 HTTP Cookie 所用機密的更進階行為。
以下是相關的組態屬性
signer.secret.provider
:指出要使用的 SignerSecretProvider 類別名稱。可能的值為:「file」、「random」、「zookeeper」或類別名稱。如果未指定,將使用「file」實作;如果失敗,將使用「random」實作。如果要使用「file」,需要指定 signature.secret.file
並指向機密檔案。
[PREFIX.]signature.secret.file
:當 signer.secret.provider
設為 file
或未指定時,這是用於簽署 HTTP Cookie 的機密值。
[PREFIX.]token.validity
:已產生驗證令牌的有效時間(以秒為單位)。預設值為 36000
秒。當 signer.secret.provider
設為 random
或 zookeeper
時,這也會用於翻轉間隔。
下列組態屬性特定於 zookeeper
實作
signer.secret.provider.zookeeper.connection.string
:指出要連線的 ZooKeeper 連線字串。預設值為 localhost:2181
signer.secret.provider.zookeeper.path
:指出用於儲存和擷取機密的 ZooKeeper 路徑。所有需要協調其機密的伺服器都應該指向同一路徑
signer.secret.provider.zookeeper.auth.type
:指出要使用的驗證類型。支援的值為 none
和 sasl
。預設值為 none
。
signer.secret.provider.zookeeper.kerberos.keytab
:將這個設為 Kerberos keytab 檔案的路徑。這僅在使用 Kerberos 時需要。
signer.secret.provider.zookeeper.kerberos.principal
:將這個設為要使用的 Kerberos 主體。這僅在使用 Kerberos 時需要。
signer.secret.provider.zookeeper.disconnect.on.shutdown
:在提供者關閉時是否關閉 ZooKeeper 連線。預設值為 true
。僅當提供自訂的 Curator 程式庫用戶端且在其他地方處理中斷時,才將這個設為 false
。
如果需要,也可以在 ServletContext 中設定下列屬性:* signer.secret.provider.zookeeper.curator.client
:可以傳遞 CuratorFramework 程式庫用戶端物件到這裡。如果提供,則「zookeeper」實作將使用這個 Curator 程式庫用戶端,而不是建立自己的程式庫用戶端,這在您已經有 Curator 程式庫用戶端或想要更進一步控制其組態時很有用。
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <!-- AuthenticationHandler configs not shown --> <init-param> <param-name>signer.secret.provider</param-name> <param-value>file</param-value> </init-param> <init-param> <param-name>signature.secret.file</param-name> <param-value>/myapp/secret_file</param-value> </init-param> </filter> ... </web-app>
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <!-- AuthenticationHandler configs not shown --> <init-param> <param-name>signer.secret.provider</param-name> <param-value>random</param-value> </init-param> <init-param> <param-name>token.validity</param-name> <param-value>30</param-value> </init-param> </filter> ... </web-app>
範例:
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"> ... <filter> <!-- AuthenticationHandler configs not shown --> <init-param> <param-name>signer.secret.provider</param-name> <param-value>zookeeper</param-value> </init-param> <init-param> <param-name>token.validity</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>signer.secret.provider.zookeeper.connection.string</param-name> <param-value>zoo1:2181,zoo2:2181,zoo3:2181</param-value> </init-param> <init-param> <param-name>signer.secret.provider.zookeeper.path</param-name> <param-value>/myapp/secrets</param-value> </init-param> <init-param> <param-name>signer.secret.provider.zookeeper.kerberos.keytab</param-name> <param-value>/tmp/auth.keytab</param-value> </init-param> <init-param> <param-name>signer.secret.provider.zookeeper.kerberos.principal</param-name> <param-value>HTTP/localhost@LOCALHOST</param-value> </init-param> </filter> ... </web-app>