对于最新的稳定版本,请使用 Spring Security Kerberos 2.1.0Spring中文文档

对于最新的稳定版本,请使用 Spring Security Kerberos 2.1.0Spring中文文档

附录 A:本文档中使用的材料

在示例中使用的 Dummy UserDetailsService,因为我们没有真正的 用户源。Spring中文文档

public class DummyUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        return new User(username, "notUsed", true, true, true, true,
                AuthorityUtils.createAuthorityList("ROLE_USER"));
    }

}

附录 B:Kerberos 速成课程

在任何身份验证过程中,通常有三方 涉及。Spring中文文档

首先是有时是客户端计算机,但在大多数 在场景中,它是坐在计算机上的实际用户,并且 尝试访问资源。然后是用户正在尝试 访问。在此示例中,它是一个 Web 服务器。clientresourceSpring中文文档

然后有一个 或 .在以下情况下 Windows 环境,这将是一个 . 是 一个真正将所有东西结合在一起,因此是最 环境中的关键组件。正因为如此,它也是 被视为单点故障。Key Distribution CenterKDCDomain ControllerKDCSpring中文文档

最初,当环境是设置和域用户时 主体创建到数据库中,加密密钥也是 创建。这些加密密钥基于共享密钥(即用户 password),而实际密码从不以明文形式保存。 有效地为域用户提供自己的密钥和其他密钥。KerberosKDCSpring中文文档

有趣的是,在身份验证过程中,a 和 a 之间没有通信。resourceKDCSpring中文文档

当客户端想要首先使用 it 进行身份验证时 需要与 . 将制作一个特殊的包装 其中包含加密和未加密的部分。未加密部分 包含有关用户和加密部分的信息 作为协议一部分的信息。 将加密包 数据。resourceKDCClientClientSpring中文文档

当从客户端接收此身份验证包时,它 检查这声称来自未加密部分的人,并基于 在该信息上,它使用它已经拥有的解密密钥 它的数据库。如果这个解密是成功的,就知道这就是它声称的那个。KDCclientclientKDCclientSpring中文文档

KDC 返回给客户端的是一个票证,该票证由 KDC 自己的私钥签名。稍后,当发回此票证时,它可以尝试解密它,如果那样的话 操作成功了,它知道这是一张票,它自己 最初签名并交给了.Ticket Granting TicketclientclientSpring中文文档

当客户端想要获取可用于身份验证的票证时 与服务一起,被发送到,然后签署服务票证 使用服务自己的密钥。这是在 和 之间建立信任的时刻。此服务票证包含数据 只有它自己才能解密。TGTKDCclientserviceserviceSpring中文文档

使用之前发送的服务进行身份验证时 收到服务票,然后认为我没有 对这个人一无所知,但他有一张认证票。 接下来可以做的是尝试解密该票证,如果那样的话 操作成功了,它知道只有另一方知道我的 凭据是,因为我信任他,我也可以信任他 这个客户是他声称的客户。clientserviceKDCSpring中文文档

附录 C:设置 Kerberos 环境

执行 Kerberos 环境的生产设置超出了 本文档,但本附录提供了一些帮助,以帮助您 开始设置开发所需的组件。Spring中文文档

设置 MIT Kerberos

第一个操作是设置一个新领域和一个数据库。Spring中文文档

# kdb5_util create -s -r EXAMPLE.ORG
Loading random data
Initializing database '/var/lib/krb5kdc/principal' for realm 'EXAMPLE.ORG',
master key name 'K/[email protected]'
You will be prompted for the database Master Password.
It is important that you NOT FORGET this password.
Enter KDC database master key:
Re-enter KDC database master key to verify:

kadmin命令可用于管理 Kerberos 环境,但 您还不能使用它,因为数据库中没有管理员用户。Spring中文文档

root@neo:/etc/krb5kdc# kadmin
Authenticating as principal root/[email protected] with password.
kadmin: Client not found in Kerberos database while initializing
kadmin interface

让我们使用命令创建一个。kadmin.localSpring中文文档

root@neo:/etc/krb5kdc# kadmin.local
Authenticating as principal root/[email protected] with password.

kadmin.local:  listprincs
K/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
krbtgt/[email protected]

kadmin.local:  addprinc root/[email protected]
WARNING: no policy specified for root/[email protected]; defaulting to
no policy
Enter password for principal "root/[email protected]":
Re-enter password for principal "root/[email protected]":
Principal "root/[email protected]" created.

然后通过修改文件启用管理员并重新启动 Kerberos 服务业。kadm5.aclSpring中文文档

# cat /etc/krb5kdc/kadm5.acl
# This file Is the access control list for krb5 administration.
*/admin *

现在,您可以与以前创建的主体一起使用。让我们创建我们的第一个用户。kadminroot/adminuser1Spring中文文档

kadmin:  addprinc user1
WARNING: no policy specified for [email protected]; defaulting to no
policy
Enter password for principal "[email protected]":
Re-enter password for principal "[email protected]":
Principal "[email protected]" created.

让我们创建第二个用户并导出一个 keytab 文件。user2Spring中文文档

kadmin:  addprinc user2
WARNING: no policy specified for [email protected]; defaulting to no
policy
Enter password for principal "[email protected]":
Re-enter password for principal "[email protected]":
Principal "[email protected]" created.

kadmin:  ktadd -k /tmp/user2.keytab [email protected]
Entry for principal [email protected] with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/user2.keytab.
Entry for principal [email protected] with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/user2.keytab.
Entry for principal [email protected] with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/user2.keytab.
Entry for principal [email protected] with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/user2.keytab.

让我们为 tomcat 创建服务票证并将凭证导出到 名为 的 keytab 文件。tomcat.keytabSpring中文文档

kadmin:  addprinc -randkey HTTP/[email protected]
WARNING: no policy specified for HTTP/[email protected];
defaulting to no policy
Principal "HTTP/[email protected]" created.

kadmin:  ktadd -k /tmp/tomcat.keytab HTTP/[email protected]
Entry for principal HTTP/[email protected] with kvno 2, encryption type aes256-cts-hmac-sha1-96 added to keytab WRFILE:/tmp/tomcat2.keytab.
Entry for principal HTTP/[email protected] with kvno 2, encryption type arcfour-hmac added to keytab WRFILE:/tmp/tomcat2.keytab.
Entry for principal HTTP/[email protected] with kvno 2, encryption type des3-cbc-sha1 added to keytab WRFILE:/tmp/tomcat2.keytab.
Entry for principal HTTP/[email protected] with kvno 2, encryption type des-cbc-crc added to keytab WRFILE:/tmp/tomcat2.keytab.

设置 Windows 域控制器

这是使用Windows Server 2012 R2Spring中文文档

互联网上到处都是如何设置Windows AD的好文章和视频 但这两个是相当有用的 RackspaceMicrosoft 技术网Spring中文文档

  • 正常的域控制器和 Active Directory 设置已完成。Spring中文文档

  • 已使用 dns 域和 windows 域。example.orgEXAMPLESpring中文文档

  • 我创建了各种域用户,如 、 、 ,并将密码设置为 。user1user2user3tomcatPassword#Spring中文文档

我最终还将虚拟机的所有 IP 添加到 AD 的 dns 服务器中 不会造成任何麻烦。Spring中文文档

Name: WIN-EKBO0EQ7TS7.example.org
Address: 172.16.101.135

Name: win8vm.example.org
Address: 172.16.101.136

Name: neo.example.org
Address: 172.16.101.1

服务主体名称 (SPN) 需要设置 运行 Tomcat Servlet 容器的服务器名称。这 与域用户一起使用,然后将其用作 服务凭据。HTTPneo.example.orgtomcatkeytabSpring中文文档

PS C:\> setspn -A HTTP/neo.example.org tomcat

我导出了密钥表文件,该文件被复制到运行 tomcat 的 linux 服务器。Spring中文文档

PS C:\> ktpass /out c:\tomcat.keytab /mapuser [email protected] /princ HTTP/[email protected] /pass Password# /ptype KRB5_NT_PRINCIPAL /crypto All
 Targeting domain controller: WIN-EKBO0EQ7TS7.example.org
 Using legacy password setting method
 Successfully mapped HTTP/neo.example.org to tomcat.

互联网上到处都是如何设置Windows AD的好文章和视频 但这两个是相当有用的 RackspaceMicrosoft 技术网Spring中文文档

附录 D:疑难解答

本附录提供有关故障排除的一般信息 错误和问题。Spring中文文档

如果您认为环境和配置设置正确,请执行以下操作 仔细检查并要求其他人检查可能的明显错误 或错别字。Kerberos 设置通常非常脆弱,但事实并非如此 总是很容易调试问题所在。Spring中文文档

找不到要解密的适当类型的密钥
GSSException: Failure unspecified at GSS-API level (Mechanism level:
Invalid argument (400) - Cannot find key of appropriate type to
decrypt AP REP - RC4 with HMAC)

如果您看到 abore 错误指示缺少密钥类型,则会发生这种情况 具有两个不同的用例。首先,您的 JVM 可能不支持 适当的加密类型,否则在文件中将其禁用。krb5.confSpring中文文档

default_tkt_enctypes = rc4-hmac
default_tgs_enctypes = rc4-hmac

第二种情况不太明显,也很难追踪,因为它会导致 变成同样的错误。如果你也抛出这个特定的 只是没有所需的加密密钥,然后可能会导致 由于 Kerberos 服务器中的错误配置或您的 主要。GSSExceptionSpring中文文档

使用错误的 kerberos 配置


Spring中文文档

在大多数系统中,所有命令和库都将搜索 kerberos 从默认位置或特殊位置进行配置 就像 JDK 一样。很容易混淆,尤其是在使用 unix 工作时 系统,可能已经具有与 MIT 一起使用的默认设置 kerberos,朝向 Windows 域。Spring中文文档

这是一个具体的例子,尝试 使用 kerberos 身份验证查询 Windows AD。ldapsearchSpring中文文档

$ ldapsearch -H ldap://WIN-EKBO0EQ7TS7.example.org -b "dc=example,dc=org"
SASL/GSSAPI authentication started
ldap_sasl_interactive_bind_s: Local error (-2)
  additional info: SASL(-1): generic failure: GSSAPI Error:
  Unspecified GSS failure.  Minor code may provide more information
  (No Kerberos credentials available)

好吧,这看起来不太好,只是一个简单的迹象,表明我没有 拥有有效的 Kerberos 票证,如下所示。Spring中文文档

$ klist
klist: Credentials cache file '/tmp/krb5cc_1000' not found

我们已经有一个从 Windows AD 导出的密钥表文件可供使用 在 Linux 上运行的 tomcat。让我们尝试使用它来进行身份验证 使用 Windows AD。Spring中文文档

您可以有一个专用的配置文件,通常可以与 通过系统属性的本机 Linux 命令和 JVM。Spring中文文档

$ cat krb5.ini
[libdefaults]
default_realm = EXAMPLE.ORG
default_keytab_name = /tmp/tomcat.keytab
forwardable=true

[realms]
EXAMPLE.ORG = {
  kdc = WIN-EKBO0EQ7TS7.example.org:88
}

[domain_realm]
example.org=EXAMPLE.ORG
.example.org=EXAMPLE.ORG

让我们使用该配置和密钥表来获取初始凭据。Spring中文文档

$ env KRB5_CONFIG=/path/to/krb5.ini kinit -kt tomcat.keytab HTTP/[email protected]

$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: HTTP/[email protected]

Valid starting     Expires            Service principal
26/03/15 09:04:37  26/03/15 19:04:37  krbtgt/[email protected]
  renew until 27/03/15 09:04:37

让我们看看如果我们现在尝试对 Windows 广告。Spring中文文档

$ ldapsearch -H ldap://WIN-EKBO0EQ7TS7.example.org -b "dc=example,dc=org"
SASL/GSSAPI authentication started
ldap_sasl_interactive_bind_s: Local error (-2)
  additional info: SASL(-1): generic failure: GSSAPI Error:
  Unspecified GSS failure.  Minor code may provide more information
  (KDC returned error string: PROCESS_TGS)

这可能仅仅是因为感到困惑和简单 使用错误的配置。你可以告诉使用 通过 env 变量进行不同的配置,就像我们一样 做了.您也可以使用来获取 本机库正在执行的操作的更详细的输出。ldapsearchldapsearchKRB5_CONFIGkinitKRB5_TRACE=/dev/stderrSpring中文文档

$ env KRB5_CONFIG=/path/to/krb5.ini ldapsearch -H ldap://WIN-EKBO0EQ7TS7.example.org -b "dc=example,dc=org"

$ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: HTTP/[email protected]

Valid starting     Expires            Service principal
26/03/15 09:11:03  26/03/15 19:11:03  krbtgt/[email protected]
  renew until 27/03/15 09:11:03
  26/03/15 09:11:44  26/03/15 19:11:03
  ldap/[email protected]
    renew until 27/03/15 09:11:03

在上面,您可以通过查看来查看查询成功时会发生什么 Kerberos 票证。现在,您可以尝试使用其他查询命令 即,如果您使用 .KerberosLdapContextSourceSpring中文文档

$ ldapsearch -H ldap://WIN-EKBO0EQ7TS7.example.org \
-b "dc=example,dc=org" \
"(| ([email protected])
([email protected]))" \
dn

...
# test user, example.org
dn: CN=test user,DC=example,DC=org

如果您认为环境和配置设置正确,请执行以下操作 仔细检查并要求其他人检查可能的明显错误 或错别字。Kerberos 设置通常非常脆弱,但事实并非如此 总是很容易调试问题所在。Spring中文文档

附录 E:为 Spnego 协商配置浏览器

火狐浏览器

完成以下步骤以确保您的 Firefox 浏览器 启用以执行 Spnego 认证。Spring中文文档

使用 Google Chrome,您通常需要设置命令行参数 订单将白名单服务器与Chrome协商。Spring中文文档

  • 在 Windows 计算机(客户端)上:Chrome 与 Internet Explorer,因此如果所有更改都应用于 IE(如上所述 在 E.3 中),无需通过命令行参数传递任何内容。Spring中文文档

  • 在 Linux/Mac OS 计算机(客户端)上:命令行参数仅在 Kerberos 下使用 委托是必需的(否则不要设置此参数)。--auth-negotiate-delegate-whitelistSpring中文文档

  • 建议用于所有通信。httpsSpring中文文档

--auth-server-whitelist="*.example.com"
--auth-negotiate-delegate-whitelist="*.example.com"

您可以通过在 Chrome 的地址栏中输入 chrome://policy/ 来查看启用了哪些政策。Spring中文文档

在 Linux 中,Chrome 还会从目录中读取策略文件。/etc/opt/chrome/policies/managedSpring中文文档

mypolicy.json
{
  "AuthServerWhitelist" : "*.example.org",
  "AuthNegotiateDelegateWhitelist" : "*.example.org",
  "DisableAuthNegotiateCnameLookup" : true,
  "EnableAuthNegotiatePort" : true
}

IE浏览器

请完成以下步骤,以确保您的 Internet Explorer 浏览器 启用以执行 Spnego 认证。Spring中文文档