同程旅游Hadoop安全实践

同程旅游Hadoop安全实践

0x01 背景

当前大一点的公司都采用了共享Hadoop集群的模式。

共享Hadoop是指:数据存储方面,公有/私有的文件目录混合存放在hdfs上,不同的用户根据需求访问不同的数据; 计算资源方面,管理员按部门或业务划分若干个队列,每个队列分配一定量的资源,每个用户/组只能使用某个队列中得资源。这种模式可以减小维护成本,避免数据过度冗余,减少硬件成本。但这种类似于云存储/云计算的方式,面临的一个最大问题就是安全。在同程,信息安全是渗透到每个部门的,数据安全又是重中之重。本文就Hadoop安全分享了同程旅游大数据架构部在这方面的实践。

然而,Hadoop是缺乏安全机制的。其中最关键的一个问题是,Client的用户名和用户组名的随意性。Hadoop默认从环境变量中取HADOOP_USER_NAME作为当前用户名,如果为空则从系统参数里取HADOOP_USER_NAME,如果还为空则获取当前系统用户名,添加到user.name和group.name属性中。用户甚至可以通过conf.set(“user.name”,root),conf.set(“group.name”,”root”)直接指定用户名和用户组为root。这样提交到集群的请求就可以以root的身份读写本不属于自己的文件目录,使用本属于别人的计算资源。

Hadoop团队也意识到了数据安全方面的缺失,并增加了权限认证授权机制。用户的login name会通过RPC头部传递给RPC,之后RPC使用Simple Authentication and Security Layer(SASL)确定一个权限协议(一般使用kerberos协议),完成RPC授权[2]。然而,在hadoop集群中启用kerberos认证有以下一些问题:

1. Kerberos生成证书和配置步骤十分复杂,debug排错也晦涩,没有一定经验很难上手; 2. 延展性不佳。机器的扩容和减少都要造成证书的重新生成和分发,给运维造成很大困难; 3. 存在单点失败,中心KDC中心服务器承载所有用户的密钥,挂掉时整个系统可能瘫痪。同时要求严格的时钟同步,不然会导致认证失败。

基于以上的原因,以及同程自身Hadoop集群的特性(总承载接近数十P的数据量,日增数十T ,上层依赖上百个平台/服务,数万+的数据搬运/运算任务),给Hadoop增加安全机制无疑是给高速运行的汽车换轮子,要求系统做到服务零中断,滚动升级无停机。我们自主研发了一个轻量级的Hadoop用户认证机制。

0x02 基本构想

身份验证最常见的方法就是用户名和密码校验,符合我们简单易用的要求。首先,我们要让用户在与Hadoop交互之前读取到一个配置好的,和用户自身相关联的密码,将此密码保存并携带在每次与Hadoop交互的请求中以供验证。另外,我们知道用户在对Hadoop做任何操作之前都会和namenode交互,拿到相关的block的信息,文件读写的租约等等。那很自然的想到可以在namenode 这层做用户身份验证操作。而用户名和密码的映射表可以通过配置和远程RPC 的形式实现热加载。

0x03 具体实施

用户加载密码

用户信息在Hadoop里是以UserGroupInformation这个类实现的。如果subject为空,或者对应的principal为空,说明尚未登录过,就会调用getLoginUser()方法。首先会创建LoginContext,并调用login()方法,完成后调用login.commit()。我们在commit()方法中加入读取密码配置的操作,并存储在subject的credential中。密码可以配置在用户的home目录下,或者classpath下。由于login方法只会在用户第一次启动的时候调用,所以避免了重复加载的问题。

Namenode加载用户名和密码的映射表

我们新增加了一个让namenode 读取集群用户名和密码的映射表的RPC服务。目前Hadoop大部分的 RPC 调用已经采用google的protobuf 协议,替代了1.0时代自己的一套writable的协议。

我们根据protobuf的规范,定义一个叫做RefreshCheckUserPaswordProtocol.proto的协议文件,在文件里我们分别定义RPC调用的请求和应答消息

message RefreshCheckUserPasswordRequestProto{} messageRefreshCheckUserPasswordResponseProto {} 内容为空,因为不需要传入参数再定义调用的服务 service RefreshCheckUserPasswordProtocolService { rpcrefreshCheckUserPassword() returns(RefreshCheckUserPasswordResponseProto); } 通过protobuf命令行工具生成对应的request,response,以及service 的java类 因为新增的协议是在namenode上执行的,所以要注册在namenodeProtocols里 extendsClientProtocol, DatanodeProtocol, NamenodeProtocol, RefreshAuthorizationPolicyProtocol, RefreshUserMappingsProtocol, RefreshCallQueueProtocol, GenericRefreshProtocol, GetUserMappingsProtocol, HAServiceProtocol, RefreshCheckUserPasswordProtocol{} 并且在namenodeProtocols的实现类NameNodeRpcServer里增加具体函数调用 RefreshCheckUserPasswordProtocolServerSideTranslatorPB refreshCheckUserPasswordXlator (); BlockingService RefreshCheckUserPasswordProtocolService .newReflectiveBlockingService(refreshCheckUserPasswordXlator); 在dfsadmin的shell命令行中增加了调用此服务的入口 (.(cmd)){ exitCoderefreshCheckUserPassword(); } () throwsIOException { Configuration getConf(); .set(CommonConfigurationKeys.HADOOP_SECURITY_SERVICE_USER_NAME_KEY, .get(DFSConfigKeys.DFS_NAMENODE_KERBEROS_PRINCIPAL_KEY, )); DistributedFileSystem getDFS(); URI .getUri(); HAUtil.isLogicalUri(, ); () { .getHost(); ListProxyAndInfoRefreshCheckUserPasswordProtocolHAUtil.getProxiesForAllNameNodesInNameservice(, , RefreshCheckUserPasswordProtocol.); (ProxyAndInfoRefreshCheckUserPasswordProtocol) { { .getProxy().refreshCheckUserPassword(); ..println(.getAddress()); }(e){ ..println(.getAddress()); ..println(e.getMessage()); } } } { RefreshCheckUserPasswordProtocolrefreshProtocol NameNodeProxies.createProxy(,FileSystem.getDefaultUri(), RefreshCheckUserPasswordProtocol.).getProxy(); refreshProtocol.refreshCheckUserPassword(); ..println(); } ; }

最后,我们在namenode启动(初始化完成)时自动加载一次用户名和密码的映射表。

具体位置在NameNode类的void initialize(Configuration conf) throws IOException方法的最后

Namenode 对client做身份验证

Namenode 接收到用户请求的时候都调用getRemoteUser()方法将用户的信息组装成UserGroupInformation实例。这时候我们就很自然的把请求发起者的用户名,密码以及源IP提取出来,做用户身份验证。用户验证的逻辑很简单,将用户名,密码,IP在启动时加载的映射表中查找对比,符合条件的予以通过,不然就拦截请求并抛出错误。

0x04 上线的一些工作

为了做到新增的用户安全功能平滑上线,我们做了下面几个额外的功能

用户验证的全局开关

防止新功能的可能出现的bug, 一键开关可以迅速关闭新功能,做到快速回滚。

用户白名单

用户群的数量很多,同一时间切换上线是不可能的。我们将用户放入白名单中,分批配置/测试分配的账号和密码,一步一个脚印的实现所有账号的安全监管

0x05 上线过程

1. 重新编译打包hadoop-common和hadoop-hdfs 工程

2. 替换namenode 和datanode 上的相应jar包,并滚动重启。因为默认是关闭安全功能的,所以新版本的jar包和旧版本的jar是相互兼容的。

3. 在各节点,各项目中配置和用户名和密码,通过命令将用户名和密码的映射表加载至namenode

4. 一键开启安全配置

目前,Hadoop安全已成功上线,升级过程中没有服务中断或降级,做到业务零感知。运行几个月下来也很平稳,性能良好。

时间: 2024-08-25 03:42:45

同程旅游Hadoop安全实践的相关文章

云智慧APM:助同程旅游“秒杀”IT运维重负

中介交易 SEO诊断 淘宝客 云主机 技术大厅 同程旅游是中国在线旅游OTA市场三大集团之一,交易规模超过百亿.对于在线旅游企业来说,如何吸引用户.留住用户.提高用户的满意度.保持市场竞争优势,这需要充分利用先进的信息技术提高自身参与竞争的能力.能赢得和留住用户的唯一方法就是提供最佳的信息和交易服务体验,快速.准确的满足用户需求. 一体化IT运维监控和性能管理 传统的运维模式是分散.粗放式的,而各种不同的应用和业务系统越来越复杂多变.很多时候,故障问题可能出现在开发.生产或是其它多个环节.由于多

分布式计算开源框架Hadoop入门实践(三)

Hadoop基本流程 计算开源框架Hadoop入门实践(三)-hadoop分布式计算框架"> 一个图片太大了,只好分割成为两部分.根据流程图来说一下具体一个任务执行的情况. 在分布式环境中客户端创建任务并提交. InputFormat做Map前的预处理,主要负责以下工作: 验证输入的格式是否符合JobConfig的输入定义,这个在实现Map和构建Conf的时候就会知道,不定义可以是Writable的任意子类. 将input的文件切分为逻辑上的输入InputSplit,其实这就是在上面提到的

同程旅游发布新版本,引入打车和租车服务

在7月29日下午,同程旅游宣布了发布最新的6.4版客户端,并且在软件客户端中引入了打车和租车服务,分别是由快的打车和易到用车提供. 同程旅游CMO马和平对此表示,"引进打车和租车服务是同程旅游基于移动端打造休闲旅游大交通服务体系的重要步骤,并且为了保证服务的专业性和可靠性,我们将会以开放平台的形式与国内最优秀的打车.租车应用展开合作". 而根据他的介绍,同程旅游在今年5月份的时候,发布的6.2.1版客户端时就引入了火车票预订服务,这是该公司在移动端布局休闲旅游大交通服务体系的开始.&q

同程网启用LY.com域名,改名为同程旅游

同程网曾在2011年以七位数的价格收购双拼域名tongcheng.com,而近期又以超过千万元人民币的价格购入LY.com.3月21日,同程网CEO吴志祥在上海宣布正式启用LY.com域名,同程网正式更名为同程旅游,公司的Logo组合也同步做出更新. 吴志祥表示,高度标准化的商旅预订在过去十几年间的高速成长是中国在线旅游第一阶段的主要特征,而未来十年,非标准化的休闲旅游的快速崛起将成为中国在线旅游第二阶段的主要特征.同程网决定全力以赴开拓中国休闲旅游市场,未来十年,同程网将会以景区门票和周边自助

携程旅游发布2013年“环游世界80天”旅游项目,“环游世界”线路价格翻倍涨让人看不懂

[新民网独家报道]3月12日,携程旅游发布2013年"环游世界80天"旅游项目,及首批推出的50条顶级旅游线路.在这50条旅游线路中,亚洲游最便宜的线路价格为5万5千元,有网甚至怀疑"携程挂错价格了",连业内人士也表示这样的价格"看不懂". "环游世界"线路价格翻倍涨 携程此次推出"顶级环游世界80天"报价为人民币101万元,名额为15人,3月26日12时在台北.香港.上海三地同时开售.携程方面称,行程包含

同程旅游入驻手机QQ“吃喝玩乐”增强优惠服务

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 同城旅游 [TechWeb报道]7月4日消息,手机QQ"吃喝玩乐"平台今日将正式接入同程旅游的产品服务,增强手机QQ在景点门票预订和优惠服务方面的业务. 目前,同程旅游拥有全国8000多家景点,20000余种门票,这些景点门票预订和优惠服务将全都接入手机QQ"吃喝玩乐"平台,QQ用户可以线上查询和3-7

携程旅游网周四早盘大跌超11%

摘要: 查看最新行情 携程旅游网周四早盘大跌超11% 1月9日晚间消息, 携程 旅游网(Nasdaq: CTRP )今日开盘大跌,最大跌幅超13%,截至北京时间23:15,携程股价跌5.02美元至39.49美元,跌幅达11.27%.  查看最新行情 携程旅游网周四早盘大跌超11% 1月9日晚间消息,携程旅游网(Nasdaq: CTRP )今日开盘大跌,最大跌幅超13%,截至北京时间23:15,携程股价跌5.02美元至39.49美元,跌幅达11.27%. 近几日携程股价持续下跌,相比近一个月最高点

秋赏红叶同程旅游推荐国内十个最美目的地

十一黄金周之后,全国各地将逐渐迎来一年中的赏秋时节.在线旅游网站同程旅游方面介绍,根据往年情况,接下来的一两个月,会有不少游客慕名能看红叶的地方游玩.由于气候因素,各地叶子变红的时间不同,天气冷得早的北方叶子红的早些,南方则稍晚些,不过时间基本集中在10月到11月期间.同程旅游现在就给大家推荐国内十个最美的能赏红叶的目的地,去感受那"一叶知秋"的美.目的地1.北京香山香山红叶,闻名中外,是"燕京八景"之一.每天秋天,漫山遍野都是观赏红叶的人群."香山红叶好

携程旅游特别推出节后错峰游

台北 11% ↑ 马来西亚 1% ↑ 三亚 -10% ↓ 日本 -1% ↓ 丽江 -12% ↓ 韩国 -13% ↓ 厦门 -32% ↓ 美国 -14% ↓ 澳门 -32% ↓ 泰国 -17% ↓ 香港 -35% ↓ 意大利 -18% ↓ 上海 -36% ↓ 马尔代夫 -34% ↓ 成都 -40% ↓ 新加坡 -35% ↓ 南京 -45% ↓ 柬埔寨 -38% ↓ 北京 -54% ↓ 印度尼西亚 -47% ↓ (1-25到1-31) 携程专家点评 春节黄金周结束,由于价格大幅下降,不少游客选择错峰