Spring Security Kerberos 环境搭建

2019年初,领导刘哥给了我一个很棘手的任务,让研究下Kerberos认证原理,因为半年后有个项目会依赖Kerberos实现SSO。我心里暗暗骂了一句,我这么忙能不能让那些每天吹牛的人研究下呀,我激动的拍了下桌子,满脸笑容的答应了。

Kerberos是啥呀,我问了问百度,翻掉前两页的广告之后,我终于查到了一些资料。

  1. Spring Security Kerberos 配置IWA的关键步骤备忘:https://blog.csdn.net/wwwcomy/article/details/84883086
  2. Kerberos基本概念及原理汇总:https://cloud.tencent.com/developer/article/1381306
  3. 第十二章 Spring Security扩展:https://www.iteye.com/blog/lengyun3566-1404943
  4. spring-security-kerberos官网:https://spring.io/projects/spring-security-kerberos

以上内容讲的都挺好,头一个礼拜我Google了各种网站,终于在我的努力下懂得了原来这就是Kerberos,我真的懂了,但我应该怎么做呢。就好像我懂得了这就是涡轮增压的原理,行了,那你去设计台车吧,我拿着手中的锤子不知道该砸向谁。其实网上的内容大部分是讲解Kerberos的认证原理,都是很底层的内容,当然对于开发人员来说掌握其中的原理是必要的,但只需要简单了解即可,不需要深入研究,因为有很多框架已经把内部的逻辑实现了,我们只要按照相关的配置信息简单配置即可。针对Kerberos认证原理,我们只需了解:

  1. 大致的认证过程
  2. 所需要的机器种类
  3. 所需要的机器环境。

如何将Kerberos用到具体的项目中才是我们真正需要掌握的,而网上能够查到的资料又非常稀少,为了将我2个月的研究过程进行整理,并希望能给恰巧遇到同样问题的你提供一点帮助,特整理了本篇文章,当然内容肯定会由很多错误的地方,还望嘴下留情,我们才好共同探讨。

环境介绍

先说下甲方爸爸的机器环境:

  • 服务器操作系统:Windows Server2016 R2,服务器已经入域
  • 部署中间件:Tomcat 8.5,运行环境Java,框架Spring Boot 2B/S框架
  • 客户端操作系统:Windows 10,客户端同样已经入域、客户端浏览器为万恶的IE9(当时微软还没有丢弃它)
    再说下我的需求:

我们未来要做一个系统,这个系统支持两种登录方式:

  1. 用户名+密码。访问地址为http://www.jiafangbaba.com/login之后跳转到登录页面,输入用户名和密码,之后登录进入主页。这种实现过程就不说了,每个公司都有自己的一套权限认证体系。
  2. 域认证。访问地址http://www.jiafangbaba.com之后,根据当前的域用户信息直接跳转到系统首页。
    本篇内容只是关于如何实现SSO的,对于上述两种登录方式的逻辑实现,以后再写。

实施步骤

整个实现步骤大致分为下面几步:

  1. 域环境准备
  2. 服务器端口配置
  3. 编写测试程序
  4. 浏览器配置
  5. 验证成果
域环境准备

先在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

KDC/DNS端环境搭建详细步骤
  1. 修改计算机名为kdc
  2. 修改本机IP为静态IP(192.168.150.138),DNS地址为127.0.0.1
  3. 检查登录用户Administrator是否有密码,检查密码是否符合密码策略(默认策略密码要有大小写字母和数字)
  4. 搭建域服务器,域名为jiafangbaba.com
  5. 创建两个域用户
  • 用户名:user2(用于client端登录),密码:Tomcat2019
  • 用户名:tomcat1(用于生成keytab文件)密码:Tomcat2019
Server端
  1. 修改计算机名为server
  2. 修改本机IP为静态IP(192.168.150.139),DNS地址为192.168.150.138KDC的IP
  3. 加入域(jiafangbaba.com
Client端
  1. DNS地址为192.168.150.138(KDC的IP)
  2. 加入域(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-kerberosSpring对Kerbeors的实现,对于Spring Security,上来肯定是先来个WebSecurityConfig

此类的目的有两个:1、实现WebSecurityConfigurerAdapter的自动装载,其中下图红框中的adDomainadServer等参数是我们实现Kerberos认证的关键参数。

  1. 实现权限的拦截。
    我为了测试简单,把/homeall-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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值