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主体凭证的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>

伪/简单配置

要使用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服务器。当启用TLS与LDAP服务器通信时(通过ldaps协议或'start TLS'扩展),需要在本地信任库中配置LDAP服务器的公钥证书。

LDAP认证机制采用HTTP基本认证方案,根据配置的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认证协商机制(请参考RFC-2616)支持多种认证方式(如kerberos、ldap等)。要为每种认证机制(如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..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设置为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.ssl.enabled : 如果签名密钥提供者是Zookeeper,将此设置为true以启用服务器与Zookeeper之间的SSL/TLS通信。

  • signer.secret.provider.zookeeper.ssl.keystore.location : 指定Zookeeper客户端密钥库文件的位置。

  • signer.secret.provider.zookeeper.ssl.keystore.password : 指定Zookeeper客户端密钥库密码的位置。

  • signer.secret.provider.zookeeper.ssl.truststore.location : 指定Zookeeper客户端信任库文件的位置。

  • signer.secret.provider.zookeeper.ssl.truststore.password : 指定Zookeeper客户端信任库密码的位置。

  • 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>