Kerberos身份验证流程
介绍:
Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
在 Kerberos 认证中,最主要的问题是如何证明「你是你」的问题,如当一个 Client 去访问 Server 服务器上的某服务时,Server 如何判断 Client 是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是 Kerberos 解决的问题。在域渗透过程中 Kerberos 协议的攻防也是很重要的存在。
Kerberos 主要是用在域环境下的身份认证协议。
Kerberos 协议框架:
在 Kerberos 协议中主要是有三个角色的存在:
1. 访问服务的 Client;
2. 提供服务的 Server;
3.KDC(Key Distribution Center)密钥分发中心

注意:
1、KDC 服务默认会安装在一个域的域控中
2、从物理层面看,AD与KDC均为域控制器(Domain Controller)
3、AD其实是一个类似于本机SAM的一个数据库,全称叫account database,存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT
4、KDC 服务框架中包含一个 KRBTGT 账户,它是在创建域时系统自动创建的一个账号,你可以暂时理解为他就是一个无法登陆的账号,在发放票据时会使用到它的密码 HASH 值。

上文提到的TGT,KDC,client,server又是什么东西呢,下文来介绍下:
Kerberos粗略的验证流程:
先来举个例子:如果把 Kerberos 中的票据类比为一张火车票,那么 Client 端就是乘客,Server 端就是火车,而 KDC 就是就是车站的认证系统。如果Client端的票据是合法的(由你本人身份证购买并由你本人持有)同时有访问 Server 端服务的权限(车票对应车次正确)那么你才能上车。当然和火车票不一样的是 Kerberos 中有存在两张票,而火车票从头到尾只有一张。
在KDC中又分为两个部分:Authentication Service和Ticket Granting Service
Authentication Service:AS 的作用就是验证 Client 端的身份(确定你是身份证上的本人),验证通过就会给一张 TGT(Ticket Granting Ticket)票给 Client。
Ticket Granting Service:TGS 的作用是通过 AS 发送给 Client 的票(TGT)换取访问 Server 端的票(上车的票 ST)。ST(ServiceTicket)也被称之为 TGS Ticket,为了和 TGS 区分,在这里就用 ST 来说明,所以TGS Ticket和ST的意思是一样的。
这就说明了为什么在Kerberos中存有两种票,其实就是更加细分了其中的验证,简单的描述就是首先你拿身份证验证头像是不是一样,是的话就返回一张TGT,然后在通过验证车票获得上车的资格,这里就有对TGT的验证,通过的话再返回一张ST/TGS Ticket的票,如果都可以那么就验证成功了。
Kerberos 详解认证流程:
当 Client 想要访问 Server 上的某个服务时,需要先向 AS 证明自己的身份,然后通过 AS 发放的 TGT 向 Server 发起认证请求,这个过程分为三块:
The Authentication Service Exchange:Client 与 AS 的交互,
The Ticket-Granting Service (TGS) Exchange:Client 与 TGS 的交互,
The Client/Server Authentication Exchange:Client 与 Server 的交互。

(1)TheAuthentication Service Exchange
KRB_AS_REQ(请求):
Client->AS:Client 先向 KDC 的 AS 发送 Authenticator1(内容为Client hash加密的时间戳)
KRB_AS_REP(应答):
AS-> Client:AS根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash,然后会生成一个随机数session key,然后返回给Client由Client的ntlm hash加密的session key-as作为AS数据,再返回TGT(使用KDC中krbtgt的NTLM Hash加密session key和客户端的信息,客户端的信息里面包含了时间戳等信息)
AS验证的简述:在 KDC(AD) 中存储了域中所有用户的密码 HASH,当 AS 接收到 Client 的请求之后会根据 KDC 中存储的密码来解密,解密成功并且验证信息。
验证成功后返回给 Client两个东西,一个是由 Client 密码 HASH 加密的 session key-as 和 TGT(由 KRBTGT HASH 加密的 session key 和 TimeStamp 等信息)。

(2)TheTicket-Granting Service (TGS) Exchange
KRB_TGS_REQ(请求):
Client 接收到了加密后的session key-as 和 TGT 之后,先用自身密码 HASH解密得到session key ,TGT 是由 KDC 中KRBTGT的HASH加密,所以Client 无法解密。这时 Client 再用session key加密的TimeStamp,然后再和TGT 一起发送给 KDC 中的 TGS(TicketGranting Server)票据授权服务器换取能够访问 Server 的票据。
KRB_TGS_REP(应答):
TGS 收到 Client 发送过来的 TGT 和 Session key 加密的 TimeStamp 之后,首先会检查自身是否存在 Client 所请求的服务。如果服务存在,则用 KRBTGT的HASH解密 TGT。
一般情况下 TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同。
验证成功之后将返回Client两个东西,一个是用 session key 加密的 session key-tgs,然后另一个是 Client要访问的Server的密码 HASH 加密的 session key-tgs(前面和session key加密生成的)生成就是ST(TGS)

(3)TheClient/Server Authentication Exchange
KRB_AP_REQ(请求):
Client -> Server 发送 Authenticator3(session key-tgs 加密 TimeStamp) 和票据 ST(Server 密码 HASH 加密 session key-tgs)
Client 收到 session key 加密生成的 session key-tgs 和 Server 密码 HASH 加密 session key-tgs生成的TGS 之后,用 session key 解密得到 session key-tgs,然后把 sessionkey-tgs 加密的 TimeStamp 和 ST(也就是TGS)一起发送给 Server。
KRB_AP_REP(应答):
Server-> Client
server 通过自己的密码解密 ST,得到 sessionkey-tgs, 再用 sessionkey-tgs 解密 Authenticator3 得到 TimeStamp,验证正确返回验证成功。

上文文字描述的也就是最开头的图片,这里再放上去,是不是会发现这张图理解了???

参考文章:https://tools.ietf.org/html/rfc4120.html
参考文章:https://www.freebuf.com/articles/system/196434.html
Kerberos身份验证流程的更多相关文章
- 域渗透-Kerberos身份验证流程
域渗透-Kerberos身份验证流程 Kerberos协议框架 在 Kerberos 协议中主要是有三个角色的存在: 1. 访问服务的 Client: 2. 提供服务的 Server: 3.KDC(K ...
- 在 Linux 客户端配置基于 Kerberos 身份验证的 NFS 服务器
在这篇文章中我们会介绍配置基于 Kerberos 身份验证的 NFS 共享的整个流程.假设你已经配置好了一个 NFS 服务器和一个客户端.如果还没有,可以参考 安装和配置 NFS 服务器[2] - 它 ...
- 为CDH 5.7集群添加Kerberos身份验证及Sentry权限控制
转载请注明出处:http://www.cnblogs.com/xiaodf/ 4. 为CDH 5集群添加Kerberos身份验证 4.1 安装sentry1.点击“操作”,“添加服务”:2.选择sen ...
- 部署开启了Kerberos身份验证的大数据平台集群外客户端
转载请注明出处 :http://www.cnblogs.com/xiaodf/ 本文档主要用于说明,如何在集群外节点上,部署大数据平台的客户端,此大数据平台已经开启了Kerberos身份验证.通过客户 ...
- ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程
ASP.NET Core Web API中带有刷新令牌的JWT身份验证流程 翻译自:地址 在今年年初,我整理了有关将JWT身份验证与ASP.NET Core Web API和Angular一起使用的详 ...
- zabbix身份验证流程解析&绕过身份验证的方法
由于实验室产品的监控模块的需求,需要绕过zabbix的验证模块,实现从二级平台到zabbix的无缝接入. 测试发现,zabbix的身份验证并不是想象的那么简单,为了实现功能,遂进行源码分析. zabb ...
- Kerberos身份验证访问Web HttpFS
原文出处: https://www.ibm.com/support/knowledgecenter/en/SSPT3X_3.0.0/com.ibm.swg.im.infosphere.biginsig ...
- SQL Server安全(2/11):身份验证(Authentication)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- ASP.NET Core 使用 JWT 搭建分布式无状态身份验证系统
为什么使用 Jwt 最近,移动开发的劲头越来越足,学校搞的各种比赛都需要用手机 APP 来撑场面,所以,作为写后端的,很有必要改进一下以往的基于 Session 的身份认证方式了,理由如下: 移动端经 ...
随机推荐
- 深度学习-深度强化学习(DRL)-Policy Gradient与PPO笔记
Policy Gradient 初始学习李宏毅讲的强化学习,听台湾的口音真是费了九牛二虎之力,后来看到有热心博客整理的很细致,于是转载来看,当作笔记留待复习用,原文链接在文末.看完笔记再去听一听李宏毅 ...
- John Lemon's Haunted Jaunt(鬼屋游戏笔记)
1.使用Unity 2019.2.3 2.角色移动的控制脚本 3.后期处理组件PostProcessLayer (类似给相机加上了一层滤镜) 4.制作简单的怪物AI系统,使用 NAvMeshAge ...
- js拼接url以及为html某标签属性赋值
记录 js拼接url 比如有些时候我们需要为某按钮实现跳转,可以利用下面的方式做到: function ReturnIndex() { var rex = RegExp("tools&quo ...
- es常用操作
1.查看所有索引 _cat/indices?v 2.删除索引 DELETE my_index 3.查询缓存 curl /my_index/_search?request_cache=true' -d' ...
- linux安装好的mysql rpm -qa |grep mysql不见
输入: rpm -qa|grep -i mysql
- WPF 程序的编译过程
原文:WPF 程序的编译过程 基于 Sdk 的项目进行编译的时候,会使用 Sdk 中附带的 props 文件和 targets 文件对项目进行编译.Microsoft.NET.Sdk.WindowsD ...
- java之hibernate之hibernate查询
这篇主要简单间接 hibernate查询 1.数据库操作中最重要的是查询,Hibernate提供了多种查询方式来帮助程序员快速实现查询功能. 有hql,本地sql查询,Criteria查询,examp ...
- Nginx fastcgi_cache权威指南
一.简介 Nginx版本从0.7.48开始,支持了类似Squid的缓存功能.这个缓存是把URL及相关组合当做Key,用Md5算法对Key进行哈希,得到硬盘上对应的哈希目录路径,从而将缓存内容保存在该目 ...
- vue 利用v-model实现父子组件数据双向绑定
v-model父组件写法: v-model子组件写法: 子组件export default中的model:{}里面两个值,prop代表着我要和props的那个变量相对应,event表示着事件,我触发事 ...
- SG-UAP常用注解介绍
注解基本介绍 Annotation(注解)是JDK5.0及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可 ...