53

HADOOP安全基础篇

 5 years ago
source link: https://www.freebuf.com/articles/database/190734.html?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

说起hadoop这个单词,在大数据领域可谓是十分知名。由于工作的需求,最近对hadoop整体架构和安全进行了一些了解,一些浅薄的理解分享给大家。(全文均以hadoop 2.0版本框架进行介绍)

一、hadoop简介

Google一下就能都出来的一堆官方介绍这里就不赘述了。简而言之,hadoop是Apache旗下的一个用java语言实现实现的开源软件框架,允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理。业界对hadoop的理解总体分狭义与广义两大类:

1.狭义理解

hadoop整体框架与核心组件如下图所示:

yEzARzZ.jpg!web HDFS(分布式文件系统):解决海量数据存储;

YARN(作业调度和集群资源管理的框架):解决资源任务调度;

MAPREDUCE(分布式运算编程框架):解决海量数据计算;

OTHERS(其他数据处理框架):例如熟悉的storm、spark、flink等。

2.广义理解

hadoop生态圈,分类举几个常见的例子:

分类 产品 文件系统 HDFS、S3 资源调度 YARN、Mesos 计算框架 mapreduce、spark、flink、storm 数据库 Hbase、Redis SQL支持 spark SQL、Phoenix、Hive、impala、pig 其他 zookeeper、kafka、flume、sqoop

二、hadoop核心组件

1.HDFS

基本概念:

JJvI3mB.jpg!web

工作机制:

B3aIV3Z.jpg!web

2.MAPREDUCE 2.0(运行在YARN上的mapreduce)

基本概念:

MrMzieB.jpg!webJR7VRfn.jpg!web

工作流程:

zaqy2um.jpg!web

图中1-8流程可以浓缩为如下几个步骤:

Client将应用程序提交给ResourceManager;

ResourceMananager申请资源并与Nodemanager通信;

Nodemanager收到请求启动MR AppMaster;

MR AppMaster(MapTask、ReduceTask)与ResourceManager通信并申请资源;

MR AppMaster申请到资源与NodeManager通信运行Task;

NodeManager启动Task。

三、hadoop安全核心问题

基于上面科普的hadoop基础和官方的文档,可以总结出来如下5点核心问题:

1.安全认证

任何用户都可以伪装成为其他合法用户,访问其在HDFS上的数据,获取MapReduce产生的结果,从而存在恶意攻击者假冒身份,篡改HDFS上他人的数据,提交恶意作业破坏系统、修改节点服务器的状态等隐患。

2.权限控制

用户只要得知数据块的 Block ID 后,可以不经过 NameNode 的身份认证和服务授权,直接访问相应 DataNode,读取 DataNode 节点上的数据或者将文件写入 DataNode 节点。

3.关键行为审计

默认hadoop缺乏审计机制。

4.静态加密

默认情况下Hadoop 在对集群HDFS 系统上的文件没有存储保护,所有数据均是明文存储在HDFS中,超级管理员可以不经过用户允许直接查看和修改用户在云端保存的文件,这就很容易造成数据泄露。

5.动态加密

默认情况下Hadoop集群各节点之间,客户端与服务器之间数据明文传输,使得用户隐私数据、系统敏感信息极易在传输的过程被窃取。

四、hadoop安全机制

1.Kerberos认证

kerberos协议是一种计算机网络授权协议,用于在非安全的网络环境下对个人通信进行加密认证。Kerberos协议认证过程的实现不依赖于主机操作系统的认证,不需要基于主机地址的信任,不要求网络上所有主机的物理安全,并且是以假定网络上传送的数据包可以被任意的读取、修改和插入数据为前提设计的。

简而言之,如果你要去请求服务,你要获取2个票据,1个叫许可票据,1个叫服务票据,去服务器请求服务之前,你必须拥有服务票据,但是你要去请求服务票据的时候,你又必须携带许可票据,拿到了这2个票据,你才能够有资格去真实服务器上去请求服务。下面以一个简图解释一下上面所说的认证服务流程:

RFBFnqJ.jpg!web

通信细节图如下:

第一次通信:

qYvYJbM.jpg!web

第二次通信:

Ibq2uy3.jpg!web

第三次通信:

uUFRNnb.jpg!web

如果还不好理解,可以类比学习一下:

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

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

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

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

当然如果用户玩完摩天轮后,想去游乐园的过山车玩耍一下,那用户一样只要带着那张门卡 (TGT). 到过山车的票据授权机 (TGS) 刷一下,得到过山车的票据 (ST) 就可以进入过山车进行玩耍。

当用户离开游乐场后,用户的 TGT 就已经过期并且销毁。

2.基于Token的认证机制

任何分布式系统内,以用户名义执行的所有行为都有必要验证该用户身份,并且仅仅验证服务的归属者是不够的,验证必须发生在每一次交互中。举一个简单的例子:运行一个mapreduce作业,工作被分解为多个子任务,每个任务必须与HDFS的namenode通信。为了加强文件系统的许可控制,每个任务必须通过namenode的身份验证。如果Kerberos是唯一的身份验证机制,用户的TGT需要分派给每一个任务,这样显然带来了另外一个问题:允许该任务向任意一个受Kerberos保护的服务发起身份验证请求。hadoop解决这个问题的方法是:签发能分派给每个任务,但被限制在某个特定服务内的认证令牌。

hadoop中的令牌分三类:委托令牌、块访问令牌和作业令牌。

YZJVRjb.jpg!web

相比于单纯使用Kerberos,基于令牌的安全认证机制有很多优势,具体如下:

性能: 在Hadoop集群中,同一时刻可能有成千上万的任务正在运行。如果我们使用Kerberos进行服务认证,则所有任务均需要KDC中AS提供的TGT,这可能使得KDC成为一个性能瓶颈,而采用令牌机制则可避免该问题。

凭证更新: 在Kerberos中,为了保证TGT或者服务票据的安全,通常为它们设置一个有效期,一旦它们到期,会对其进行更新。如果直接采用Kerberos验证,则需要将更新之后的TGT或者服务票据快速推送给各个Task,这必将带来实现上的烦琐。如果采用令牌,当令牌到期时,只需延长它的有效期而不必重新生成令牌。此外,Hadoop允许令牌在过期一段时间后仍可用,从而为过期令牌更新留下足够时间。

安全性: 用户从Kerberos端获取TGT后,可凭借该TGT访问多个Hadoop服务,因此,泄露TGT造成的危害远比泄露令牌大。

灵活性: 在Hadoop中,令牌与Kerberos之间没有任何依赖关系,Kerberos仅仅是进行用户身份验证的第一道防线,用户完全可以采用其他安全认证机制替换Kerberos。因此,基于令牌的安全机制具有更好的灵活性和扩展性。

3.关键行为日志审计

mQrueqI.jpg!web

Apache一些开源的安全解决方案(会在第五章节详细展开):

Apache Falcon: Apache Falcon是一个开源的hadoop数据生命周期管理框架, 它提供了数据源 (Feed) 的管理服务,如生命周期管理,备份,存档到云等,通过Web UI可以很容易地配置这些预定义的策略, 能够大大简化hadoop集群的数据流管理。

Apache Atlas: 是一个可伸缩和可扩展的元数据管理工具与大数据治理服务,它为Hadoop集群提供了包括数据分类、集中策略引擎、数据血缘、安全和生命周期管理在内的元数据治理核心能力。

Apache Ranger: Ranger是一个集中式安全管理框架,提供集中管理的安全策略和监控用户访问,而且它可以对hadoop生态系统上的组件如hive、hbase等进行细粒度的数据访问控制,并解决授权和审计问题。

Apache Sentry: 提供了细粒度级、基于角色的授权以及多租户的管理模式。(与Ranger功能类似,区别:ranger PBAC;sentry RBAC)

Apache Eagle: 一个开源的分布式实时安全监控方案。通过离线训练模型集合实时流引擎监控,能立即监测出对敏感数据的访问或恶意的操作,并立即采取应对的措施。

……

4.静态数据加密

从Hadoop2.6开始,HDFS支持原生静态加密,属于应用层加密。该方法中,数据被发送和到达存储位置之前,在应用层被加密。这种方法运行在操作系统层之上。

以下需要给读者明确几个概念:

HDFS中,需要加密的目录被分解成若干加密区(encryption zone);

加密区中的每个文件都被使用唯一的数据加密密钥(data encryprion key,DEK)进行加密;

明文DEK不是永久的,而是用一个名为加密区密钥(encryption zone key,EZK)的区域级加密密钥,将DEK加密成加密DEK(encrypted DEK,EDEK);

EDEK作为指定文件NameNode元数据中的扩展属性永久存在。

下面用两张图解释一下,当一个HDFS客户端向HDFS加密区写入一个新文件和读取加密文件时的整个工作流程:

(1)写

iArAr2b.jpg!web

(2)读

QBbqYjA.jpg!web

5.动态数据加密

FRJFbeV.jpg!web

(1)Hadoop RPC加密

Hadoop的RPC实现支持SASL,SASL除了支持身份认证外,还提供了可选的信息完整性和信息加密。 SASL(Simple Authentication and Security Layer)是网络协议中使用的认证层。SASL并不是一种协议,而是一种认证、数据完整性校验和加密的机制的框架。plain和digest-md5(较常用)。

1) plain(较常用)

plain是最简单的机制,但同时也是最危险的机制,因为身份证书(登录名称与密码)是以base64字符串格式通过网络,没有任何加密保护措施。因此,使用plain机制时,可能会想要结合TLS。

2) digest-md5(较常用)

使用这种机制时,client与server共享同一个隐性密码,而且此密码不通过网络传输。验证过程是从服务器先提出challenge(质询)开始, 客户端使用此challenge与隐性密码计算出一个response(应答)。不同的challenge,不可能计算出相同的response;任何拥 有secret password的一方,都可以用相同的challenge算出相同的response。因此,服务器只要比较客户端返回的response是否与自己算 出的response相同,就可以知道客户端所拥有的密码是否正确。由于真正的密码并没有通过网络,所以不怕网络监测。

对了让大家更好的理解,以下科普下RPC框架,RPC基本流程图如下所示:

nA3IRbr.jpg!web

一次完整的RPC调用流程(同步调用,异步另说)如下:

1)服务消费方(client)调用以本地调用方式调用服务;

2)client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;

3)client stub找到服务地址,并将消息发送到服务端;

4)server stub收到消息后进行解码;

5)server stub根据解码结果调用本地的服务;

6)本地服务执行并将结果返回给server stub;

7)server stub将返回结果打包成消息并发送至消费方;

8)client stub接收到消息,并进行解码;

9)服务消费方得到最终结果。

RPC框架的目标就是要2~8这些步骤都封装起来,让用户对这些细节透明。

(2)HDFS数据传输协议加密

HDFS数据从一个DataNode传输到另一个DataNode时,或者在DataNode和客户端之间传输时,会使用一个名为HDFS数据传输协议的TCP/IP直连套接字。数据传输加密启用时,会使用Hadoop RPC协议交换数据传输协议中使用的加密密钥。

(3)HTTPS

Https涉及到的主体:

客户端。通常是浏览器(Chrome、IE、FireFox等);

服务端。一般指支持Https的网站;

CA(Certificate Authorities)机构,Https证书签发和管理机构。

Https工作流程基本分为三个阶段:

1)认证服务器

浏览器内置一个受信任的CA机构列表,并保存了这些CA机构的证书。第一阶段服务器会提供经CA机构认证颁发的服务器证书,如果认证该服务器证书的CA机构,存在于浏览器的受信任CA机构列表中,并且服务器证书中的信息与当前正在访问的网站(域名等)一致,那么浏览器就认为服务端是可信的,并从服务器证书中取得服务器公钥,用于后续流程。否则,浏览器将提示用户,根据用户的选择,决定是否继续。当然,我们可以管理这个受信任CA机构列表,添加我们想要信任的CA机构,或者移除我们不信任的CA机构。

2)协商会话密钥

客户端在认证完服务器,获得服务器的公钥之后,利用该公钥与服务器进行加密通信,协商出两个会话密钥,分别是用于加密客户端往服务端发送数据的客户端会话密钥,用于加密服务端往客户端发送数据的服务端会话密钥。在已有服务器公钥,可以加密通讯的前提下,还要协商两个对称密钥的原因,是因为非对称加密相对复杂度更高,在数据传输过程中,使用对称加密,可以节省计算资源。另外,会话密钥是随机生成,每次协商都会有不一样的结果,所以安全性也比较高。

3)加密通讯

此时客户端服务器双方都有了本次通讯的会话密钥,之后传输的所有Http数据,都通过会话密钥加密。这样网路上的其它用户,将很难窃取和篡改客户端和服务端之间传输的数据,从而保证了数据的私密性和完整性。

五、数据相关Apache开源解决方案

1.Apache Falcon

Falcon是一个开源的hadoop数据生命周期管理框架, 它提供了数据源 (Feed) 的管理服务,如生命周期管理,备份,存档到云等,通过Web UI可以很容易地配置这些预定义的策略, 能够大大简化hadoop集群的数据流管理。

整体框架:

vQfIZzz.jpg!web

核心特性:

集中式数据生命周期管理: Falcon在UI上提供wizard来定义数据导入,处理和导出的流水线, 同时可以管理监控流水线的运行;

业务一致性和灾难恢复: Falcon可以拷贝HDFS文件和hive表;

解决审计和合规性方面的需求: 可以利用falcon查看数据流水线的血缘关系,审计日志,以及为业务流程和数据打标签,方便业务管理。

简而言之,Falcon是在调度器Oozie上封装了一层,用户可以用Web UI上的向导来配置数据流水线, 数据生命周期管理非常方便.,它最大的优点就是增强了Oozie的易用性, 对于业务逻辑比较复杂的系统, 用Falcon管理比起直接用Oozie会大大简化。但是问题来了,Oozie到底是什么?下面一张简图来解答一下大家的疑问。以一个离线分析任务为切入点:

bueE7rm.jpg!web

2.Apache Atlas

Atlas是一个可伸缩和可扩展的元数据管理工具与大数据治理服务,它为Hadoop集群提供了包括数据分类、集中策略引擎、数据血缘、安全和生命周期管理在内的元数据治理核心能力。

quENNfz.jpg!web

下面以思维导图的形式分层逐一介绍一下:

uQneeeV.jpg!web

3.Apache Ranger

Ranger是一个集中式安全管理框架,提供集中管理的安全策略和监控用户访问,而且它可以对hadoop生态系统上的组件如hive、hbase等进行细粒度的数据访问控制,并解决授权和审计问题。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问HDFS文件夹、HDFS文件、数据库、表、字段权限。

Ranger 使用了一种基于属性的方法定义和强制实施安全策略。当与 Apache Hadoop 的数据治理解决方案和元数据仓储组件Apache Atlas一起使用时,它可以定义一种基于标签的安全服务,通过使用标签对文件和数据资产进行分类,并控制用户和用户组对一系列标签的访问。

Ranger 的总体架构如下图所示,主要由以下三个组件构成:

AdminServer: 以RESTFUL形式提供策略的增删改查接口,同时内置一个Web管理页面;
AgentPlugin: 嵌入到各系统执行流程中,定期从AdminServer拉取策略,根据策略执行访问决策树,并且定期记录访问审计。插件的实现原理将在后文详细介绍;
UserSync: 定期从LDAP/File中加载用户,上报给AdminServer。

整个过程如下:

maMjEre.jpg!web

4.Apache Eagle

Eagle是eBay开源的一个分布式实时安全监控方案。通过离线训练模型集合实时流引擎监控,能立即监测出对敏感数据的访问或恶意的操作,并立即采取应对的措施。下图是Eagle的架构。

QBFfqqV.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK