Hadoop 身份验证、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 用作身份验证机制,必须使用以下 init 参数配置身份验证过滤器

  • [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”的值),必须使用以下 init 参数配置身份验证过滤器

  • [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 用作身份验证机制(除了提供实现之外),还必须使用以下 init 参数配置身份验证过滤器,除了前面提到的 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)服务器验证用户指定的凭证。身份验证筛选器必须使用以下 init 参数进行配置

  • [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)。为配置的每个方案添加此处理程序配置。

除了这些参数外,请还指定已配置的每个处理程序的 init 参数。

示例:

    <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 进行签名的机密的 value。

  • [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 密钥表文件的路径。仅在使用 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>