Hadoop Auth、Java HTTP SPNEGO - 伺服器端組態

伺服器端組態設定

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 設為 randomzookeeper 時,這也會用於翻轉間隔。

  • [PREFIX.]cookie.domain:用於儲存驗證令牌的 HTTP cookie 要使用的網域。

  • [PREFIX.]cookie.path:用於儲存驗證令牌的 HTTP cookie 要使用的路徑。

  • signer.secret.provider:指出要使用的 SignerSecretProvider 類別名稱。可能的數值有:filerandomzookeeper 或類別名稱。如果未指定,將使用 file 實作;如果失敗,將使用 random 實作。如果要使用「file」,需要指定 signature.secret.file 並指向機密檔案。

Kerberos 組態

重要事項:必須組態並執行 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 組態

若要使用 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>

AltKerberos 組態

重要事項:必須組態並執行 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 伺服器並執行。當為與 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 組態

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 設為 randomzookeeper 時,這也會用於翻轉間隔。

下列組態屬性特定於 zookeeper 實作

  • signer.secret.provider.zookeeper.connection.string:指出要連線的 ZooKeeper 連線字串。預設值為 localhost:2181

  • signer.secret.provider.zookeeper.path:指出用於儲存和擷取機密的 ZooKeeper 路徑。所有需要協調其機密的伺服器都應該指向同一路徑

  • signer.secret.provider.zookeeper.auth.type:指出要使用的驗證類型。支援的值為 nonesasl。預設值為 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>