Kerberos安全体系详解---Kerberos的简单实现

1. 
Kerberos简介


1.1. 功能


  1. 一个安全认证协议


  2. 用tickets验证

  3. 避免本地保存密码和在互联网上传输密码

  4. 包含一个可信任的第三方

  5. 使用对称加密

  6. 客户端与服务器(非KDC)之间能够相互验证

Kerberos只提供一种功能——在网络上安全的完成用户的身份验证。它并不提供授权功能或者审计功能。

1.2. 概念

首次请求,三次通信方

  • the Authentication Server

  • the Ticket Granting Server

  • the Service or host machine that you’re wanting access to.

图 1?1 角色

其他知识点

  • 每次通信,消息包含两部分,一部分可解码,一部分不可解码

  • 服务端不会直接有KDC通信

  • KDC保存所有机器的账户名和密码

  • KDC本身具有一个密码

2.  3次通信

  我们这里已获取服务器中的一张表(数据)的服务以为,为一个http服务。

2.1. 你和验证服务

  如果想要获取http服务,你首先要向KDC表名你自己的身份。这个过程可以在你的程序启动时进行。Kerberos可以通过kinit获取。介绍自己通过未加密的信息发送至KDC获取Ticket
Granting Ticket (TGT)。

(1)信息包含

  • 你的用户名/ID

  • 你的IP地址

  • TGT的有效时间

  Authentication Server收到你的请求后,会去数据库中验证,你是否存在。注意,仅仅是验证是否存在,不会验证对错。

  如果存在,Authentication Server会产生一个随机的Session key(可以是一个64位的字符串)。这个key用于你和Ticket
Granting Server (TGS)之间通信。

(2)回送信息

  Authentication Server同样会发送两部分信息给你,一部分信息为TGT,通过KDC自己的密码进行加密,包含:

  • 你的name/ID

  • TGS的name/ID

  • 时间戳

  • 你的IP地址

  • TGT的生命周期

  • TGS session
    key

另外一部分通过你的密码进行加密,包含的信息有

  • TGS的name/ID

  • 时间戳

  • 生命周期

  • TGS session
    key

图 2?1 第一次通信

  如果你的密码是正确的,你就能解密第二部分信息,获取到TGS session
key。如果,密码不正确,无法解密,则认证失败。第一部分信息TGT,你是无法解密的,但需要展示缓存起来。

2.2. 你和TGS

如果第一部分你已经成功,你已经拥有无法解密的TGT和一个TGS Session Key。

(1)    请求信息

 a)  通过TGS Session Key加密的认证器部分:

  • 你的name/ID

  • 时间戳

b)       明文传输部分:

  • 请求的Http服务名(就是请求信息)

  • HTTP Service的Ticket生命周期

c)        TGT部分

  Ticket Granting Server收到信息后,首先检查数据库中是否包含有你请求的Http服务名。如果无,直接返回错误信息。

  如果存在,则通过KDC的密码解密TGT,这个时候。我们就能获取到TGS Session key。然后,通过TGS Session
key去解密你传输的第一部分认证器,获取到你的用户名和时间戳。

TGS再进行验证:

  1. 对比TGT中的用户名与认证器中的用户名

  2. 比较时间戳(网上有说认证器中的时间错和TGT中的时间错,个人觉得应该是认证器中的时间戳和系统的时间戳),不能超过一定范围

  3. 检查是否过期

  4. 检查IP地址是否一致

  5. 检查认证器是否已在TGS缓存中(避免应答攻击)

  6. 可以在这部分添加权限认证服务

  TGS随机产生一个Http Service Session
Key
, 同时准备Http Service Ticket(ST)。

(2)    回答信息

  a)        通过Http服务的密码进行加密的信息(ST):

  • 你的name/ID

  • Http服务name/ID

  • 你的IP地址

  • 时间戳

  • ST的生命周期

  • Http Service Session
    Key

  b)       通过TGS
Session Key
加密的信息

  • Http服务name/ID

  • 时间戳

  • ST的生命周期

  • Http Service Session
    Key

  你收到信息后,通过TGS Session
Key
解密,获取到了Http
Service Session Key
,但是你无法解密ST。

图 2?2 第二次通信

2.3. 你和Http服务

  在前面两步成功后,以后每次获取Http服务,在Ticket没有过期,或者无更新的情况下,都可直接进行这一步。省略前面两个步骤。

(1)    请求信息

  a)        通过Http Service Session
Key
加密部分

  • 你的name/ID

  • 时间戳

  b)       ST

   Http服务端通过自己的密码解压ST(KDC是用Http服务的密码加密的),这样就能够获取到Http Service Session
Key
,解密第一部分。

服务端解密好ST后,进行检查

  1. 对比ST中的用户名(KDC给的)与认证器中的用户名

  2. 比较时间戳(网上有说认证器中的时间错和TGT中的时间错,个人觉得应该是认证器中的时间戳和系统的时间戳),不能超过一定范围

  3. 检查是否过期

  4. 检查IP地址是否一致

  5. 检查认证器是否已在HTTP服务端的缓存中(避免应答攻击)

(2)    应答信息

a)        通过Http
Service Session Key
加密的信息

  • Http服务name/ID

  • 时间戳

图 2?3 第三次通信

  你在通过缓存的Http Service Session
Key
解密这部分信息,然后验证是否是你想要的服务器发送给你的信息。完成你的服务器的验证。

至此,整个过程全部完成。

3.  实现

github地址:https://github.com/wukenaihe/KerberosService

  github上面的程序暂时还没有详细的说明。自己感觉设计的稍微有点乱。自己之所以要重新实现的原因就是现在MIT的kerberos、apache
directory、Windows
AD配置都相当麻烦,使用起来也非常麻烦。所以想从新设计一个简单易用的,但是同时又考虑到灵活性(又不想依赖于spring)所以,总体感觉略乱。现在,加密通过AES方式,密码保存用文件,序列化通过kryo.

  项目中使用后,准备再添加使用说明,和程序结构。如果有任何疑问,欢迎询问。

4.  参考

http://www.roguelynn.com/words/explain-like-im-5-kerberos/

http://www.cnblogs.com/artech/archive/2011/01/24/kerberos.html

时间: 2024-08-28 22:06:13

Kerberos安全体系详解---Kerberos的简单实现的相关文章

弹出层详解,从简单到复杂

一.最简单的弹出 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="

原生JS弹出层详解,从简单到复杂

1.弹出层详解,从简单到复杂 http://www.artcss.com/archives/477.html 2.JavaScript 仿LightBox内容显示效果 http://www.cnblogs.com/cloudgamer/archive/2008/09/15/1290954.html

20160226.CCPP体系详解(0036天)

程序片段(01):01.多线程.c+02.多线程操作.c 内容概要:多线程 ///01.多线程.c #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <process.h> //01.线程任务函数剖析: // 1."封装"线程任务代码 // 2.MessageBox();作用: // 用于"阻塞"当前线程的继续执行状态 // 也就是

20160208.CCPP体系详解(0018天)

程序片段(01):main.c 内容概要:PointWithOutInit #include <stdio.h> #include <stdlib.h> //01.野指针详解: // 1.野指针:没有进行初始化操作的指针-->由于该指针变量内部所存储的地址是个随机值,因此是野地址(类型含义:指针) // 注:指针类型的变量必须在其被创建的时候就需要进行初始化操作,否则就成了野指针,所谓野指针就是乱指向的指针,形成的就是一个随机垃圾地址 // 2.胡乱使用野指针所造成的现象:

20160206.CCPP体系详解(0016天)

代码片段(01):.指针.c+02.间接赋值.c 内容概要:内存 ///01.指针 #include <stdio.h> #include <stdlib.h> //01.取地址操作符(&)详解: // 1.操作对象:变量名(实质:内存实体|数据实体) // 2.操作特点:属于寄存器操作(操作结果不是内存实体) // (1).取地址操作(&变量名)是在CPU的寄存器区域所完成的操作; // (2).地址数据不占用内存,内存地址是在CPU核心构成组件寄存器产生的, /

20160214.CCPP体系详解(0024天)

程序片段(01):CGI.c 内容概要:CGI-cloud #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main01(void) { printf("Content-Type:text/html \n\n"); printf("周瑞富很富,吴伟很帅,刘海华很高!并称高富帅! <br />"); printf("周瑞富很富,吴伟很帅,刘海华很高!并称高富帅! <b

20160220.CCPP体系详解(0030天)

程序片段(01):对称.c 内容概要:对称 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h> //01.对称原理: // 1.双索引or双指针-->双边对称夹逼-->进行字符比对 // 2.判断存在情况,默认所有情况 int isSemmetry(char * pStr) { char * p1 = pStr; char * p

【CSS进阶】CSS 颜色体系详解

说到 CSS 颜色,相比大家都不会陌生,本文是我个人对 CSS 颜色体系的一个系统总结与学习,分享给大家. 先用一张图直观的感受一下与 CSS 颜色相关大概覆盖了哪些内容. 接下来的行文内容大概会按照这个顺序进行,内容十分基础,可选择性跳到相应内容处阅读. 色彩关键字 嗯,色彩关键字很好理解.它表示一个具体的颜色值,且它不区分大小写.譬如这样 color:red 的 red 即是一个色彩关键字. 在 CSS3 之前,也就是 CSS 标准 2,一共包含了 17 个基本颜色,分别是: 而到了 CSS

Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单总结一下成功安装方法: 1,Vmware Player 12.1.1-3770994(Virtual Box 老版本Win10上启动不了,新版本5.1不再支持Mac OS) 2,执行命令关闭Hyper-v服务重启:bcdedit /set hypervisorlaunchtype off (不然无法