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 ファイルは、Log4j 構成ファイルと同様に Web アプリケーションのクラスパスの一部である必要があります。

共通設定パラメータ

  • config.prefix: 指定した場合、他のすべての設定パラメータ名は、このプレフィックスで始まる必要があります。デフォルト値はプレフィックスなしです。

  • [PREFIX.]type: 認証タイプのキーワード (simple または
    kerberos) または認証ハンドラーの実装。

  • [PREFIX.]signature.secret.file: signer.secret.providerfile に設定されている場合、これは HTTP Cookie に署名するために使用される秘密鍵を含むファイルの場所です。

  • [PREFIX.]token.validity: 生成された認証トークンの有効期間 (秒単位)。デフォルト値は 36000 秒です。これは、signer.secret.providerrandom または zookeeper に設定されている場合、ロールオーバー間隔にも使用されます。

  • [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 プリンシパルのクレデンシャルを含む keytab ファイルへのパス。例: /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>

疑似/シンプル設定

疑似/シンプルを認証メカニズムとして使用する (クエリ文字列パラメータ '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 スキームまたは「start TLS」拡張を使用)、ローカルトラストストアで LDAP サーバーの公開証明書を構成します。

LDAP 認証メカニズムは、HTTP Basic 認証スキームを使用して、構成された LDAP (または Active Directory) サーバーに対してユーザーが指定したクレデンシャルを検証します。認証フィルターは、次の初期化パラメータで構成する必要があります

  • [PREFIX.]type: キーワード ldap

  • [PREFIX.]ldap.providerurl: LDAP サーバーの URL。

  • [PREFIX.]ldap.basedn: LDAP サーバーで使用する基本識別名 (DN)。この値は、認証目的で指定されたユーザー ID に追加されます。このプロパティは、Active Directory サーバーの場合には役に立ちません。

  • [PREFIX.]ldap.binddomain: LDAP サーバーで使用する LDAP バインドドメイン値。このプロパティはオプションであり、Active Directory サーバーの場合にのみ役立ちます (例: example.com)。

  • [PREFIX.]ldap.enablestarttls: LDAP サーバーが「StartTLS」拡張をサポートするかどうかを定義するために使用されるブール値。

:

    <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.providerfile に設定されているか、指定されていない場合、これは HTTP Cookie の署名に使用されるシークレットの値です。

  • [PREFIX.]token.validity: 生成された認証トークンの有効期間 (秒単位)。デフォルト値は 36000 秒です。これは、signer.secret.providerrandom または 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>