Kerberos认证流程详解
Kerberos是诞生于上个世纪90年代的计算机认证协议,被广泛应用于各大操作系统和Hadoop生态系统中。了解Kerberos认证的流程将有助于解决Hadoop集群中的安全配置过程中的问题。为此,本文根据最近阅读的一些材料,详细介绍Kerberos认证流程。欢迎斧正!
Kerberos解决什么问题?
简单地说,Kerberos提供了一种单点登录(SSO)的方法。考虑这样一个场景,在一个网络中有不同的服务器,比如,打印服务器、邮件服务器和文件服务器。这些服务器都有认证的需求。很自然的,不可能让每个服务器自己实现一套认证系统,而是提供一个中心认证服务器(AS-Authentication Server)供这些服务器使用。这样任何客户端就只需维护一个密码就能登录所有服务器。 因此,在Kerberos系统中至少有三个角色:认证服务器(AS),客户端(Client)和普通服务器(Server)。客户端和服务器将在AS的帮助下完成相互认证。 在Kerberos系统中,客户端和服务器都有一个唯一的名字,叫做Principal。同时,客户端和服务器都有自己的密码,并且它们的密码只有自己和认证服务器AS知道。
简化的Kerberos认证流程
首先来看现实生活中的类似的一个例子。假如你要去社区事务中心去办理居住证,但是社区事务中心并不能确定你的身份,因此需要你去派出所开据证明,证明你就是你。那么,通常的流程是这样的:
1. 你带好身份证和相应的材料去派出所,向JCSS说明你要办居住证,需要开据相应的证明。
2. JCSS根据他们的内部系统,核实了你提供的材料并开据了证明,上面盖有派出所的红章。
3. 你再拿着这个证明再去社区事务中心,社区事务中心的工作人员看到了JCSS提供的证明,就可以确定你的身份,便开始给你办理业务。
和上面的例子中的流程非常相似,Kerberos的认证流程分成了以下4个步骤,见下图。 符号说明:
- client_principal, server_principal: 分别表示客户端和服务器的名字。
- Tc,s: 表示AS发给客户端c的票据,该票据包含有用于和服务器s通信认证的相关信息。
- {Kc,s; server_principal,...}Kc: 表示票据的内容,{}里面的为具体内容。Kc为客户端的密码,表示该票据由客户端的密码加密。其它的类似。
1. 客户端向服务器端发起请求,请求的内容是:我是谁(客户端的principal),我要和谁通信(服务器的principal)
2. AS收到请求以后,随机生成一个密码Kc,s (Session Key),并且生成了以下两个票据(Ticket)返回给客户端:
- Tc,s={Kc,s; server_principal,...}Kc - 该票据是给客户端的,大括号里面为票据中的内容,后面的Kc为客户端的密码,表示该票据用客户端的密码加密了。
- Ts,c={Kc,s; client_principal,...}Ks - 大括号里面为票据中的内容,后面的Ks为服务器的密码,表示该票据用服务器的密码加密了。该票据是给服务器的,但是AS并不直接给服务器,而是交给了客户端再由客户端交给服务器。因为该票据由服务器的密码加密了,所以客户端无法伪造和篡改。
注:Tc,s和Ts,c这两个符号是本文为了描述方便而引入的,在别的文献中没有。
3. 客户端拿到了第二步中的两个票据后,首先用自己的密码解开票据Tc,s得到Kc,s,然后生成一个认证因子(Authenticator),其内容如下:
- Authenticator: {time_stamp, Ts,c_checksum,...}Kc,s
其中主要包括当前时间和Ts,c的校验码,并且用SessionKey Kc,s加密。
客户端将Authenticator和Ts,c同时发给服务器。
4.服务器首先用自己的密码解开Ts,c,拿到SessionKey Kc,s,然后用Kc,s解开Authenticator,并做如下检查:
- 检查Authenticator中的时间戳是不是在当前时间上下5分钟以内,并且检查该时间戳是否首次出现。如果该时间戳不是第一次出现,那说明有人截获了之前客户端发送的内容,进行Replay攻击。
- 检查checksum是否正确。
如果都正确,客户端就通过了认证。 服务器段可选择性地给客户端回复一条消息来完成双向认证,内容如下:
- {time_stamp}Kc,s
其中包括客户端发送过去的时间戳,并且用SessionKey Kc,s加密。
客户端通过解开该消息,通过比较服务器返回的时间戳和自己发送过去的时间戳是否一致,来验证服务器。 通过以上4个步骤,客户端和服务器就完成了双向认证。随后,客户端和服务器就可以用session key来加密需要传输的内容。
完整的Kerberos认证流程
- Authenticator = {time_stamp, checksum, ...}Kc,tgs
- Ttgs,c - 第二步从AS返回的票据
- server_principal, ...
- Tc,s={Kc,s, server_principal,...}Kc,tgs - 这是给客户端的票据,Kc,s是客户端与服务器之间的SessionKey,用客户端和TGS之间的SessionKey(Kc,tgs)加密。区别就在这里了,给客户端的票据不再用客户端的密码加密,而是用客户端和Tgs之间的SessionKey加密。
- Ts,c={Kc,s, client_principal,...}Ks - 这是给服务器的票据,用服务器的密码加密。
- Authenticator={time_stamp, Ts,c_checksum,...}Kc,s
- Ts,c={Kc,s, client_principal,...}Ks。
- {time_stamp}Kc,s
这是客户端首次认证的流程,通常客户端会在第2步的时候把相应的票据保存下来,在以后客户端需要认证别的服务器的时候就不需要前面两步,直接从第3步开始。
小结与参考资料
本文详细介绍了Kerberos的认证流程,了解Kerberos的认证流程对配置Hadoop的安全性很有必要。以后有机会再分享Kerberos在Hadoop生态系统中的具体应用。本文主要参考了以下资料:
- http://gost.isi.edu/publications/kerberos-neuman-tso.html
- http://blog.sina.com.cn/s/blog_5384e78b0100fhdt.html
Kerberos认证流程详解的更多相关文章
- SpringSecurity认证流程详解
SpringSecurity基本原理 在之前的文章<SpringBoot + Spring Security 基本使用及个性化登录配置>中对SpringSecurity进行了简单的使用介绍 ...
- Linux启动流程详解【转载】
在BIOS阶段,计算机的行为基本上被写死了,可以做的事情并不多:一般就是通电.BIOS.主引导记录.操作系统这四步.所以我们一般认为加载内核是linux启动流程的第一步. 第一步.加载内核 操作系统接 ...
- C++的性能C#的产能?! - .Net Native 系列《二》:.NET Native开发流程详解
之前一文<c++的性能, c#的产能?!鱼和熊掌可以兼得,.NET NATIVE初窥> 获得很多朋友支持和鼓励,也更让我坚定做这项技术的推广者,希望能让更多的朋友了解这项技术,于是先从官方 ...
- [nRF51822] 5、 霸屏了——详解nRF51 SDK中的GPIOTE(从GPIO电平变化到产生中断事件的流程详解)
:由于在大多数情况下GPIO的状态变化都会触发应用程序执行一些动作.为了方便nRF51官方把该流程封装成了GPIOTE,全称:The GPIO Tasks and Events (GPIOTE) . ...
- 迅为4412开发板Linux驱动教程——总线_设备_驱动注册流程详解
本文转自:http://www.topeetboard.com 视频下载地址: 驱动注册:http://pan.baidu.com/s/1i34HcDB 设备注册:http://pan.baidu.c ...
- iOS 组件化流程详解(git创建流程)
[链接]组件化流程详解(一)https://www.jianshu.com/p/2deca619ff7e
- git概念及工作流程详解
git概念及工作流程详解 既然我们已经把gitlab安装完毕[当然这是非必要条件],我们就可以使用git来管理自己的项目了,前文也多多少少提及到git的基本命令,本文就先简单对比下SVN与git的区别 ...
- Lucene系列六:Lucene搜索详解(Lucene搜索流程详解、搜索核心API详解、基本查询详解、QueryParser详解)
一.搜索流程详解 1. 先看一下Lucene的架构图 由图可知搜索的过程如下: 用户输入搜索的关键字.对关键字进行分词.根据分词结果去索引库里面找到对应的文章id.根据文章id找到对应的文章 2. L ...
- JPEG图像压缩算法流程详解
JPEG图像压缩算法流程详解 JPEG代表Joint Photographic Experts Group(联合图像专家小组).此团队创立于1986年,1992年发布了JPEG的标准而在1994年获得 ...
随机推荐
- 怎样清除td和input之间空隙
<style> input {background:red;border:none;height:30px;margin:0px} td {background-color:blue;pa ...
- List<>.Contains<>的用法
List<Plan> Plans = new List<Plan>();//存放服务器中的当前用户所接受的项目计划列表. //Plan 类包含PlanID等属性. if (Pl ...
- POJ 3371 Flesch Reading Ease 无聊恶心模拟题
题目:http://poj.org/problem?id=3371 无聊恶心题,还是不做的好,不但浪费时间而且学习英语. 不过为了做出点技术含量,写了个递归函数... 还有最后判断es,ed,le时只 ...
- Tekla Structures 使用类库概览
Tekla Structures 2016 已经发布了,使用了 Ribbon 的全新 UI 风格,比以前要漂亮许多. 不过功能方面貌似没啥大的改进,感觉天宝的主要精力都投入到了混凝土模块上,忙着和别人 ...
- C# ADO.NET操作数据库 SqlHelp.cs类
刚开始练习ADONET的时候,练习的一个SQLHelp.cs 数据库操作类,很简单,但是也很实用 using System; using System.Collections.Generic; us ...
- iOS 一些struct类型的NSLog输出格式-b
我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...
- Server-Side Access Control
Firefox 3.5 implements the W3C Access Control specification. As a result, Firefox 3.5 sends specifi ...
- 中断服务程序(Interrupt Service Routines,ISR)注意事项
转自ISR之不能做什么 中断是嵌入式系统中重要组成部分,很多编译器开发商都让标准c支持中断,并引入关键字_interrupt.但是: 1.ISR不能有返回值: 2.ISR不能传递参数: 3.ISR应该 ...
- 深入解析java虚拟机-jvm运行机制
转自oschina 一:JVM基础概念 JVM(Java虚拟机)一种用于计算设备的规范,可用不同的方式(软件或硬件)加以实现.编译虚拟机的指令集与编译微处理器的指令集非常类似.Java虚拟机包括一套字 ...
- SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-006-当构造函数有集合时的注入
一.当构造函数有集合时,只能用<CONSTRUCTOR-ARG>,不能用C-NAMESPACE 二. 1. package soundsystem.collections; import ...