关于Kerberos

什么是Kerberos?

一句话,Kerberos是一种认证机制。

它的目的:通过密钥系统为客户端/服务器应用程序提供强大的认证服务:保护服务器防止错误的用户使用,同时保护它的用户使用正确的服务器,即支持双向验证;

Kerberos协议的整个认证过程实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。说白了, Kerberos通过传统的加密技术(共享密钥)实现了一种可信任的第三方认证服务。

认证授权

认证授权(Anthentication and Authorization)是系统权限管理经常需要考虑的问题,也是一个很复杂的问题,至少我是这样觉得的。

认证:系统识别某个个体/请求的身份时,称为认证;即辨别身份真伪,解决“你是谁”的问题。

授权:系统赋予某个个体从事某种行动的权利,叫做授权;即解决“你能做什么”的问题。

感觉应该说清楚了,认证未必授权,授权必须认证。

加密术语

上面说过,Kerberos是网络服务的认证机制,使用加密技术实现认证,这里再啰嗦下它们之间的关系。

加密:给数据加密,目的是保护数据,强调的是安全性

认证:判断身份的真实性,目的是辨真伪,强调的是真实性

授权:根据不同的身份给予不同的授权;所以认证(authentication)与授权(authorization)往往是相伴而生。

给出几个场景,来理解加密技术的一些术语:A为信息发送方;B为信息接收方

[密钥]:就是一个参数,明文转密文或密文转明文的算法输入数据

[对称加密](又称私钥加密):加密和解密使用同一个密钥(secret key)。常见的是使用用户名密码方式,例如A为服务器,存储了B的用户名密码,A发送一段数据给B前使用B的密码加密,B收到后使用自己的密码解密。

[非对称加密](又称公钥加密):采用公钥和私钥的方式,A和B都各有一对公钥和私钥;注意,公钥和私钥成对出现,一个公钥对应一个私钥。

[公钥]:公开的密钥,可以公开

[私钥]:私有的密钥,只有当事人自己知道

[数字证书]:用来辨别对方身份的,可以简单理解为一个被权威性机构验证过的公钥。

[数字签名]:使用私钥加密的数据叫做数字签名,采用对应的公钥来验证数字签名,从而确认发送方的身份。

公钥私钥的目的:实现信息的安全传输:1)A发送给B,信息传输过程必须加密,防止别人看;2)B收到后能够知道肯定是A发送的,而不是有人冒充A。

怎么实现呢?

场景理解:

1)首先A用B的公钥加密信息,进行发送,这保证了信息不会被别人看到或修改,B收到后使用B的私钥解密,就可以看到A发送的信息了。

2)其次,A用A的私钥给消息加密,B可以用A的公钥解密,因为A的私钥只在A手里,所以这可以确认信息是A发送的。

由此,可以看出【公钥私钥的主要用途】:

1) 公钥加密,对应上述场景中的前半段,重点是加密;实际应用中,公钥常以数字证书的方式出现,为了公钥的安全性和有效性(被权威认证过的)。

2) 私钥加密,即公钥认证,对应上述场景中的后半段,重点是认证(认证A身份的真实性);私钥加密的主要用途就是数字签名。

现实的痛点:

上面说了大半天,使用公钥私钥不就可以实现安全通信么,A和B要进行安全的通信,互相使用对方的公钥加密信息,然后使用私钥解密不就好了。实际情况是,有时候不一定双方都有公私钥对;更为重要的是,使用公私钥很费时间,很慢,影响通信体验。SSL应运而生。

[SSL](security sockets layer):实际应用中实现安全通信。

简单理解:SSL就是使用公私钥约定会话密钥,然后使用会话密钥和对称加密算法(例如DES)进行通信。

[会话密钥]:A要和B实现安全通信,A使用B的公钥加密一个密钥C发给B,B拿到后用私钥解密后得到密钥C,以后A和B之间传输的信息都使用约定的密钥C来加密,这个只有约定双方知道的密钥C叫做会话密钥(session key),其中约定会话密钥的过程叫做握手。

单点登录

SSO(single sign on):单点登录。多系统共存的情况下,用户一次登录得到其他所有系统的信任;

单点登录到处可见,平时在公司上班,公司有多个内部系统,如果每个系统都要输入用户名密码真的是很崩溃的一件事情,登录一次就可以访问所有的系统,这就是单点登录;例如淘宝和天猫是两个不同的系统,你上淘宝买东西,买好又去天猫买,这个时候就不需要再重新登录,即单点登录。

SSO比较经典的解决方案是CAS(central authentication service):中央认证服务。

CAS的原理和工作流程基本都是参考Kerberos票据的原理,所以也不用去研究CAS原理,直接搞懂Kerberos原理,CAS原理也就通了。

Kerberos术语

KDC(key distribution center):密钥发放中心

AS(authentication service):认证服务,索取credential,发放 TGT

TGS(ticket granting service):票据授权服务,索取TGT,发放ST

ST(service ticket):服务票据,由KDC的TGS发放,任何一个应用(application)都需要一张有效的服务票据才能访问;如果能正确接受ST,说明client和server之间的信任关系已经被建立,通常为一张数字加密的证书。

TGT(ticket granting ticket):票据授权票据,由KDC的AS发放;获得这样一张票据后,以后申请其他应用的服务票据(ST)时,就不需要向KDC提交身份认证信息(credential),TGT具有一定的有效期,就像是kerberos进行kinit以后只是具有固定时间的有效期,需要不断的去renew来续约。

上面几个术语简单说下它们的关系:KDC由AS和TGS组成,AS进行身份认证发放TGT,TGT是用来避免多次请求而需要重复认证的凭证;TGS发放ST,ST用来访问某个service时的凭证,ST相当于告诉service你的身份被KDC认证为合法的一个凭证。可以参考Kerberos原理中所画的图来理解这些术语。

Authenticator:验证器,与票据结合用来证明提交票据的user就是其所声明的身份,内容包括{user, address, start_time, lifetime},这些内容使用user和service之间的session key加密;验证器是user客户端自己构建,只能“被使用一次”。

Kerberos原理

为什么要有Kerberos这样一个中央认证机制?

既然认证就是辨别身份,那我输入用户名密码不就好了,为何要有Kerberos这样一个复杂的东西;

举例来说,有A,B,C三个服务器,分别提供不同的服务,user要访问ABC都需要输入用户名密码,但是ABC没必要都存一份user的密码,所以就衍生出一个中央服务器D来专门存储用户名密码;如果user通过了D的认证,那就是合法的身份,就可以使用ABC任何一个服务,所以user需要告诉ABC它通过了D的认证。

如何证明这个事情,以及信息在网络传输过程如何防止被截获篡改而假冒等等,解决这些问题就靠Kerberos,强烈推荐阅读MIT经典对话,可以理解协议中每条信息有什么字段,为何要设置这个字段等。

这个部分简单总结下Kerberos协议的认证流程,只有几步,详细的请参见 [经典对话手记] 来细致理解。

认证流程:

  1. User向KDC中的AS请求身份验证,AS为user和TGS生成一个session key:SK_TGS,并发送{ TGT, SK_TGS } K_USER;

其中,{TGT, SK_TGS}K_USER表示使用user的密码加密的packet,包含了TGT和用户与TGS的session key;这个请求验证的过程实际上是使用kinit来完成的,kinit将username传给AS,AS查找username的密码,将TGT和SK_TGS使用用户密码加密后发送给kinit,kinit要求用户输入密码,解密后得到TGT和SK;其中,TGT使用TGS的密码加密,信息内容为{ user, address, tgs_name, start_time, lisftime, SK_TGS} K_TGS

  1. User向KDC中的TGS请求访问某个Service的ST,发送[ TGT, Authenticator ];

其中,Authenticator用于验证发送该请求的user就是TGT中所声明的user,内容为:{ user, addresss, start_time, lifetime};Authenticator使用的TGS和user之间的session key加密的,防止TGT被盗。TGS先使用自己的密码解开TGT获得它与user之间的session key,然后使用session key解密Authenticator,验证用户和有效期。

  1. TGS判断无误后,为user和Service之间生成一个新的session key:SK_Service;然后发送给user一个包:[ {SK_Service} SK_TGS, ST ];

其中,ST是使用Service的密码加密的,SK_Service使用TGS和user之间的session key加密的;ST的内容为:{ user, address, start_time, lifetime, SK_Service } K_Service

  1. User使用与TGS之间的会话秘钥解开包得到与Service之间的会话秘钥SK_Service,然后使用SK_Service生成一个Authenticator,向Service发送[ ST, Authenticator ];

其中,此处的Authenticator是使用user和service之间的会话秘钥加密的,Service收到包后先使用自己的密码解密ST,或者会话秘钥SK_Service,然后使用SK_Service解密Authenticator来验证发送请求的用户就是票中所声明的用户。

  1. Service向用户发送一个包以证明自己的身份,这个包使用SK_Service加密。

此后user与Service之间使用SK_Service进行通信,且在TGT有效期内,user直接跳过第一步直接从第二步使用TGT向TGS证明自己的身份。注意:user client会等待service server发送确认信息,如果不是正确的service server,就无法解开ST,也就无法获得会话秘钥,从而避免用户使用错误的服务器。

个人理解要点:

TGS可以理解为一种service,TGT就可以理解为TGS的‘ST’,这样理解Kerberos就简单了,除了AS,其他都是一种Service对应着它们所需要的服务票据ST
整个过程涉及两个Session Key,一个是user和TGS之间的(由AS设置),一个是user和某个Service之间的(由TGS设置);按照把TGS作为一种特殊service的方式来理解的话,就是user和service之间都是通过Session key来通信的。
Service(包括特殊的TGS)取得相应session key是通过service自己的密码获得的,用户获得session key也是通过自己的密码取得的;即二者都通过自己的密码取得session key,然后使用session key进行通信;与上面说的加密技术是一样的道理。
至于为何要使用Session key,为何要使用Authenticator,原因还是去读一下经典对话吧,看看它们是如何被一步步设计出来的。

说到这里,其实上面的流程图也就是CAS的原理:

用户访问某个应用程序,应用服务器接收请求后检查ST和TGT,如果都有则用户正常进行访问;如果没有或者不对(如图,步骤1),转到CAS认证服务器的登录页面,通过安全认证后得到相应应用的TGT(步骤2-3)和该应用的ST(步骤4-5),再重定向到相关的应用服务器(步骤6),如果在会话周期内再定向到别的应用(步骤7),将出示TGT和该应用的ST(如果没有,就直接通过步骤4-5得到该应用的ST,即步骤8)进行认证。


这里引用参考文献的一个小场景,觉得作者写的非常好,拿来很助于理解:

用户要去游乐场,首先要在门口检查用户的身份(即 CHECK 用户的 ID 和 PASS), 如果用户通过验证,游乐场的门卫 (AS) 即提供给用户一张门卡 (TGT)。

这张卡片的用处就是告诉游乐场的各个场所,用户是通过正门进来,而不是后门偷爬进来的,并且也是获取进入场所一把钥匙。

现在用户有张卡,但是这对用户来不重要,因为用户来游乐场不是为了拿这张卡的而是为了游览游乐项目,这时用户摩天楼,并想游玩。

这时摩天轮的服务员 (client) 拦下用户,向用户要求摩天轮的 (ST) 票据,用户说用户只有一个门卡 (TGT), 那用户只要把 TGT 放在一旁的票据授权机 (TGS) 上刷一下。

票据授权机 (TGS) 就根据用户现在所在的摩天轮,给用户一张摩天轮的票据 (ST), 这样用户有了摩天轮的票据,现在用户可以畅通无阻的进入摩天轮里游玩了。

当然如果用户玩完摩天轮后,想去游乐园的咖啡厅休息下,那用户一样只要带着那张门卡 (TGT). 到相应的咖啡厅的票据授权机 (TGS) 刷一下,得到咖啡厅的票据 (ST) 就可以进入咖啡厅

当用户离开游乐场后,想用这张 TGT 去刷打的回家的费用,对不起,用户的 TGT 已经过期了,在用户离开游乐场那刻开始,用户的 TGT 就已经销毁了。

经典对话手记

todo …

参考:

http://web.mit.edu/kerberos/dialogue.html

http://dongxicheng.org/mapreduce/hadoop-kerberos-introduction/

http://ahleung.blog.163.com/blog/static/149426290201421451340228/

http://ahleung.blog.163.com/blog/static/149426290201421451226471/

http://wenku.baidu.com/view/c215e1e8102de2bd96058820.html?re=view

http://wenku.baidu.com/view/421c9e22aaea998fcc220ec5.html

什么是Kerberos?相关推荐

  1. kerberos java实现,基于kerberos实现jaas登录

    这段时间在做hadoop和kerberos的整合,顺便看了jaas和kerberos,这里给出使用kerberos登录模块的jaas例子. 前提条件 1.kerberos已经安装,principal已 ...

  2. hadoop java client_hadoop3 Java client客户端kerberos认证

    hadoop集群升级hadoop3,并需要Kerberos认证,hadoop3代码包做了合并,引用jar包如下: org.apache.hadoop hadoop-hdfs 3.1.1 org.apa ...

  3. linux下kerberos教程

    一.kerberos介绍 Kerberos这一名词来源于希腊神话"三个头的狗--地狱之门守护者"系统设计上采用客户端/服务器结构与DES加密技术,并且能够进行相互认证,即客户端和服 ...

  4. java通过kerberos认证连接hdfs并写数

    通过查阅,得知UserGroupInformation这个类JAAS 框架上封装了Hadoop的用户信息 有两种方法:loginUserFromKeytab:调用checkTGTAndReloginF ...

  5. 为 Kerberos 连接注册服务主体名称

    为 Kerberos 连接注册服务主体名称 SQL Server 2012 引自:http://technet.microsoft.com/zh-cn/library/ms191153.aspx 若要 ...

  6. Chapter 1 Securing Your Server and Network(9):使用Kerberos用于身份验证

    原文: Chapter 1 Securing Your Server and Network(9):使用Kerberos用于身份验证 原文出处:http://blog.csdn.net/dba_hua ...

  7. Java代码使用Spark on Yarn 方式提交任务到带Kerberos认证的Hadoop集群

    2019独角兽企业重金招聘Python工程师标准>>> 项目中遇到Spark Yarn方式提交到Hadoop集群,访问集群HDFS时发现使用的当前用户,没有访问权限,经过排查后发现H ...

  8. HDFS配置Kerberos认证

    为什么80%的码农都做不了架构师?>>>    本文主要记录 CDH Hadoop 集群上配置 HDFS 集成 Kerberos 的过程,包括 Kerberos 的安装和 Hadoo ...

  9. solr kerberos java_solr添加kerberos认证及授权

    solr添加kerberos认证及授权 @(OTHERS)[solr] 一.kerberos (一)添加用户 在kdc中添加solr用户: root@kdc:/# kadmin.local kadmi ...

  10. kerberos简单介绍

    重要术语 1. KDC 全称:key distributed center 作用:整个安全认证过程的票据生成管理服务,其中包含两个服务,AS和TGS 2. AS 全称:authentication s ...

最新文章

  1. 树上启发式合并问题 ---- D. Tree and Queries[树上启发式合并+树状数组]
  2. 柱坐标系下的ns方程_笛卡尔坐标系到底是什么?
  3. Retrofit2.0+ .Net MVC4(WebApi) 上传多张图片
  4. 互联网1分钟 |1221
  5. linux下修改rm命令防止误删除
  6. 2020蓝桥杯省赛---java---B---7(分类计数)
  7. 如何让linux服务器同步互联网时间
  8. 我的Linux折腾史
  9. at/cron计划任务初解
  10. js统计字符串中特定字符出现的个数
  11. Java基础:Map
  12. BootStrap之导航navigation
  13. 浅谈网站建设方案主要内容
  14. 【Microarchitecture of Intel and AMD CPU】 9 Sandy Bridge and Ivy Bridge pipeline 【9.1~9.3】
  15. 连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册
  16. 微信服务号、订阅号和企业号的差别(运营和开发两个角度)
  17. 倍福PLC模拟量输入模块的使用方法
  18. 云服务器 文件服务,云服务器 和文件服务器
  19. 有史以来影响世界的颠覆性技术 | 未来的高附加值颠覆性技术产业
  20. ECCV2020 TIDE: A General Toolbox for Identifying Object Detection Errors

热门文章

  1. JavaScript返回上一页的三种方法
  2. docker容器开机的自动启动与关闭
  3. 使用vue做柱状echarts报表
  4. i7 9700k和i9 9900k 哪个好
  5. 台式计算机cpu是什么,台式电脑CPU怎么看好坏?台式电脑处理器好坏从这几个方面判断...
  6. DirectX C#
  7. 微信小程序 html插件,微信小程序使用wxParse插件读取富文本,解析html标记
  8. Python_OpenCV通过摄像头识别二维码和条形码
  9. excel流程图连接线锁定_Excel这样的流程图你会吗 ?
  10. 约瑟夫环问题数学优化方法