对于最新的稳定版本,请使用 Spring Security Kerberos 2.1.0! |
对于最新的稳定版本,请使用 Spring Security Kerberos 2.1.0! |
附录 A:本文档中使用的材料
在示例中使用的 Dummy UserDetailsService,因为我们没有真正的 用户源。
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 速成课程
在任何身份验证过程中,通常有三方 涉及。
首先是有时是客户端计算机,但在大多数
在场景中,它是坐在计算机上的实际用户,并且
尝试访问资源。然后是用户正在尝试
访问。在此示例中,它是一个 Web 服务器。client
resource
然后有一个 或 .在以下情况下
Windows 环境,这将是一个 . 是
一个真正将所有东西结合在一起,因此是最
环境中的关键组件。正因为如此,它也是
被视为单点故障。Key Distribution Center
KDC
Domain Controller
KDC
最初,当环境是设置和域用户时
主体创建到数据库中,加密密钥也是
创建。这些加密密钥基于共享密钥(即用户
password),而实际密码从不以明文形式保存。
有效地为域用户提供自己的密钥和其他密钥。Kerberos
KDC
有趣的是,在身份验证过程中,a 和 a 之间没有通信。resource
KDC
当客户端想要首先使用 it 进行身份验证时
需要与 . 将制作一个特殊的包装
其中包含加密和未加密的部分。未加密部分
包含有关用户和加密部分的信息
作为协议一部分的信息。 将加密包
数据。resource
KDC
Client
Client
当从客户端接收此身份验证包时,它
检查这声称来自未加密部分的人,并基于
在该信息上,它使用它已经拥有的解密密钥
它的数据库。如果这个解密是成功的,就知道这就是它声称的那个。KDC
client
client
KDC
client
KDC 返回给客户端的是一个票证,该票证由 KDC 自己的私钥签名。稍后,当发回此票证时,它可以尝试解密它,如果那样的话
操作成功了,它知道这是一张票,它自己
最初签名并交给了.Ticket Granting
Ticket
client
client
当客户端想要获取可用于身份验证的票证时
与服务一起,被发送到,然后签署服务票证
使用服务自己的密钥。这是在 和 之间建立信任的时刻。此服务票证包含数据
只有它自己才能解密。TGT
KDC
client
service
service
使用之前发送的服务进行身份验证时
收到服务票,然后认为我没有
对这个人一无所知,但他有一张认证票。
接下来可以做的是尝试解密该票证,如果那样的话
操作成功了,它知道只有另一方知道我的
凭据是,因为我信任他,我也可以信任他
这个客户是他声称的客户。client
service
KDC
附录 C:设置 Kerberos 环境
执行 Kerberos 环境的生产设置超出了 本文档,但本附录提供了一些帮助,以帮助您 开始设置开发所需的组件。
设置 MIT Kerberos
第一个操作是设置一个新领域和一个数据库。
# 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 环境,但
您还不能使用它,因为数据库中没有管理员用户。
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.local
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.acl
# cat /etc/krb5kdc/kadm5.acl
# This file Is the access control list for krb5 administration.
*/admin *
现在,您可以与以前创建的主体一起使用。让我们创建我们的第一个用户。kadmin
root/admin
user1
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 文件。user2
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.keytab
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 R2
互联网上到处都是如何设置Windows AD的好文章和视频 但这两个是相当有用的 Rackspace 和 Microsoft 技术网。 |
-
正常的域控制器和 Active Directory 设置已完成。
-
已使用 dns 域和 windows 域。
example.org
EXAMPLE
-
我创建了各种域用户,如 、 、 ,并将密码设置为 。
user1
user2
user3
tomcat
Password#
我最终还将虚拟机的所有 IP 添加到 AD 的 dns 服务器中 不会造成任何麻烦。
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 容器的服务器名称。这
与域用户一起使用,然后将其用作
服务凭据。HTTP
neo.example.org
tomcat
keytab
PS C:\> setspn -A HTTP/neo.example.org tomcat
我导出了密钥表文件,该文件被复制到运行 tomcat 的 linux 服务器。
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的好文章和视频 但这两个是相当有用的 Rackspace 和 Microsoft 技术网。 |
附录 D:疑难解答
本附录提供有关故障排除的一般信息 错误和问题。
如果您认为环境和配置设置正确,请执行以下操作 仔细检查并要求其他人检查可能的明显错误 或错别字。Kerberos 设置通常非常脆弱,但事实并非如此 总是很容易调试问题所在。 |
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.conf
default_tkt_enctypes = rc4-hmac
default_tgs_enctypes = rc4-hmac
第二种情况不太明显,也很难追踪,因为它会导致
变成同样的错误。如果你也抛出这个特定的
只是没有所需的加密密钥,然后可能会导致
由于 Kerberos 服务器中的错误配置或您的
主要。GSSException
在大多数系统中,所有命令和库都将搜索 kerberos 从默认位置或特殊位置进行配置 就像 JDK 一样。很容易混淆,尤其是在使用 unix 工作时 系统,可能已经具有与 MIT 一起使用的默认设置 kerberos,朝向 Windows 域。
这是一个具体的例子,尝试
使用 kerberos 身份验证查询 Windows AD。ldapsearch
$ 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 票证,如下所示。
$ klist
klist: Credentials cache file '/tmp/krb5cc_1000' not found
我们已经有一个从 Windows AD 导出的密钥表文件可供使用 在 Linux 上运行的 tomcat。让我们尝试使用它来进行身份验证 使用 Windows AD。
您可以有一个专用的配置文件,通常可以与 通过系统属性的本机 Linux 命令和 JVM。
$ 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
让我们使用该配置和密钥表来获取初始凭据。
$ 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 广告。
$ 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 变量进行不同的配置,就像我们一样
做了.您也可以使用来获取
本机库正在执行的操作的更详细的输出。ldapsearch
ldapsearch
KRB5_CONFIG
kinit
KRB5_TRACE=/dev/stderr
$ 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 票证。现在,您可以尝试使用其他查询命令
即,如果您使用 .KerberosLdapContextSource
$ 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 设置通常非常脆弱,但事实并非如此 总是很容易调试问题所在。 |
附录 E:为 Spnego 协商配置浏览器
火狐浏览器
完成以下步骤以确保您的 Firefox 浏览器 启用以执行 Spnego 认证。
-
打开 Firefox。
-
在地址字段中,键入 about:config。
-
在 filter/search 中,键入 negotiate。
-
参数 network.negotiate-auth.trusted-uris 可以设置为 默认 https://,这对您不起作用。一般而言 如果 Kerberos 必须将此参数替换为服务器地址 授权是必需的。
-
建议用于所有通信。
https
铬
使用 Google Chrome,您通常需要设置命令行参数 订单将白名单服务器与Chrome协商。
-
在 Windows 计算机(客户端)上:Chrome 与 Internet Explorer,因此如果所有更改都应用于 IE(如上所述 在 E.3 中),无需通过命令行参数传递任何内容。
-
在 Linux/Mac OS 计算机(客户端)上:命令行参数仅在 Kerberos 下使用 委托是必需的(否则不要设置此参数)。
--auth-negotiate-delegate-whitelist
-
建议用于所有通信。
https
--auth-server-whitelist="*.example.com"
--auth-negotiate-delegate-whitelist="*.example.com"
您可以通过在 Chrome 的地址栏中输入 chrome://policy/ 来查看启用了哪些政策。
在 Linux 中,Chrome 还会从目录中读取策略文件。/etc/opt/chrome/policies/managed
{
"AuthServerWhitelist" : "*.example.org",
"AuthNegotiateDelegateWhitelist" : "*.example.org",
"DisableAuthNegotiateCnameLookup" : true,
"EnableAuthNegotiatePort" : true
}