互联网历来就不是一个安全的地方。不少时候咱们过度依赖防火墙来解决安全的问题,不幸的是,防火墙是假设“坏人”是来自外部的,而真正具备破坏性的攻击事件都是每每都是来自于内部的。数据库
近几年,在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集群的可靠性、安全性。架构
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版本。函数
使用Kerberos时,一个客户端须要通过三个步骤来获取服务:工具
认证
: 客户端向认证服务器发送一条报文,获取一个包含时间戳的TGT。受权
: 客户端使用TGT向TGS请求指定Service的Ticket。服务请求
: 客户端向指定的Service出示服务Ticket鉴权通信。Kerberos协议在网络通讯协定中属于显示层。其通讯流程简单地说,用户先用共享密钥从某认证服务器获得一个身份证实。随后,用户使用这个身份证实与SS通讯,而不使用共享密钥。oop
①此流程使用了对称加密; ②此流程发生在某一个Kerberos领域中; ③小写字母c,d,e,g是客户端发出的消息,大写字母A,B,E,F,H是各个服务器发回的消息。
首先,用户使用客户端上的程序进行登陆:
客户端(Client)从认证服务器(AS)获取票据的票据(TGT)。
Client从TGS获取票据(client-to-server ticket)。
Client从SS获取服务。
Kerberos支持两种服务器在域内冗余方式:Master/Slave
(MIT和Heimdal)和Multimaster
结构(Windows Active Directory)。在生产环境中部署Kerberos时,最好使用一主(Master)多从(Slave)的架构,以确保Kerberos服务的高可用性。
Kerberos中每一个KDC都包含数据库的副本。主KDC包含域(Realm)数据库的可写副本,它以固定的时间间隔复制到从KDC中。全部数据库更改(例如密码更改)都在主KDC上进行,当主KDC不可用时,从KDC提供Kerberos票据给服务受权,但不提供数据库管理。KDC须要一个Admin来进行平常的管理操做。
Kerberos的同步机制只复制主数据库的内容,但不传递配置文件,如下文件必须手动复制到每一个Slave中:
- krb5.conf - kdc.conf - kadm5.acl - master key stash file
目前单机房HA方案使用的较多的是Keepalived + Rsync 。Keepalived能够将多个无状态的单点经过虚拟IP(如下称为VIP)漂移的方式搭建成一个高可用服务。
首先,在Master KDC中建立数据库的dump文件(将当前的Kerberos和KADM5数据库转储为ASCII文件):
kdb5_util dump [-b7|-ov|-r13] [-verbose] [-mkey_convert] [-new_mkey_file mkey_file] [-rev] [-recurse] [filename [principals...]]
而后使用Rsync将目录同步到Slave机器的对应目录中,
再导入KDC中:
kdb5_util load [-b7|-ov|-r13] [-hash] [-verbose] [-update] filename [dbname]
Hadoop全部请求经过请求内网域名,解析到Keepalived绑定的VIP的方式来使用KDC:
若是团队中已经有一套权限系统,要将现有的身份系统集成到Kerberos中会很困难。
随着业务的飞速增加,服务器规模愈来愈大,Kerberos Principal手动操做会愈来愈频繁,手动的增删改查维护会很是痛苦。须要在Kerberos管理系统中规范Principal申请、维护、删除、keytab生成流程。Principal申请和权限管理自动化。
Kerberos数据同步能够将生成的数据记录同步写入到MySQL中,使用MySQL双主同步方式。在跨机房环境中,KDC数据使用Rsync工具进行增量同步。以A核心机房做为主机房,Rsync Server使用了Keepalived VIP的方式,当Kerberos主机宕机后,VIP漂移到另一台主机器上,Rsync Client会以VIP所在的KDC主机器为Rsync Server进行数据同步,以保证KDC数据同步的高可用性。
使用进程管理工具对Kerberos相关进程进行存活监控,当发现有进程异常退出时,邮件/微信/钉钉报警,主动再次拉起进程。
部署过Kerberos的同窗都知道,在Hadoop集群部署Kerberos实际是一项很是繁琐的工做。Kerberos本质上是一种协议或安全通道,对于大多数用户或普通用户来讲,是有必定学习曲线的,是否有更好的实现可以对普通用户隐藏这些繁琐的细节。
阿里和Intel合做项目Hadoop Authentication Service (HAS) 据称目前已经应用到ApsaraDB for HBase2.0中:
HAS方案使用Kerby替代MIT Kerberos服务,利用HAS插件式验证方式创建一套人们习惯的帐户密码体系。
目前HAS在Apache Kerby项目has-project
分支开发中,将来会做为Kerbby的新feature出如今下一次release中。
Apache Kerby做为Apache Directory的一个子项目,目前关注度并不高,让咱们期待它在后续的发展吧。