赞
踩
2019年初,领导刘哥给了我一个很棘手的任务,让研究下Kerberos
认证原理,因为半年后有个项目会依赖Kerberos
实现SSO
。我心里暗暗骂了一句,我这么忙能不能让那些每天吹牛的人研究下呀,我激动的拍了下桌子,满脸笑容的答应了。
Kerberos
是啥呀,我问了问百度,翻掉前两页的广告之后,我终于查到了一些资料。
以上内容讲的都挺好,头一个礼拜我Google了各种网站,终于在我的努力下懂得了原来这就是Kerberos
,我真的懂了,但我应该怎么做呢。就好像我懂得了这就是涡轮增压的原理,行了,那你去设计台车吧,我拿着手中的锤子不知道该砸向谁。其实网上的内容大部分是讲解Kerberos
的认证原理,都是很底层的内容,当然对于开发人员来说掌握其中的原理是必要的,但只需要简单了解即可,不需要深入研究,因为有很多框架已经把内部的逻辑实现了,我们只要按照相关的配置信息简单配置即可。针对Kerberos
认证原理,我们只需了解:
如何将Kerberos用到具体的项目中才是我们真正需要掌握的,而网上能够查到的资料又非常稀少,为了将我2个月的研究过程进行整理,并希望能给恰巧遇到同样问题的你提供一点帮助,特整理了本篇文章,当然内容肯定会由很多错误的地方,还望嘴下留情,我们才好共同探讨。
先说下甲方爸爸的机器环境:
Windows Server2016 R2
,服务器已经入域Tomcat 8.5
,运行环境Java
,框架Spring Boot 2
,B/S
框架Windows 10
,客户端同样已经入域、客户端浏览器为万恶的IE9(当时微软还没有丢弃它)我们未来要做一个系统,这个系统支持两种登录方式:
http://www.jiafangbaba.com/login
之后跳转到登录页面,输入用户名和密码,之后登录进入主页。这种实现过程就不说了,每个公司都有自己的一套权限认证体系。http://www.jiafangbaba.com
之后,根据当前的域用户信息直接跳转到系统首页。SSO
的,对于上述两种登录方式的逻辑实现,以后再写。整个实现步骤大致分为下面几步:
先在VM上创建三台虚机,相关配置如下:
KDC/DNS | Server | Client | |
---|---|---|---|
OS | Windows Server 2016 | Windows Server 2016 | Win10 |
IP | 192.168.150.138 | 192.168.150.139 | 192.168.150.140 |
DNS | 127.0.0.1 | 192.168.150.138 | 192.168.150.138 |
AD | jiafangbaba.com | jiafangbaba.com | jiafangbaba.com |
JDK | ----- | Jdk1.8 | ----- |
Tomcat | ----- | apache-tomcat-8.5.42 | ----- |
计算机名 | kdc.jiafangbaba.com | server.jiafangbaba.com | client.jiafangbaba.com |
备注 | AD域控制器 | 应用服务器 | 客户端 |
虚机的创建步骤大家自己找找吧,到处都是:这个不会有人不知道吧。
搭建域环境的步骤大家找找吧,也到处都是:https://www.jb51.net/article/252392.htm
(192.168.150.138
),DNS地址为127.0.0.1
jiafangbaba.com
server
192.168.150.139
),DNS地址为192.168.150.138
(KDC的IP)jiafangbaba.com
)192.168.150.138
(KDC的IP)jiafangbaba.com
),并用域用户(user2
)登录我没Google到端口配置的相关内容,这也是我在调试的过程中遇到的很头疼的一个问题。同样的包在我本地行,在用户现场死活跑不出来,研究了好长一段时间才明白,我本地都是把防火墙禁掉的,而现场环境是打开的,所以需要提前将相关端口策略开通,才能保证服务器之间的Kerberos验证是没有问题的。我通过抓包工具抓到了需要开放的端口。
相关端口见下表
本端 | 本端端口 | 本端类型 | 对端 | 对端端口 | 对端类型 | 协议 | 功能 |
---|---|---|---|---|---|---|---|
Client | 随机 | 客户端 | KDC | 53 | 服务端 | UDP | DNS解析 |
Client | 随机 | 客户端 | KDC | 88 | 服务端 | TCP | KerberosV5:AS Request |
Client | 随机 | 客户端 | KDC | 389 | 服务端 | UDP | 访问LDAP服务 |
Client | 随机 | 客户端 | KDC | 389 | 服务端 | TCP | 访问LDAP服务 |
Server | 随机 | 客户端 | KDC | 53 | 服务端 | UDP | DNS解析 |
Server | 随机 | 客户端 | KDC | 88 | 服务端 | UDP | KerberosV5:AS Request |
Server | 随机 | 客户端 | KDC | 389 | 服务端 | TCP | 访问LDAP服务 |
Client | 随机 | 客户端 | Server | 80 | 服务端 | TCP | HTTP请求 备注:此处对端端口为Tomcat的端口,默认为8080,测试环境中已修改为80. |
在测试环境中通过telnet命令确定机器之间是互通的,这一步非常关键。上表中的Client相关的端口大家可以忽略,因为本身Client对上面的端口是放开的,特殊情况下才需要考虑Client的上述配置。
按照上述内容配置相关服务器信息之后,下面就到了真正的测试环节,首先我们要准备测试包部署到Server
服务器上的Tomcat
中。由于我使用的是SpringBoot
框架,而spring-security-kerberos
是Spring
对Kerbeors的实现,对于Spring Security
,上来肯定是先来个WebSecurityConfig
。
此类的目的有两个:1、实现WebSecurityConfigurerAdapter
的自动装载,其中下图红框中的adDomain
、adServer
等参数是我们实现Kerberos
认证的关键参数。
/home
、all-new
两个URL添加到了忽略列表,其中/home
是为了验证kerberos
认证是否通过,all-new
是为了获取所有域用户,本篇文章不谈域用户的获取。package com.example.demowin.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;
import org.springframework.ldap.core.LdapTemplate;
import org.</
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。