Hadoop安全篇之Kerberos实战案例

                   Hadoop安全篇之Kerberos实战案例

                                   作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

 

  由于几乎每天都在发生信用卡数据,社会保障号,医疗信息和其他个人数据等关键数据的泄露问题,企业对保护数据非常关心。 

 

一.Hadoop安全概述

  众所周知的Apache Hadoop,是一个开放源代码软件平台,用于大容量数据的可扩展和分布式计算。该项目包括了很多独立开发的模块,这样能够非常方便地为核心模块添加各种功能。安全模块是一个相对青涩的模块,而且Hadoop缺乏一致的安全模式。在默认情况下,假定Hadoop处于可信任的环境中,随着Hadoop的成熟,公司逐渐开始关心他们存储在基于Hadoop的环境中越来越多的铭感业务数据的安全性。

  与常规数据库不同,在Hadoop中没有中央认真服务器或认证机制。如果用户可以访问运行NameNode的服务器,并且具有Hadoop二进制可执行文件的适当权限,则可能会读取到他们未被授权访问的数据,甚至删除该数据。在Hadoop中没有基于角色的访问控制(RBAC),对象级或其他粒度认证功能。

  由于数据存储在多个DataNodes中,因此每个DataNode都是攻击者的潜在入口点,所以必须保存集群中的所有节点。为了加密在Hadoop客户端和DataNodes之间传输的数据,必须使用Kerberos或Sample认证和安全层(SASL)框架。DataNode和NameNode之间的通信也需要保护。

  加密是保护铭感数据的基本要求。如果未加密静态和传输中的数据,则意味着攻击者可以拦截节点间通信,并且考科一访问存储在磁盘上的私密信息。

  Hadoop安全包括三个主要概念:验证,授权和审计。

1>.认证

  身份验证是一个服务器或应用程序能够通过其准确地知道谁在访问服务器或应用程序的过程。认证的难点在于访问系统的用户提供他们的身份。在Linux系统中,当你登录时,系统将你的用户/密码凭据与"/etc/passwd"文件中的凭据进行比较。如果验证成功,则认为你通过了身份验证。

  kerberos是当下IT环境中最流行的安全模式。kerberos是一种开源的网络身份验证协议,其允许集群节点相互访问身份。kerberos是纯认证协议,因此它不管文件和目录权限。

  如果实现了Kerberos,那么希望访问集群的用户首先会来联系中央Kerberos服务器(名为密钥分发中心,KDC),该服务器上有凭据数据库。如果用户提供的凭据正常,则KDC授予对Hadoop集群的访问权限。总而言之,Kerberos进行身份验证有以下三个步骤:
    (1)认证服务器授权客户端要求访问Hadoop集群的授权票据(TGT);
    (2)客户端使用他们的凭据解密TGT,并使用TGT从票证授予服务器(TGS)获取服务票证(TGS授予Hadoop集群的访问权限);
    (3)客户端使用TGS授权的服务票据来访问Hadoop集群;

  温馨提示:
    kerberos协议通过客户端,授权服务器和授予服务器之间的一系列协商实现。

2>.授权

  授权是系统确定用户是否具有使用资源或访问特定数据的必要权限的过程。授权通常需要用户成功认证。根据授权类型的不同,在某些情况下可能需要密码,但在其他情况下可能不需要。

  Hadoop授权非常复杂。由于Hadoop将数据存储在像Linux系统这样的文件系统中,而不是关系型数据库那样的表中,所以不能通过授予用户对数据的部分访问权限来限制用户。在Hadoop中没有中央授权系统来帮助你授予对数据文件的部分访问权限,以限制数据访问,但是可以使用Apache Sentry进行此操作。

  Apache Sentry和Apache Ranger等服务使我们能够通过Hive等数据库以及授权机制在Hadoop中配置部分授权。Sentry允许创建在指定表上可能的操作规则,也可以创建角色,这些角色是一组规则。使用Sentry,可以将部分文件数据指定为Hive表,而且Sentry可以帮助我们配置细粒度权限。

  使用Hadoop的ACL功能可以为特定用户指定细粒度的读写权限,而无需更改用于所有的文件权限。

3>.审计

  审计是安全的第三个概念。因为授权用户也可能执行(或尝试执行)未经授权的操作,所以需要以某种方式跟踪用户活动。

  Hadoop的审核日志机制可帮助我们跟踪系统中的特定用户操作。有趣的是,如果希望使用Hive等工具来来处理大量的Hadoop审核日志,则可以将其存储在HDFS中。通过HDFS审核日志可跟踪所有的HDFS访问活动,通过YARN审核日志可审核提交活动。

 

二.kerberos组件概述

  如下图所示,Kerberos使用中央服务器。中英服务器的故障会导致所有人无法访问集群,因此需要设置多个中央服务器,以实现高可用性。密码是高度安全的,因为kerberos将其保存在中央服务器上,不会发生任何汽提塔地方复制密码信息的事情。

  一旦用户登录到Kerberos(也称为Kerberized集群)认证系统,该用户可以继续访问所有授权的服务,而不必在该回话期间再次进行身份验证。这一点类似于我们熟悉的单点登录概念。

  Kerberos使用一组特定的术语。想要了解Kerberos认证如何工作,掌握这些术语的含义非常重要。它还使用几个独特的管理实体来确保安全。了解这些实体对于配置和管理基于Kerberos的安全性至关重要。接下来我们简要介绍Kerberos主要的术语和管理实体。

 

1>.为什么需要kerberos

  Hadoop集群默认采用基于操作系统账号的Simple认证,基本没有安全性保证,用户只需在客户端的操作系统上建立一个同名账号,即可伪装成任何用户访问集群。

  综上所述,Hadoop急需一套安全认证系统,而目前在大数据领域主流的安全认证模块就是kerberos。

2>.什么是kerberos

  Kerberos是一个网络认证的框架协议,它的命名灵感来自于希腊神话中一只三头犬守护兽,寓意其拥有强大的保护能力。

  Kerberos由麻省理工学院创建,作为解决这些网络安全问题的解决方案。Kerberos协议使用强加密技术,以便客户端可以通过不安全的网络连接向服务器(反之亦然)证明其身份。

  在客户端和服务器使用Kerberos证明其身份后,他们还可以加密所有通信,以确保在业务开展时的隐私和数据完整性。

  在安全领域,Kerberos以其强大的身份认证机制获得了声誉,同时也由于其明显的复杂性让许多管理员害怕。但身为一名合格的大数据运维工程师,kerberos基本上已成为必备技能之一。

  官方地址:
    https://web.mit.edu/kerberos/

3>.密钥分发中心(Key Distribution Centor,简称"KDC")

  KDC是包含加密数据库的Kerberos服务器,存储与用户,主机和服务相关的所有主体信息,包括它们的领域信息。

  除了以文件形式存储的数据库之外,KDC还包含两个重要的组件,即认证服务(Authentication Sever,简称"AS")和Ticket Granting Server(简称"TGS")。

  AS和TGS一起处理受Kerberos保护的Hadoop集群的所有认证和访问请求。

4>.认证服务(AS)

  一旦用户成功地向AS进行了身份验证,则AS向安全集群中的其他服务认证的客户端授予Ticket Granting Ticket(简称"TGT")。这些票据(Ticket)是用于客户端向服务器进行身份验证,有一定时效的加密消息。然后,主体使用TGT来请求认证和访问Hadoop服务。

5>.票证授予服务器(TGS)

  票据验证服务器(TGS)验证客户端传递的TGT,然后给客户端服务授予票据(Ticket),以便它们可以访问Hadoop集群。服务票据(Ticket)使验证后的主体能够使用集群中的服务。

6>.Active Directory域(Relam)

  域是认证用户的基本管理域,用于建立管理服务器对用户,主机和服务进行身份验证的边界。每个hadoop用户被分配到一个特定的郁。通常用大写字母指定一个域,例如YINZHENGJIE.COM。可以有多个KDC,因此在单个网络中可以有多个域。

7>.主体(Principal)

  主体(Principal)用于验证一个用户或者一个Service的唯一标识,相当于一个账号,需要为其设置密码。主体(Principal)是指定域的一部分用户,宿主或服务。用户主体和服务主体它通常是比较常见的。

  UNP表示普通用户(例如:"jason@YINZHENGJIE.COM"或"jason/admin@YINZHENGJIE.COM"),SPN是运行Hadoop服务后台进程所必须的登录名(例如:"yarn/hadoop101.yinzhengjie.com@YINZHENGJIE.COM"),包括HDFS和YARN等Hadoop服务。

8>.票据(Ticket)

  当用户想要对Kerberos支持的集群进行身份验证时,管理服务生成票据。该票据包含用户名(通常与用户主体相同),服务主体,客户端的IP地址和时间戳等信息。票据具有一个可配置的最长生命周期和一个会话密钥。用户还可以在特定时间内对票据续期。

9>.keytab文件

  keytab文件是一个安全文件,其中包含领域所有服务主体的密码。每个Hadoop服务都要求在所有主机上放置一个keytab文件。当kerberos需要更新服务TGT时,它会查找keytab文件。

10>.其他相关术语

  Kerberos KDC Server:
    KDC所在的服务器,即KDC服务的提供者。存储与用户,主机和服务相关的所有主体信息,包括它们的领域信息。

  Kerberos Client:
    任何一个需要通过KDC认证的机器(或模块)。比如客户端,需要做Kerberos 认证的机器。

  KDC Admin Account:
    KDC中拥有管理权限的用户(例如添加,修改,删除Principal)。即KDC管理员帐户,有权添加其他Principal 

 

三.kerberos认证过程

  Kerberos认证过程非常简单,涉及三个关键步骤:客户端登录到从AS获取TGT的集群,TGS授权服务票据,用户得到服务的认证。

  为了说明认证过程,我们使用以下组件:
    域:
      YINZHENGJIE.COM
    用户主体:
      jason@YINZHENGJIE.COM
    服务主体:
      hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM
    KDC:
      kdc.yinzhengjie.com

  名为jason的用户,具有jason@YINZHENGJIE.COM的UPN,其会按照以下过程对Kerberized Hadoop集群进行身份验证,并访问hdfs服务。
    (1)当用户登录到集群时,使用UPN(例如"jason@YINZHENGJIE.COM")与kdc.yinzhengjie.com联系;
    (2)认证服务器(AS)向用户授权TGT,TGT是用户可以自己认证的令牌。TGT使用与用户jason密码相同的密钥进行加密。对于服务主体,将存储在主机上的keytab文件中的凭证传递给认证服务器;
    (3)用户使用主体jason@YINZHENGJIE.COM的密码解密TGT。在我们的示例中,用户jason将TGT提供给kdc.yinzhengjie.com的TGS,以请求hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM服务。有了此服务票据客户端能够访问安全集群。客户端继续使用相同的TGT对TGS进行多次请求,直到TGT到期;
    (4)TGS验证了用户sam提交的TGT后,它将他提供使用hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM的UPN密钥加密的服务票据;
    (5)用户jason接受到服务票据后,对安全集群中的特定服务进行身份验证。一旦用户jason向hdfs服务提供了服务票据,则该服务会使用UPN(hdfs/hadoop101.yinzhengjie.com/YINZHENGJIE.COM)的密钥进行解密以验证服务票据;
    (6)现在jason成功通过认证,hdfs服务运行用户jason使用该服务。

 

四.Kerberos互信概述

  在现实生活中,一个企业可能会使用多个域来分离企业的不同部分,或由于其他原因使用多个域。这些域中的每一个域都拥有自己的KDC,每个KDC都认识属于自己域的主体。

1>.一个特殊的主体(Principal

  每个kerberos数据库中都有一个特殊的主体,其在建立两个域之间的信任关系方面发挥了关键作用。该主体遵循krbgt/<REALM>@<REALM>格式,供AS和TGS内部使用。
    
  对于YINZHENGJIE.COM域,该主题为krbgt/YINZHENGJIE.COM@YINZHENGJIE.COM。kerberos使用这个特殊主体的密钥对其发布的TGT进行加密。这是为了确保AS发布的TGT只能由TGS验证。
    
  当在域之间建立单向或双向信任时,特殊主体必须存在于两个域中。这个主体的密码在另两个域中也需要保持一致。

2>.为什么需要Kerberos互信?

  如果来自域A的用户要使用域B中的服务,显然,必须为两个域设置一个一起工作的方法。Kerberos互信是两个域之间建立信任关系的方式,这使得来自一个域的主体可以访问另一个域的服务。

  假设组织内有两个不同的Kerberos域,可以将它们分别命名为"SALES.YINZHENGJIE.COM"和"HR.YINZHENGJIE.COM"。

  可以配置这两个域之间的信任关系,使"SALES.YINZHENGJIE.COM"的用户能够信任来自"HR.YINZHENGJIE.COM"域的信息。当然,建立这种关系后第二个域也能够信任来自第一个域的信息。

3>.什么是单向信任和双向信任

  单向信任:
    单向信任允许域A的主体访问域B,但不允许存储在域B中的用户访问域A。单向信任是两个域之间最常见的信任关系。
    一个公司通常希望允许存储在公司Active Dirctory中的终端用户访问Hadoop集群。在这种情况下,在Hadoop集群中设置一个KDC来保存所有的SPN信息,UPN信息存放在Active Directory中。
    在单向信任下,用户主体只存在于一个域中。例如,你有两个域,分别命名为"SALES.YINZHENGJIE.COM"和"HR.YINZHENGJIE.COM",要他们建立单向信任关系。
    为此,必须在这两个域中设置特殊主体krbgt。也就是说,HR域信任SALES域,必须在两个域中设置主体"krbgt/HR.YINZHENGJIE.COM@SALES.YINZHENGJIE.COM"。

  双向信任:
    在双向信任下,两个域的主体都可以访问另一个域。这要求用户主体在两个域中都存在。
    因此,必须在两个域中创建主体"krbgt/HR.YINZHENGJIE.COM@SALES.YINZHENGJIE.COM"和"krbgt/SALES.YINZHENGJIE.COM@HR.YINZHENGJIE.COM"。这将建立域HR和域SALES之间的完全信任关系。

 

五.Kerberos如何验证用户和服务

  配置Kerberos后,所有Hadoop服务奖通过Kerberos进行身份验证,客户端也需要向KDC进行身份验证。

  用户可以通过Hadoop RPC调用使用简单认证和安全层(SASL)框架对NameNode和ResourceManager进行身份验证。

  在SASL中,Kerberos充当身份验证协议,验证需要访问到Hadoop服务的用户。在此过程中涉及到三种类型的授权令牌:代理令牌,作业令牌和块访问令牌。下面对这几个令牌做出解释:
    代理令牌:
      代理令牌用于向NameNode验证用户。用户通过Kerberos向NameNode验证后,NameNode就向用户提供代理令牌。
      用户被验证后,ResourceManager共享代理令牌,ResourceManager使用该令牌代表用户访问HDFS资源,它还会为长时间运行的作业创建令牌。
    作业令牌:
      当用户向ResourceManager提交作业时,它创建一个与运行此MapReduce作业的所有DataNodes共享的密钥。
      作业令牌确保经过身份验证的用户能够访问DataNode的本地文件系统中的授权作业和授权目录。DataNodes还使用作业令牌进行安全的通信。
    块访问令牌:
      块访问令牌确保只有授权用户访问DataNodes上的HDFS数据。客户端从NameNode接受到块ID后,将从DataNodes中检索数据。
      NameNode还发放客户端发送到DataNode的块访问令牌以及数据块访问请求,用于数据访问。

 

六.博主推荐阅读

  部署Kerberos实战案例:
    https://www.cnblogs.com/yinzhengjie2020/p/13543893.html

  配置Kerberos实战案例:
    https://www.cnblogs.com/yinzhengjie2020/p/13580601.html

 

posted @ 2020-08-14 23:18  JasonYin2020  阅读(6249)  评论(0编辑  收藏  举报