Kerberos协议学习报告
[摘要]Kerberos协议是一种计算机网络授权协议,用来在非安全网络中,对个人通信以安全的手段进行身份认证。在计算机网络的身份认证中, 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于在每个Client和Service之间建立了共享密钥,使得该协议具有相当的安全性。通过对本协议的学习总结,扩展学习了对Kerberos在hadoop中的安全认证机制。
[关键词] Kerberos协议;身份认证;票据;SSO;共享密钥;学习总结;hadoop;安全认证
1 Kerberos协议概述
Kerberos使用Needha-Schroeder协议作为它的基础。它使用了一个由两个独立的逻辑部分:认证服务器和票据授权服务器组成的"可信赖的第三方",术语称为密钥分发中心(KDC)。Kerberos工作在用于证明用户身份的"票据"的基础上。
KDC持有一个密钥数据库;每个网络实体——无论是客户还是服务器——共享了一套只有他自己和KDC知道的密钥。密钥的内容用于证明实体的身份。对于两个实体间的通信,KDC产生一个会话密钥,用来加密他们之间的交互信息。
2 Kerberos协议内容
协议的安全主要依赖于参加者对时间的松散同步和短周期的叫做Kerberos票据的认证声明。下面是对这个协议的一个简化描述,将使用以下缩写:
AS(Authentication Server)=认证服务器
TGT(Ticket Granting Ticket)=票据授权票据,票据的票据
TGS(Ticket Granting Server)=票据授权服务器
SS(Service Server)=服务器
其在网络通讯协定中属于显示层。简单地说,用户先用共享密钥从某认证服务器得到一个身份证明。随后,用户使用这个身份证明与SS通信,而不使用共享密钥。
3.协议过程
3.1 客户机程序登录
用户使用客户机(用户自己的机器)上的程序登录:
1.用户输入用户ID和密码到客户机。
2.客户机程序运行一个单向函数(大多数为杂凑)把密码转换成密钥,这个就是客户机(用户)的"用户密钥"(K_client)。受信任的AS通过某些安全的途径也获取了与此密钥相同的密钥。
3.2客户机认证
客户机认证(客户机从AS获取票据的票据(TGT)):
1.客户机向AS发送1条消息(注意:用户不向AS发送密钥(K_client),也不发送密码):
包含用户ID的明文消息,例如"用户Sunny想请求服务"(Sunny是用户ID)
2.AS检查用户ID有效性,而后返回2条消息:
消息A:用户密钥(K_client)加密后的"客户机-TGS会话密钥"(K_TGS-session)(会话密钥用在将来客户机与TGS的通信(会话)上)
消息B:TGS密钥(K_TGS)加密后的"票据授权票据"(TGT)(TGT包括:客户机-TGS会话密钥(K_TGS-session),用户ID,用户网址,TGT有效期)
3.客户机用自己的密钥(K_client)解密A,得到客户机-TGS会话密钥(K_TGS-session)。(注意:客户机不能解密消息B,因为B是用TGS密钥(K_TGS)加密的)。
3.3服务授权
服务授权(客户机从TGS获取票据(T)):
1.客户机向TGS发送以下2条消息:
消息c:即消息B(K_TGS加密后的TGT),和想获取的服务的服务ID(注意:不是用户ID)
消息d:客户机-TGS会话密钥(K_TGS-session)加密后的"认证符"(认证符包括:用户ID,时间戳)
2.TGS用自己的密钥(K_TGS)解密c中的B得到TGT,从而得到AS提供的客户机-TGS会话密钥(K_TGS-session)。再用这个会话密钥解密d得到用户ID(认证),而后返回2条消息:
消息E:服务器密钥(K_SS)加密后的"客户机-服务器票据"(T)(T包括:客户机-SS会话密钥(K_SS-session),用户ID,用户网址,T有效期)
消息F:客户机-TGS会话密钥(K_TGS-session)加密后的"客户机-SS会话密钥"(K_SS_session)
3.客户机用客户机-TGS会话密钥(K_TGS-session)解密F,得到客户机-SS会话密钥(K_SS_session)。(注意:客户机不能解密消息E,因为E是用SS密钥(K_SS)加密的)。
3.4服务请求
服务请求(客户机从SS获取服务):
1.客户机向SS发出2条消息:
消息e:即消息E
消息g:客户机-服务器会话密钥(K_SS_session)加密后的"新认证符"(新认证符包括:用户ID,时间戳)
2.SS用自己的密钥(K_SS)解密e/E得到T,从而得到TGS提供的客户机-服务器会话密钥(K_SS_session)。再用这个会话密钥解密g得到用户ID(认证),而后返回1条消息(确认函:确证身份真实,乐于提供服务):
消息H:客户机-服务器会话密钥(K_SS_session)加密后的"新时间戳"(新时间戳是:客户机发送的时间戳加1)
3.客户机用客户机-服务器会话密钥(K_SS_session)解密H,得到新时间戳。
4.客户机检查时间戳被正确地更新,则客户机可以信赖服务器,并向服务器(SS)发送服务请求。
5.服务器(SS)提供服务。
3.5协议全过程
整个过程如图所示:
4协议学习总结
kerberos有三个最重要的规则,一是从不在网上传输明文,这保证了认证过程的保密性,这是一切的前提。二是在认证和被认证双方共享一个密钥,这保证了认证的根本,即不可冒充和不可伪造性。三是存在一个公信度很高的受信任机构,这保证了认证本身的保密和不可冒充,在认证体系上,kerberos是集权的, kerberos的过程大致分为两步,第一步是准入认证,第二步是通信认证,首先看第一步的过程:
1.首先新接入网络的客户端需要从受信任的机构获取一份准入声明,也就是获得受信机构的信任,它只需要简单发送用户名到该机构;
2.受信机构通过用户名查到用户的密码,然后生成一份准入证书(包含客户端的信息)和一个客户端和受信机构共享的一个共享密钥,用客户端的口令加密后发送给客户端;
3.客户端收到加密的准入证书和共享密钥之后会用只有自己和受信机构知道的自己的密钥进行解密,得到共享密钥,至此,客户成为准入的;
注意:每个服务器进入网络也同样需要进行同样的准入认证,过程稍有不同但大致一致。
下面是第二步:
1.接下来如果客户端需要和某个服务器通信,那么它会将服务器的id连同自己的准入证书用和受信机构共享的密钥加密后连同一个验证器(用共享密钥加密的用户信息)以及用户信息的明文一同传给受信机构;
2.受信机构收到请求后,将验证用户的准入性,通过用户名查询共享密钥,用共享密钥解密验证器后和明文用户信息对比,如果一致则通过认证;
3.受信机构根据请求的服务器id生成一个该服务器和客户端共享的密钥,然后用受信机构和客户端的共享密钥将它和用户信息以及服务器信息以及时间戳信息加密后传回客户端;
注意:用户信息以及服务器信息以及时间戳信息本身中包含客户端和服务器的共享密钥并且是用被请求服务器的密钥加密的,因此客户端不可能得到更多的信息,不可能伪造和服务器通信的凭证。
4.客户端收到包后用和受信机构共享的密钥解开包,取出和服务器共享的密钥,然后用该密钥加密一段客户端的信息--验证器,将这个加密信息和从受信机构解出的剩下部分一并发给服务器;
5.服务器收到后,先用自己的密钥解密第4步中所谓的剩下的那一部分,从中得到那个自己和客户端共享的口令,然后用这个口令解密客户传来的验证器,比对信息,如果正确则通过验证。
5 Kerberos在hadoop中的安全认证机制
5.1 Hadoop安全机制现状
Hadoop 一直缺乏安全机制,主要表现在以下几个方面:
1.用户到服务器
Namenode或者jobtracker缺乏安全认证机制:用户可以伪装成其他用户入侵到一个HDFS或者MapReduce集群上。
DataNode缺乏安全授权机制:用户只要知道某个block的blockID,便可以绕过namenode直接从datanode上读取该block;用户可以向任意datanode上写block。
JobTracker缺乏安全授权机制:用户可以修改或者杀掉任意其他用户的作业;用户可以修改JobTracker的持久化状态。
2.服务器到服务器安全认证,
Datanode与TaskTracker缺乏安全授权机制,这使得用户可以伪装成datanode和tasktracker,去接受JobTracker,Namenode的任务指派。
5.2 Kerberos能解决的Hadoop安全认证问题
Kerberos 实现的是机器级别的安全认证,也就是前面提到的服务到服务的认证问题。事先对集群中确定的机器有管理员手动添加到Kerberos 数据库中,在KDC上分别产生主机与各个节点的keytab,并将这些keytab分发到对应的节点上。通过这些keytab文件,节点可以从KDC上获得与目标节点通信的密钥,进而被目标节点所认证,提供相应的服务,防止了被冒充的可能性。
1.解决服务器到服务器的认证
由于 Kerberos对集群里所有的机器都分发了keytab,相互之间使用密钥进行通信,确保不会冒充服务器的情况。集群中的机器就是它们所宣称的,是可靠的。
防止了用户伪装成datanode和tasktracker,去接受JobTracker,Namenode的任务指派。
2.解决client到服务器的认证
Kerberos对可信的客户端提供认证,确保他们可以执行作业的相关操作。防止用户恶意冒充client提交作业的情况。
用户无法伪装成其他用户入侵到一个HDFS或者MapReduce集群上。
用户即使知道datanode的相关信息,也无法读取HDFS上的数据。
用户无法发送对于作业的操作到JobTracker上。
3.对用户级别上的认证并没有实现
无法控制用户提交作业的操作。不能够实现限制用户提交作业的权限。不能控制哪些用户可以提交该类型的作业,哪些用户不能提交该类型的作业,这是由ACL模块控制。
4.使用Kerberos进行验证的优势
可靠:hadoop本身并没有认证功能和创建用户功能,使用依靠外围的认证系统;
高效:Kerberos使用对称钥匙操作,比SSL的公共密钥快;
操作简单:用户可以方便进行操作,不需要很复杂的指令。
5.使用Kerberos进行验证的缺陷
kerberos生成证书和配置的步骤相当繁琐,首次配置是可以接受,但是对于用户权限的修改,机器的减容扩容,会造成证书要重新生成,再分发证书,重启hadoop。而且还要考虑kerberos的宕机导致整个集群无法服务的风险,加上kerberos的东西也比较复杂,出于这些考虑,kerberos很可能会导致hadoop集群运维的不便。
6 参考资料
1.什么是Kerberos:
https://zh.wikipedia.org/zh-cn/Kerberos
2.Kerberos相关书籍:
William Stallings,Network Security Essentials: Applications and Standards (Fourth edition)
Chapter4.2
3.对Kerberos的理解:
http://blog.csdn.net/dog250/article/details/5468942
4.Hadoop安全机制介绍:
http://ssv.sebug.net/Hadoop%E5%AE%89%E5%85%A8%E6%9C%BA%E5%88%B6%E4%BB%8B%E7%BB%8D
5.Kerberos在hadoop中的安全认证机制:
http://dongxicheng.org/mapreduce/hadoop-kerberos-introduction/
6.hadoop和kerberos的整合问题:
http://www.cnblogs.com/ggjucheng/archive/2012/12/10/2811223.html