Windows 身份验证操作指南

目录

概述

集成 Windows 身份验证最常用于内联网环境,因为它要求执行身份验证的服务器和被身份验证的用户是同一个域的一部分。为了让用户自动进行身份验证,用户使用的客户端机器也必须是该域的一部分。

使用 Apache Tomcat 实现集成 Windows 身份验证有几种选择。它们是

  • 内置 Tomcat 支持。
  • 使用第三方库,例如 Waffle。
  • 使用支持 Windows 身份验证的反向代理来执行身份验证步骤,例如 IIS 或 httpd。

以下部分将讨论每种选项的配置。

内置 Tomcat 支持

Kerberos(集成 Windows 身份验证的基础)需要仔细配置。如果严格按照本指南中的步骤操作,则会得到一个有效的配置。重要的是严格按照以下步骤操作。配置的灵活性非常小。从迄今为止的测试来看,已知

  • 用于访问 Tomcat 服务器的主机名必须与 SPN 中的主机名完全匹配,否则身份验证将失败。在这种情况下,调试日志中可能会报告校验和错误。
  • 客户端必须认为服务器是本地可信内联网的一部分。
  • SPN 必须为 HTTP/<hostname>,并且它在所有使用它的位置必须完全相同。
  • 端口号不能包含在 SPN 中。
  • 最多只能将一个 SPN 映射到域用户。
  • Tomcat 必须以与 SPN 关联的域帐户或域管理员身份运行。建议在域管理员用户下运行 Tomcat。
  • 约定是域名称 (dev.local) 始终使用小写。域名称通常不区分大小写。
  • 约定是 Kerberos 领域名称 (DEV.LOCAL) 始终使用大写。领域名称区分大小写。
  • 使用 ktpass 命令时必须指定域。

内置 Tomcat 支持 Windows 身份验证的配置有四个组成部分。域控制器、托管 Tomcat 的服务器、希望使用 Windows 身份验证的 Web 应用程序和客户端机器。以下部分描述了每个组件所需的配置。

以下配置示例中使用的三台机器的名称为 win-dc01.dev.local(域控制器)、win-tc01.dev.local(Tomcat 实例)和 win-pc01.dev.local(客户端)。所有机器都是 dev.local 域的成员。

注意:为了使用以下步骤中的密码,必须放宽域密码策略。不建议在生产环境中这样做。

域控制器

这些步骤假设服务器已经配置为充当域控制器。将 Windows 服务器配置为域控制器超出了本操作指南的范围。配置域控制器以使 Tomcat 支持 Windows 身份验证的步骤如下

  • 创建一个域用户,该用户将映射到 Tomcat 服务器使用的服务名称。在本操作指南中,此用户称为 tc01,密码为 tc01pass
  • 将服务主体名称 (SPN) 映射到用户帐户。SPN 的格式为 <service class>/<host>:<port>/<service name>。在本操作指南中使用的 SPN 为 HTTP/win-tc01.dev.local。要将用户映射到 SPN,请运行以下命令
    setspn -A HTTP/win-tc01.dev.local tc01
  • 生成 Tomcat 服务器将用于向域控制器进行身份验证的密钥表文件。此文件包含服务提供商帐户的 Tomcat 私钥,应相应地进行保护。要生成文件,请运行以下命令(所有命令都在一行上)
    ktpass /out c:\tomcat.keytab /mapuser [email protected]
              /princ HTTP/[email protected]
              /pass tc01pass /kvno 0
  • 创建一个将在客户端上使用的域用户。在本操作指南中,域用户为 test,密码为 testpass

以上步骤已在运行 Windows Server 2019 Standard 的域控制器上进行了测试,使用 Windows Server 2016 功能级别作为林和域。

Tomcat 实例(Windows 服务器)

这些步骤假设 Tomcat 和 Java 11 JDK/JRE 已经安装和配置,并且 Tomcat 以 [email protected] 用户身份运行。配置 Tomcat 实例以支持 Windows 身份验证的步骤如下

  • 将域控制器上创建的tomcat.keytab文件复制到$CATALINA_BASE/conf/tomcat.keytab
  • 创建Kerberos配置文​​件$CATALINA_BASE/conf/krb5.ini。本操作指南中使用的文件包含
    [libdefaults]
    default_realm = DEV.LOCAL
    default_keytab_name = FILE:c:\apache-tomcat-10.1.x\conf\tomcat.keytab
    default_tkt_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
    default_tgs_enctypes = rc4-hmac,aes256-cts-hmac-sha1-96,aes128-cts-hmac-sha1-96
    forwardable=true
    
    [realms]
    DEV.LOCAL = {
            kdc = win-dc01.dev.local:88
    }
    
    [domain_realm]
    dev.local= DEV.LOCAL
    .dev.local= DEV.LOCAL
    可以通过设置java.security.krb5.conf系统属性来更改此文件的路径。
  • 创建JAAS登录配置文​​件$CATALINA_BASE/conf/jaas.conf。本操作指南中使用的文件包含
    com.sun.security.jgss.krb5.initiate {
        com.sun.security.auth.module.Krb5LoginModule required
        doNotPrompt=true
        principal="HTTP/[email protected]"
        useKeyTab=true
        keyTab="c:/apache-tomcat-10.1.x/conf/tomcat.keytab"
        storeKey=true;
    };
    
    com.sun.security.jgss.krb5.accept {
        com.sun.security.auth.module.Krb5LoginModule required
        doNotPrompt=true
        principal="HTTP/[email protected]"
        useKeyTab=true
        keyTab="c:/apache-tomcat-10.1.x/conf/tomcat.keytab"
        storeKey=true;
    };
    可以通过设置java.security.auth.login.config系统属性来更改此文件的路径。使用的LoginModule是JVM特定的,因此请确保指定的LoginModule与正在使用的JVM匹配。登录配置的名称必须与身份验证阀使用的值匹配。

SPNEGO身份验证器可以与任何 Realm一起使用,但如果与JNDI Realm一起使用,默认情况下,JNDI Realm将使用用户的委派凭据连接到Active Directory。如果只需要经过身份验证的用户名,则可以使用AuthenticatedUserRealm,它将仅返回基于经过身份验证的用户名且没有任何角色的Principal。

以上步骤已在运行Windows Server 2019 Standard和AdoptOpenJDK 8u232-b09(64位)的Tomcat服务器上进行了测试。

Tomcat 实例(Linux 服务器)

此测试使用

  • Java 1.7.0,更新45,64位
  • Ubuntu Server 12.04.3 LTS 64位
  • Tomcat 8.0.x(r1546570)

它应该适用于任何Tomcat版本,但建议使用最新的稳定版本。

配置与Windows相同,但有以下更改

  • Linux服务器不必是Windows域的一部分。
  • krb5.ini和jaas.conf中keytab文件的路径应更新为反映Linux服务器上keytab文件的路径,使用Linux风格的文件路径(例如/usr/local/tomcat/...)。

Web 应用程序

Web应用程序需要在web.xml中配置为使用Tomcat特定的身份验证方法SPNEGO(而不是BASIC等)。与其他身份验证器一样,可以通过显式配置身份验证阀并在Valve上设置属性来定制行为。

客户端

客户端必须配置为使用Kerberos身份验证。对于Internet Explorer,这意味着确保Tomcat实例位于“本地Intranet”安全域中,并且已配置(工具>Internet选项>高级)启用集成Windows身份验证。请注意,如果将同一台机器用于客户端和Tomcat实例,则此方法**将无法**工作,因为Internet Explorer将使用不受支持的NTLM协议。

第三方库

Waffle

此解决方案的完整详细信息可以在 Waffle 网站 中找到。主要功能包括

  • 即插即用解决方案
  • 简单配置(不需要 JAAS 或 Kerberos 密钥表配置)
  • 使用本机库

Spring Security - Kerberos 扩展

此解决方案的完整详细信息可以在 Kerberos 扩展网站 中找到。主要功能包括

  • Spring Security 的扩展
  • 需要生成 Kerberos 密钥表文件
  • 纯 Java 解决方案

Jespa

此解决方案的完整详细信息可以在 项目网站 中找到。主要功能包括

  • 纯 Java 解决方案
  • 高级 Active Directory 集成

SourceForge 上的 SPNEGO AD 项目

此解决方案的完整详细信息可以在 项目网站 中找到。主要功能包括

  • 纯 Java 解决方案
  • SPNEGO/Kerberos 身份验证器
  • Active Directory 领域

反向代理

Microsoft IIS

配置 IIS 以提供 Windows 身份验证需要三个步骤。它们是

  1. 将 IIS 配置为 Tomcat 的反向代理(请参阅 IIS Web 服务器操作指南)。
  2. 配置 IIS 以使用 Windows 身份验证
  3. 通过将 AJP 连接器 上的 tomcatAuthentication 属性设置为 false,配置 Tomcat 以使用来自 IIS 的身份验证用户信息。或者,将 tomcatAuthorization 属性设置为 true 以允许 IIS 进行身份验证,而 Tomcat 执行授权。

Apache httpd

Apache httpd 本身不支持 Windows 身份验证,但可以使用许多第三方模块。这些包括

  1. mod_auth_sspi 用于 Windows 平台。
  2. mod_auth_ntlm_winbind 用于非 Windows 平台。已知在 32 位平台上的 httpd 2.0.x 上运行良好。一些用户报告了 httpd 2.2.x 版本和 64 位 Linux 版本的稳定性问题。

配置 httpd 以提供 Windows 身份验证需要三个步骤。

  1. 将 httpd 配置为 Tomcat 的反向代理(参见 Apache httpd Web Server How-To)
  2. 配置 httpd 使用 Windows 身份验证。
  3. 通过将 AJP 连接器 上的 tomcatAuthentication 属性设置为 false,配置 Tomcat 使用来自 httpd 的身份验证用户信息。