互联网从来就不是一个安全的地方。很多时候我们过分依赖防火墙来解决安全的问题,不幸的是,防火墙是假设“坏人”是来自外部的,而真正具有破坏性的攻击事件都是往往都是来自于内部的。
近几年,在thehackernews等上总会时不时看到可以看到一些因为数据安全问题被大面积攻击勒索的事件。在Hadoop1.0.0之前,Hadoop并不提供对安全的支持,默认集群内所有角色都是可靠的。用户访问时不需要进行任何验证,导致恶意用户很容易就可以伪装进入集群进行破坏。
要保证Hadoop集群的安全,至少要做到2个A:Authentication(认证),Authorization(授权)。常见的方案有:
Authentication:
MIT Kerberos, Azure AD, Kerby
Authorization:
Apache Sentry(Cloudera), Apache Ranger(Hortonworks)
2012年1.0.0版本正式发布后,Hadoop增加了对Kerberos的支持。使得集群中的节点是可信任的。Kerberos可以将认证的密钥在集群部署时事先放到可靠的节点上。集群运行时,集群内的节点使用密钥得到认证,认证通过后的节点才能提供服务。企图冒充的节点由于没有事先得到的密钥信息,无法与集群内部的节点通信。这样就防止了恶意地使用或篡改Hadoop集群的问题,确保了Hadoop集群的可靠性、安全性。
2.Kerberos介绍Kerberos是种网络身份验证协议,最初设计是用来保护雅典娜工程的网络服务器。Kerberos这个名字源于希腊神话,是一只三头犬的名字,它旨在通过使用密钥加密技术为Client/Server序提供强身份验证。可以用于防止窃听、防止重放攻击、保护数据完整性等场合,是一种应用对称密钥体制进行密钥管理的系统。Kerberos的扩展产品也使用公开密钥加密方法进行认证。
Kerberos目前最新版本是5,1~3版本只在MIT内部发行,因为使用DES加密,早期被美国出口管制局列为军需品禁止出口,直到瑞典皇家工学院实现了Kerberos版本4,KTH-KRB。后续也是这个团队实现了版本5: Heimdal,目前常见的Kerberos5实现之一。
本文中讨论的Kerberos5实现版本为MIT Kerberos,MIT保持的大约半年左右一次的更新速度,目前最新版本是2018-11-01发布的1.16.2版本。
AS(Authentication Server):认证服务器
KDC(Key Distribution Center):密钥分发中心
TGT(Ticket Granting Ticket):票据授权票据,票据的票据
TGS(Ticket Granting Server):票据授权服务器
SS(Service Server):特定服务提供端
Principal:被认证的个体
Ticket:票据,客户端用来证明身份真实性。包含:用户名,IP,时间戳,有效期,会话秘钥。
使用Kerberos时,一个客户端需要经过三个步骤来获取服务:
认证: 客户端向认证服务器发送一条报文,获取一个包含时间戳的TGT。
授权: 客户端使用TGT向TGS请求指定Service的Ticket。
服务请求: 客户端向指定的Service出示服务Ticket鉴权通讯。
Kerberos协议在网络通信协定中属于显示层。其通信流程简单地说,用户先用共享密钥从某认证服务器得到一个身份证明。随后,用户使用这个身份证明与SS通信,而不使用共享密钥。
2.2 具体通信流程①此流程使用了对称加密; ②此流程发生在某一个Kerberos领域中; ③小写字母c,d,e,g是客户端发出的消息,大写字母A,B,E,F,H是各个服务器发回的消息。
首先,用户使用客户端上的程序进行登录:
输入用户ID和密码到客户端(或使用keytab登录)。
客户端程序运行一个单向函数(大多数为Hash)把密码转换成密钥,这个就是客户端的“用户密钥”(user's secret key)。
2.2.1 客户端认证(Kinit)客户端(Client)从认证服务器(AS)获取票据的票据(TGT)。
Client向AS发送1条明文消息,申请基于该用户所应享有的服务,例如“用户Sunny想请求服务”(Sunny是用户ID)。(注意:用户不向AS发送“用户密钥”(user's secret key),也不发送密码)该AS能够从本地数据库中查询到该申请用户的密码,并通过相同途径转换成相同的“用户密钥”(user's secret key)。
AS检查该用户ID是否在于本地数据库中,如果用户存在则返回2条消息:
【消息A】:Client/TGS会话密钥(Client/TGS Session Key)(该Session Key用在将来Client与TGS的通信(会话)上),通过 用户密钥(user's secret key) 进行加密