hash是线程安全的吗?怎么解决?_怎么劳永逸地解决数据安全问题?

点击关注上方“知了小巷”,

设为“置顶或星标”,第一时间送达干货。

前文回顾:

(⼀)数据服务到底解决了什么问题?

(二)数据服务难道就是对外提供个API吗?

交付速度和质量问题解决了,⽼板说还得“省”

今天的数据怎么又不对?!

数据模型⽆法复⽤,归根结底还是设计问题

如何统⼀管理纷繁杂乱的数据指标?

元数据中⼼的关键⽬标和技术实现⽅案

数据中台到底怎么建设呢?

到底什么样的企业应该建设数据中台?

数据中台到底是不是大数据的下一站? 

669dde43e6cc31bd6b29984ed3ed9c4f.gif

前文已经了解数据中台在数据建设效率、质量和成本⽅⾯的内容。⽽除了快、准和省以外,数据中台还必须是安全的。因为如果不安全,很可能出现和“微盟删库跑路”同样的事情。所以,要十分重视数据中台的数据安全。

2020年2⽉23⽇19点,国内最⼤的精准营销服务商微盟出现了⼤⾯积的系统故障,旗下300万商⼾的线上业务全部停⽌,商铺后台的所有数据被清零。始作俑者是⼀位运维⼈员,他在⽣产环境数据库进⾏了删库操作,⽽刚刚上市不久的微盟就因此遭受了巨⼤的损失,从2⽉23⽇宕机以来,市值已经蒸发了30亿港元。这件事⼉堪称史上最贵的安全事件

那么从微盟的教训中,我们能得到什么警醒呢?在数据中台中怎么防⽌出现类似的事件呢?这或许是数据从业者需要认真思考的内容。安全问题可⼤可⼩,不出事情,可能根本不会重视,但是⼀旦出现事故,就是灾难性的。

数据中台的安全保障

ba6cebd0589bd0e76746c0acb5e7ad76.png

 

三个问题:

1. 如何解决数据误删除问题;

2. 如何解决敏感数据泄露问题;

3. 如何解决开发和⽣产物理隔离问题。

在数据中台建设中⼀定会⾯临上面三个问题,此文可以找到解决这些问题的⽅法。

> 机制⼀:数据备份与恢复


对于绝⼤多数的企业,数据中台的数据都存储在HDFS中,即使是实时的数据(存储于Kafka),也会归档⼀份到HDFS,因为要保存历史数据进⾏回算或者补数据。所以我们要解决的核⼼问题是HDFS 的数据备份

HDFS数据的备份,基于HDFS快照 + DistCp + EC实现。

f06ae5fb3b523102e310c55ab24df7b9.png

分为线上集群和冷备集群两个集群,数据加⼯任务访问的是线上集群,存储采⽤的是HDFS默认的3副本。⽽冷备集群,主要考虑到存储成本的因素,采⽤的是EC存储。

3358fdd70f945527732851d8846363b6.png

Hadoop在3.x就正式引⼊了EC存储,它是⼀种基于纠删码实现的数据容错机制,通过将数据进⾏分块,然后基于⼀定的算法计算⼀些冗余的校验块,当其中⼀部分数据块丢失的时候,可以通过这些冗余的校验块和剩余的数据块,恢复出丢失的数据块。

这么说可能不太形象,做个⽐喻。⽐如有三个数据块,分别存储的是1、2和3。我们⾮常担⼼其中⼀个数据块坏了,丢失内容。所以增加了⼀个块,这个块存储的内容是前⾯三个数据块之和。那么如果其中任意⼀个数据块坏了,我们可以根据现有的数据块计算出丢失的数据块内容。  

⽐如1丢失了,我们可以根据6-3-2 计算出1,当然这个只是最简单的EC算法,只能容忍⼀个数据块丢失,实际的EC算法要再复杂⼀些 。

关于EC具体的算法细节,不是重点。EC 存储,在不降低可靠性的前提下(与HDFS 3副本可靠性相同),通过牺牲了⼀定的计算性能(因为计算校验块需要消耗额外的计算资源),将数据存储成本降低了⼀半,⾮常适合低频访问的冷数据的存储,⽽备份数据就是这种类型的数据。

那线上集群的数据⼜是如何同步到冷备集群的呢?

在回答这个问题前,有必要先了解⼀下快照的基本原理,因为这样才能理解后续的数据同步流程。

Hadoop在2.x版本就已经⽀持了对某个⽂件或者⽬录创建快照,可以在⼏秒内完成⼀个快照操作。在做快照前,⾸先要对某个⽬录或者⽂件启⽤快照,此时对应⽬录下⾯会⽣成⼀个.snapshot的⽂件夹。

86d1a977fc3979df354aba7951b8eb94.png

在上图中,我们对/helloword⽬录启⽤快照,然后创建⼀个s1的备份。此时,在.snapshot下存在s1⽂件。然后我们删除/helloword/animal/lion ⽂件时,HDFS 会在animal ⽬录创建differ⽂件,并把differ⽂件关联到s1备份,最后把lion⽂件移动到differ⽬录下。

通过这个案例,我们不难发现,HDFS快照实际只记录了产⽣快照时刻之后的,所有的⽂件和⽬录的变化,⾮常适合每天只有少数⽂件被更新的数据中台,代价和成本也很低。

有了快照之后,我们就需要把快照拷⻉到冷备集群中,这⾥选择的是Hadoop⾃带的DistCp。为什么考虑DistCp 呢?因为它⽀持增量数据的同步。它有⼀个differ参数,可以对⽐两个快照,仅拷⻉增量的数据。同时,DistCp是基于MapReduce框架实现的数据同步⼯具,可以充分利⽤Hadoop分布式计算的能⼒,保证数据的拷⻉性能。

这里有⼀张详细的图,透过这张图,可以看到具体的数据从线上集群拷⻉到冷备集群的流程。

c06e951d0c8946ae01cde152c96fe921.png

⾸先,对于第⼀次开始数据备份的⽂件,会先创建⼀个快照,然后利⽤DistCp 拷⻉全量的备份数据到冷备集群。然后后续的每⼀天,都会定时⽣成⼀个快照,并和前⼀天的快照基于distcp --differ 参数进⾏对⽐,将有更新的部分再同步到冷备集群。同步完成以后,会删除前⼀天的快照,这样就完成了每⽇数据的增量同步。

这⾥需要特别注意的是,拷⻉数据会对线上I/O 产⽣⽐较⼤的压⼒,所以尽量在任务运⾏的低峰期进⾏同步(⽐如⽩天12点到晚上24点之间的时间),同时DistCp的bandwidth参数可以限制同步的速率可以根据I/O负载和数据同步速率,动态调整。⽐如说,I/O利⽤率100%,应该限制数据拷⻉带宽,为10MB/s。

上面了解了数据中台中中⽂件⽬录的备份,但是光这些还不够,还需要备份数据的产出任务,表相关的信息:

1. 任务的备份,要保存任务代码、任务的依赖关系、任务的调度配置以及任务的告警、稽核监控等信息;

2. 表的备份主要是备份表的创建语句。

比如产品化的解决⽅案,数据开发可以在数据管理平台上,选择⼀张表,创建备份,然后系统就会⾃动地完成任务、⽂件和表的备份。平台也提供了⼀键恢复的功能,系统会⾃动地帮数据开发创建任务和表,拷⻉数据从冷备集群到线上集群。

什么样的数据应该备份呢?

数据的备份策略应该和数据资产等级打通, 对于核⼼数据资产,数据中台应该强制进⾏备份。

那假如说,数据没有备份,但我们误删除了,还有没有其他的补救⽅法呢?

> 机制⼆:垃圾回收箱设计


HDFS 本⾝提供了垃圾回收站的功能,对于意外删除的⽂件,可以在指定时间内进⾏恢复,通过在core-site.xml中添加如下配置就可以开启了,默认是关闭状态。

<property>  <name>fs.trash.intervalname>  <value>1440value>property>

当HDFS ⼀旦开启垃圾回收功能后,⽤⼾通过命令⾏执⾏rm⽂件操作的时候,HDFS会将⽂件移到/user/[⽤⼾名]/.trash/current/⽬录下。这个⽬录下的⽂件会在fs.trash.interval 配置的时间过期后被系统⾃动删除。当需要恢复⽂件的时候,只需要把/user/[⽤⼾名]/.trash/current/被删除⽂件移到要恢复的⽬录即可。

但是,HDFS垃圾回收机制在实际应⽤过程中,存在重⼤的缺陷。因为它只能⽀持通过命令⾏执⾏rm操作,对于在代码中通过HDFS  API调⽤Delete接⼝时,会直接删除⽂件,垃圾回收机制并不⽣效。尤其是我们在Hive中执⾏drop table删除⼀个Hive管理表,此时删除的数据⽂件并不会进⼊trash⽬录,会存在巨⼤的安全隐患。

8bfb2309fe9a7be4481a9880a96c1ef3.png

可以对HDFS的Client进⾏修改,对Delete API通过配置项控制,改成跟rm相同的语义。也就是说,把⽂件移到trash⽬录。对于Hive上的HDFS Client进⾏替换,这样可以确保⽤⼾通过drop table 删除表和数据时,数据⽂件能够正常进⼊HDFS trash⽬录。

通过这种⽅式,可以解决数据误删除的问题。但HDFS回收站不宜保留时间过⻓,因为回收站中的数据还是三副本配置,会占⽤过多的存储空间。⼀个配合解决⽅案是,回收站保留24⼩时内的数据。 这样解决的是数据还没来得及被同步到冷备集群,误删除的情况。对于⼀天以上的数据恢复,建议采取基于冷备集群的数据备份来恢复。

下面是如何避免敏感数据的泄露,而这离不开精细化的权限管理。

> 机制三:精细化的权限管理


数据权限是数据中台实现数据复⽤的前提和必要条件。如果刚开始系统没有开启权限,后期接⼊权限,任务的改造成本会⾮常⾼的,⼏乎涉及到所有的任务。所以权限这个问题,在数据中台构建之初,必须提前规划好。

⽹易数据中台⽀撑技术体系是基于OpenLDAP + Kerberos + Ranger 实现的⼀体化⽤⼾、认证、权限管理体系。

f6f9c6642edc943d72dca93191d86ad5.png

试想⼀下,如果有⼏千台机器,却没有⼀个统⼀的⽤⼾管理服务,当我们想添加⼀个⽤⼾时,需要到⼏千台服务器上去创建初始化⽤⼾,这个管理和运维的效率有多低。⽽OpenLDAP就帮我们解决了这个问题。

OpenLDAP是⼀个轻量化的⽬录服务,数据以树型结构进⾏存储,能够提供⾼性能的查询服务,⾮常适合⽤⼾管理的场景。

596d110c91e73075013e881e8b770f67.png

在OpenLDAP中,我们可以创建⽤⼾(User)和组(Group),对于每个⽤⼾,会有唯⼀的uid,对于每个组,通过memberuid,我们可以添加⼀个⽤⼾到⼀个组中。

在大数据平台上注册⼀个⽤⼾,平台会⾃动⽣成⼀个OpenLDAP的⽤⼾,当该⽤⼾加⼊某个项⽬时,会将该项⽬对应的Group下增加⼀个Memberuid。假设在上图中,甄漂亮加⼊了da_music项⽬,那么在da_music的Group下,会增加Memberuid:1002。同理,当甄美丽加⼊某个⻆⾊时,在对应⻆⾊的Group下,也会有甄美丽对应的Memberuid。

那Hadoop⼜是怎么跟OpenLDAP集成的呢?

Hadoop可以使⽤LdapGroupsMappings同步LDAP创建的⽤⼾和⽤⼾组,这样当我们在LDAP中添加⽤⼾和组时,会⾃动同步到Hadoop集群内的所有机器上。

通过这个⽅式,就可以解决⽤⼾管理的问题了,⽽接下来要解决的就是认证的问题。在⾮安全⽹络中,除了客⼾端要证明⾃⼰是谁,对于服务端⽽⾔,同样也需要证明我是我。为了实现双向的认证,我们在⽣产环境启⽤了安全等级最⾼的,基于共享密钥实现的Kerberos认证

说起Kerberos认证的原理,举⼀个有趣的例⼦。

为了进游乐场,⾸先需要提供⾝份证,实名购买⼀张与⾝份绑定的⻔票。在进⼊游乐场之后,每个游乐设施前,都有⼀个票据授权机器,需要刷⼀下⻔票,授权机器会⽣成⼀个该游乐设施的票据,我们拿着这个票据就可以玩这个游乐设施了。

当然,当想玩另外⼀个游乐设施的时候,同样需要刷⼀下⻔票,⽣成对应游乐设施的票据。⽽且⻔票是有有效期的,在有效期内,可以尽情地玩游乐设施,⼀旦超过有效期,就需要重新购买⻔票。

bebbb800d8a979192fe73ea83f9db450.png

Kerberos认证与上⾯这个故事类似,在上⾯的故事中,TGT(Ticket-granting ticket)可以看作是⻔票, Client⾸先使⽤⾃⼰的密钥⽂件Keytab和⽤⼾标识Principal去认证服务器(AS)购买TGT,认证服务器确认是合法的⽤⼾,Client会获得TGT,⽽这个TGT使⽤了TGS(Ticket-granting service)的Keytab加密,所以Client是没办法伪造的。

在访问每个Server前,Client需要去票据授权服务(TGS)刷⼀下TGT,获取每个服务的票据(ST),ST使⽤了Client要访问的Server的Keytab加密,⾥⾯包含了TGS 认证的⽤⼾信息,Client是⽆法伪造ST的。

最后基于每个服务的票据,以及客⼾端⾃⼰⽣成的加密客⼾认证信息(Autenticator)访问每个服务。每个Server都有归属于⾃⼰的Keytab,Server只有使⽤Server⾃⼰的Keytab才能解密票据(ST),这就避免了Client传给了错误的Server。

与此同时,解密后票据中包含TGS认证的客⼾信息,通过与Authenticator 中Client⽣成的客⼾信息进⾏对⽐,如果是⼀致的,就认为Client是认证通过的。

⼀般在Hadoop中,会使⽤Kinit⼯具完成TGT的获取,TGT⼀般保存24⼩时内。Kerberos对于Hadoop集群来说,是⼀个⾮常安全的认证实现机制,推荐使⽤Kerberos 实现Hadoop集群的安全认证。

Kerberos 使⽤的是Principal标识⽤⼾的,它⼜是怎么和OpenLDAP中的⽤⼾打通的呢?其实我们访问HDFS,使⽤的是Principal,Hadoop可以通过配置hadoop.security.auth_to_local,将Principal 映射为系统中的OpenLDAP的⽤⼾。⽤⼾注册时,平台会为每⼀个新注册的⽤⼾⽣成Principal以及相对应的Keytab⽂件。

认证完成之后呢,就要解决哪些客⼾可以访问哪些数据的问题了。推荐使⽤Ranger来解决权限管理的问题。

为什么要选择Ranger呢?因为Ranger提供了细粒度的权限控制(Hive列级别),基于策略的访问控制机制,⽀持丰富的组件以及与Kerberos的良好集成。权限管理的本质,可以抽象成⼀个模型:“⽤⼾-资源-权限”。

数据就是资源,权限的本质是解决哪些⼈对哪些资源有权限。

5180cec4a4bce130fdd1358f43768d5d.png

在Ranger中,保存了很多策略,每⼀个资源都对应了⼀条策略,对于每个策略中,包含了很多组许可,每个⼀个许可标识哪个⽤⼾或者组拥有CRUD权限。

权限的申请流程是什么样⼦的呢?

在数据中台中,每⼀张表都有对应的负责⼈,当我们在数据地图中找到我们想要的数据的时候,可以直接申请表的访问权限,然后就会发起⼀个权限申请的⼯单。表的负责⼈可以选择授权或者拒绝申请。申请通过后,就可以基于我们⾃⼰的Keytab访问该表了。

另外,需要特别强调的是,由于数据中台中会有⼀些涉及商业机密的核⼼数据,所以数据权限要根据数据资产等级,制订不同的授权策略,会涉及到不同的权限审批流程,对于⼀级机密⽂件,可能需要数据中台负责⼈来审批,对于⼀般的表,只需要表的负责⼈审批就可以了。

> 机制四:操作审计机制


进⾏到第三步,权限控制的时候,其实已经⼤幅降低了数据泄露的⻛险了,但是⼀旦真的出现了数据泄露, 我们必须能够追查到到底谁泄露了数据,所以,数据中台必须具备审计的功能。

22d0e140b99f915f4dc57521aba96546.png

由于⽤⼾每次访问数据,都要对权限进⾏验证,所以在校验权限的同时,可以获取⽤⼾访问表的记录, Ranger⽀持审计的功能,⽤⼾的访问记录会由部署在各个服务(HDFS,HBase等等)上的插件推送到Audit Server上,然后存储在Solr中,Ranger提供了API接⼝查询表的访问记录。但是必须指出的是,Ranger开启Audit 后,会对服务内的插件性能产⽣影响。

除了敏感数据泄露的⻛险,我还看到⼀些企业想要对开发和⽣产环境进⾏物理隔离。为什么企业会有这个诉求呢?

⾸先,很多传统公司的数据开发都是外包⼈员,从企业的⻆度,不希望数据开发直接使⽤⽣产环境的数据进⾏测试,从安全⻆度,他们希望⽣产和测试从物理集群上完全隔离,数据脱敏以后,给开发环境进⾏数据测试。

其次,涉及⼀些基础设施层⾯的组件升级(⽐如HDFS、Yarn、Hive、Spark等),贸然直接在⽣产环境升级,往往会造成兼容性的事故,所以从安全性的⻆度,企业需要有灰度环境,⽽⽤开发环境承担灰度环境的职能,是⼀个不错的选择。

最后,虽然可以为⽣产和开发环境设置不同的库和队列,从⽽实现隔离,避免开发任务影响线上任务和数据,但会导致任务上线需要改动代码,所以最理想的,还是实现开发和⽣产环境两套集群,同⼀套代码,在开发环境对应的就是开发集群,提交上线后,就发布到⽣产集群。

这些就是企业希望开发和⽣产集群物理隔离的原因,接下来看⼀看该如何满⾜。

> 机制五:开发和⽣产集群物理隔离

在⾯对这个需求时,我们遇到了两类完全不同的企业群体。

⼀部分来⾃传统企业,尤其是⾦融⾏业,他们对安全性的要求远⼤于对效率的诉求,严格禁⽌数据开发使⽤线上数据进⾏测试,他们希望有两套完全不同的环境,包括操作平台,任务在开发环境进⾏开发,配置任务依赖,设置稽核规则和报警,然后由运维⼈员进⾏审核后,⼀键发布到⽣产环境。当数据开发需要对数据进⾏测试时,可以同步⽣产环境的局部数据(部分分区),数据会进⾏脱敏。

bda67508f1dc7b415ed5fd9e1faffbeb.png

上图是该模式下的部署架构。

通过这张图我们可以看到,开发和测试环境本⾝是两套完全独⽴的平台,因为每次数据测试,都需要同步⽣产环境的数据,所以这种模式下,数据开发的效率会有⽐较⼤的影响,但是优势在于对数据安全实现了最⾼级别的保护。

与这部分客⼾不同的是,很多企业需要同时兼顾安全和效率,他们没有办法接受同步⽣产环境数据,⽽是需要在开发环境能够直接使⽤线上的数据进⾏测试。

7f13ec7a23afc2910308969638291f56.png

上图展⽰了该模式下的部署架构。

⼤数据平台和任务调度系统(Azkaban)都是⼀套,然后Hive,Yarn和HDFS都是两套,两套集群通过Metastore共享元数据。

这样做的⼀个好处在于,⼀个集群的Hive可以直接访问另外⼀个集群的数据。在同⼀个Metastore中,开发环境的数据在_dev库中,⽣产环境的数据在_online库中,⽤⼾在代码中不需要指定库,在任务执⾏时,根据运⾏环境,⾃动匹配库。例如在开发环境执⾏,Hive默认会使⽤_dev库下的表,⽽在⽣产环境执⾏,Hive默认会使⽤_online库下的表,从⽽实现了不需要改代码可以实现⼀键发布。

上⾯两种部署模式,可以根据所在的企业实际情况进⾏选择,对安全性要求⾼,推荐第⼀种⽅案,对于效率要求⾼,同时兼顾⼀定的安全性,就推荐第⼆种⽅案。

> 总结


总的来说,介绍了解决数据中台安全问题的五⼤制胜法宝,相信通过这些保障机制,可以解决数据中台遇到的安全问题了。最后重点:

1. 数据备份要同时兼顾备份的性能和成本,推荐采⽤EC存储作为备份集群的存储策略;

2. 数据权限要实现精细化管理,基于OpenLDAP+Kerberos+Ranger可以实现⼀体化⽤⼾、认证、权限管理;

3. 开发和⽣产环境物理隔离,提到了两种部署模式,需要综合权衡效率和安全进⾏选择。

5a393cccf411642cf586727ce4d79592.png

思考


引⼊权限管理,势必会对数据研发效率产⽣影响,同时已有的任务必须重构,进⾏认证改造。如何思考安全和效率之间的优先关系?

HDFS EC 存储介绍:

https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-hdfs/HDFSErasureCoding.html

在进⾏权限管理时,先构建权限体系,再按照资源本⾝的重要性和价值进⾏。特别是对于⼀些维度表,往 往包含⽐较敏感和丰富的信息。也可以从平台或者⼯具上⼊⼿尽可能透明化,降低权限对开发的影响。其 实,注意影响还是在前期投⼊如何解决好改造和开发新需求之间⽭盾。可以通过类似灰度发布的做法,逐步改造迁移。

引⼊权限管理,肯定会影响研发效率的。最好在项⽬开始前就引⼊。任务上线后再加⼊权限,要在开发环 境严格测试,否则可能会任务因权限不⾜报错。

往期推荐:

交付速度和质量问题解决了,⽼板说还得“省”

今天的数据怎么又不对?!

数据模型⽆法复⽤,归根结底还是设计问题

数据仓库、数据湖、流批一体,终于有大神讲清楚了!

如何统⼀管理纷繁杂乱的数据指标?

项目管理实战20讲笔记(网易-雷蓓蓓)

元数据中⼼的关键⽬标和技术实现⽅案

Hive程序相关规范-有助于调优

HBase内部探险-数据模型

HBase内部探险-HBase是怎么存储数据的

HBase内部探险-一个KeyValue的历险

数据中台到底怎么建设呢?

到底什么样的企业应该建设数据中台?

数据中台到底是不是大数据的下一站?

f626ebfc1f4bcdba23240665d1bbd378.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值