【大数据安全】基于Kerberos的大数据安全验证方案

2024-04-06 18:48

本文主要是介绍【大数据安全】基于Kerberos的大数据安全验证方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.背景

互联网从来就不是一个安全的地方。很多时候我们过分依赖防火墙来解决安全的问题,不幸的是,防火墙是假设“坏人”是来自外部的,而真正具有破坏性的攻击事件都是往往都是来自于内部的。

近几年,在thehackernews等网站上总会时不时看到可以看到一些因为数据安全问题被大面积攻击、勒索的事件。在Hadoop1.0.0之前,Hadoop并不提供对安全的支持,默认集群内所有角色都是可靠的。用户访问时不需要进行任何验证,导致恶意用户很容易就可以伪装进入集群进行破坏。

不安全的Hadoop集群

要保证Hadoop集群的安全,至少要做到2个A:Authentication(认证),Authorization(授权)。常见的方案有:

  • Authentication:
    MIT Kerberos, Azure AD, Kerby

  • Authorization:
    Apache Sentry(Cloudera), Apache Ranger(Hortonworks)

 

Hadoop集群对Kerberos的支持

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版本。

2.1 名词解释

  • AS(Authentication Server):认证服务器
  • KDC(Key Distribution Center):密钥分发中心
  • TGT(Ticket Granting Ticket):票据授权票据,票据的票据
  • TGS(Ticket Granting Server):票据授权服务器
  • SS(Service Server):特定服务提供端
  • Principal:被认证的个体
  • Ticket:票据,客户端用来证明身份真实性。包含:用户名,IP,时间戳,有效期,会话秘钥。

使用Kerberos时,一个客户端需要经过三个步骤来获取服务:

  1. 认证: 客户端向认证服务器发送一条报文,获取一个包含时间戳的TGT。
  2. 授权: 客户端使用TGT向TGS请求指定Service的Ticket。
  3. 服务请求: 客户端向指定的Service出示服务Ticket鉴权通讯。

Kerberos协议在网络通信协定中属于显示层。其通信流程简单地说,用户先用共享密钥从某认证服务器得到一个身份证明。随后,用户使用这个身份证明与SS通信,而不使用共享密钥。

2.2 具体通信流程

①此流程使用了对称加密; ②此流程发生在某一个Kerberos领域中; ③小写字母c,d,e,g是客户端发出的消息,大写字母A,B,E,F,H是各个服务器发回的消息。

首先,用户使用客户端上的程序进行登录:

  1. 输入用户ID和密码到客户端(或使用keytab登录)。
  2. 客户端程序运行一个单向函数(大多数为Hash)把密码转换成密钥,这个就是客户端的“用户密钥”(user's secret key)。

2.2.1 客户端认证(Kinit)

客户端(Client)从认证服务器(AS)获取票据的票据(TGT)。
客户端认证

  1. Client向AS发送1条明文消息,申请基于该用户所应享有的服务,例如“用户Sunny想请求服务”(Sunny是用户ID)。(注意:用户不向AS发送“用户密钥”(user's secret key),也不发送密码)该AS能够从本地数据库中查询到该申请用户的密码,并通过相同途径转换成相同的“用户密钥”(user's secret key)。
  2. AS检查该用户ID是否在于本地数据库中,如果用户存在则返回2条消息:
    • 【消息A】:Client/TGS会话密钥(Client/TGS Session Key)(该Session Key用在将来Client与TGS的通信(会话)上),通过 用户密钥(user's secret key) 进行加密
    • 【消息B】:票据授权票据(TGT)(TGT包括:消息A中的“Client/TGS会话密钥”(Client/TGS Session Key),用户ID,用户网址,TGT有效期),通过TGS密钥(TGS's secret key) 进行加密
  3. 一旦Client收到消息A和消息B,Client首先尝试用自己的“用户密钥”(user's secret key)解密消息A,如果用户输入的密码与AS数据库中的密码不符,则不能成功解密消息A。输入正确的密码并通过随之生成的"user's secret key"才能解密消息A,从而得到“Client/TGS会话密钥”(Client/TGS Session Key)。(注意:Client不能解密消息B,因为B是用TGS密钥(TGS's secret key)加密的)。拥有了“Client/TGS会话密钥”(Client/TGS Session Key),Client就足以通过TGS进行认证了。

2.2.2 服务授权

Client从TGS获取票据(client-to-server ticket)。
服务授权

  1. 当client需要申请特定服务时,其向TGS发送以下2条消息:
    • 【消息c】:即消息B的内容(TGS's secret key加密后的TGT),和想获取的服务的服务ID(注意:不是用户ID)
    • 【消息d】:认证符(Authenticator)(Authenticator包括:用户ID,时间戳),通过Client/TGS会话密钥(Client/TGS Session Key)进行加密
  2. 收到消息c和消息d后,TGS首先检查KDC数据库中是否存在所需的服务,查找到之后,TGS用自己的“TGS密钥”(TGS's secret key)解密消息c中的消息B(也就是TGT),从而得到之前生成的“Client/TGS会话密钥”(Client/TGS Session Key)。TGS再用这个Session Key解密消息d得到包含用户ID和时间戳的Authenticator,并对TGT和Authenticator进行验证,验证通过之后返回2条消息:
    • 【消息E】:client-server票据(client-to-server ticket)(该ticket包括:Client/SS会话密钥 (Client/Server Session Key),用户ID,用户网址,有效期),通过提供该服务的服务器密钥(service's secret key) 进行加密
    • 【消息F】:Client/SS会话密钥( Client/Server Session Key) (该Session Key用在将来Client与Server Service的通信(会话)上),通过Client/TGS会话密钥(Client/TGS Session Key) 进行加密
  3. Client收到这些消息后,用“Client/TGS会话密钥”(Client/TGS Session Key)解密消息F,得到“Client/SS会话密钥”(Client/Server Session Key)。(注意:Client不能解密消息E,因为E是用“服务器密钥”(service's secret key)加密的)。

2.2.3 服务请求

Client从SS获取服务。

  1. 当获得“Client/SS会话密钥”(Client/Server Session Key)之后,Client就能够使用服务器提供的服务了。Client向指定服务器SS发出2条消息:
    • 【消息e】:即上一步中的消息E“client-server票据”(client-to-server ticket),通过服务器密钥(service's secret key) 进行加密
    • 【消息g】:新的Authenticator(包括:用户ID,时间戳),通过Client/SS会话密钥(Client/Server Session Key) 进行加密
  2. SS用自己的密钥(service's secret key)解密消息e从而得到TGS提供的Client/SS会话密钥(Client/Server Session Key)。再用这个会话密钥解密消息g得到Authenticator,(同TGS一样)对Ticket和Authenticator进行验证,验证通过则返回1条消息(确认函:确证身份真实,乐于提供服务)
    • 【消息H】:新时间戳(新时间戳是:Client发送的时间戳加1,v5已经取消这一做法),通过Client/SS会话密钥(Client/Server Session Key) 进行加密
  3. Client通过Client/SS会话密钥(Client/Server Session Key)解密消息H,得到新时间戳并验证其是否正确。验证通过的话则客户端可以信赖服务器,并向服务器(SS)发送服务请求。
  4. 服务器(SS)向客户端提供相应的服务。

3.Kerberos HA架构

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

3.1 HA方案

目前单机房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 HA

4. 优化和展望

4.1 优化

(1)用户(Principal)管理

如果团队中已经有一套权限系统,要将现有的身份系统集成到Kerberos中会很困难。
随着业务的飞速增长,服务器规模越来越大,Kerberos Principal手动操作会越来越频繁,手动的增删改查维护会非常痛苦。需要在Kerberos管理系统中规范Principal申请、维护、删除、keytab生成流程。Principal申请和权限管理自动化。

(2)数据同步优化

Kerberos数据同步可以将生成的数据记录同步写入到MySQL中,使用MySQL双主同步方式。在跨机房环境中,KDC数据使用Rsync工具进行增量同步。以A核心机房作为主机房,Rsync Server使用了Keepalived VIP的方式,当Kerberos主机宕机后,VIP漂移到另外一台主机器上,Rsync Client会以VIP所在的KDC主机器为Rsync Server进行数据同步,以保证KDC数据同步的高可用性。

(3)运维

使用进程管理工具对Kerberos相关进程进行存活监控,当发现有进程异常退出时,邮件/微信/钉钉报警,主动再次拉起进程。

4.2 展望

部署过Kerberos的同学都知道,在Hadoop集群部署Kerberos实际是一项非常繁琐的工作。Kerberos本质上是一种协议或安全通道,对于大多数用户或普通用户来说,是有一定学习曲线的,是否有更好的实现能够对普通用户隐藏这些繁琐的细节。

阿里和Intel合作项目Hadoop Authentication Service (HAS) 据称目前已经应用到ApsaraDB for HBase2.0中:
HAS

HAS方案使用Kerby替代MIT Kerberos服务,利用HAS插件式验证方式建立一套人们习惯的账户密码体系。

目前HAS在Apache Kerby项目has-project分支开发中,未来会作为Kerbby的新feature出现在下一次release中。

Apache Kerby作为Apache Directory的一个子项目,目前关注度并不高,让我们期待它在后续的发展吧。

这篇关于【大数据安全】基于Kerberos的大数据安全验证方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/880568

相关文章

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

android 免费短信验证功能

没有太复杂的使用的话,功能实现比较简单粗暴。 在www.mob.com网站中可以申请使用免费短信验证功能。 步骤: 1.注册登录。 2.选择“短信验证码SDK” 3.下载对应的sdk包,我这是选studio的。 4.从头像那进入后台并创建短信验证应用,获取到key跟secret 5.根据技术文档操作(initSDK方法写在setContentView上面) 6.关键:在有用到的Mo

20170723 做的事 ecdsa的签名验证时间短于bls signature

1 今天在虚拟机 /home/smile/Desktop/20170610/Test//time_ecdsa 文件夹下,找到ecdsa的验证时间是 989.060606μs μs 先 make ,然后run。 再取BLS的签名生成时间: ./run  2  gnuplot 画图,画对比的时间 gnuplot 画图参考教程 http://blog.sciencen

DDS信号的发生器(验证篇)——FPGA学习笔记8

前言:第一部分详细讲解DDS核心框图,还请读者深入阅读第一部分,以便理解DDS核心思想 三刷小梅哥视频总结! 小梅哥https://www.corecourse.com/lander 一、DDS简介         DDS(Direct Digital Synthesizer)即数字合成器,是一种新型的频率合成技术,具有低成本、低功耗、高分辨率、频率转换时间短、相位连续性好等优点,对数字信

Excel实用技巧——二级下拉菜单、数据验证

EXCEL系列文章目录   Excel系列文章是本人亲身经历职场之后萌发的想法,为什么Excel覆盖如此之广,几乎每个公司、学校、家庭都在使用,但是它深藏的宝藏功能却很少被人使用,PQ、BI这些功能同样适用于数据分析;并且在一些需要简单及时的数据分析项目前,Excel是完胜python、R、SPSS这些科学专业的软件的。因此决心开启Excel篇章。 数据分析为什么要学Excel Excel图表

【建设方案】基于gis地理信息的智慧巡检解决方案(源文件word)

传统的巡检采取人工记录的方式,该工作模式在生产中存在很大弊端,可能造成巡检不到位、操作失误、观察不仔细、历史问题难以追溯等现象,使得巡检数据不准确,设备故障隐患得不到及时发现和处理。因此建立一套完善的巡检管理系统是企业实现精细化管理的一项重要工作。 基于GIS地理信息系统绘制常规巡检线路,设置线路巡检频率,当线路处于激活状态时,可根据已设置的频率自动生成巡检线路任务,并以消息的形式推送给执行人,

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全RBCD资源Operators组成员HTLMRelay结合

基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。 所以核心就是谁或什么权限能修改

jQuery插件——表单验证(jquery.validate.js)

HTML <form id="loginForm"><label class="form__label--hidden" for="username">用户名:</label><input class="form__input" type="text" id="username" name="username" placeholder="用户名"><label class="form__labe

C语言中的字符输入/输出和验证输入

在C语言中,字符输入/输出功能允许程序与用户进行交互,读取用户的输入信息并展示输出结果。同时,验证输入的作用在于确保用户输入的数据符合预期,以提高程序的稳定性和可靠性,防止无效输入引发的错误或异常行为,从而提供更好的用户体验。 基础概念 输入(Input):指的是向程序填充数据的过程,通常来源于用户输入、文件读取或其他外部数据源。 输出(Output):指的是将数据显示在屏幕上、打印机上或

分布式锁实现方案-基于Redis实现的分布式锁

目录 一、基于Lua+看门狗实现 1.1 缓存实体 1.2 延迟队列存储实体 1.3 分布式锁RedisDistributedLockWithDog 1.4 看门狗线程续期 1.5 测试类 1.6 测试结果 1.7 总结 二、RedLock分布式锁 2.1 Redlock分布式锁简介 2.2 RedLock测试例子 2.3 RedLock 加锁核心源码分析 2.4