数据中台实战(11)-数据中台的数据安全解决方案
0 微盟删库跑路
除了快、准和省,数据中台须安全,避免“微盟删库跑路”。
2020年2月23日19点,国内最大精准营销服务商微盟出现大面积系统故障,旗下300万商户线上业务全停,商铺后台所有数据被清。始作俑者是一位运维,在生产环境数据库删库,而刚上市不久的微盟就因此遭受巨大的损失,2月23日宕机以来,市值蒸发30亿港元。最贵的安全事件。数据中台咋防止类似事件?
- 如何解决数据误删除
- 如何解决敏感数据泄露
- 如何解决开发和生产物理隔离
1 数据备份与恢复
数据中台的数据几乎都存储在HDFS,即使实时数据(存储于Kafka),也会归档HDFS,因为要保存历史数据进行回算或补数据。所以核心问题是HDFS数据备份。
HDFS数据备份可基于HDFS 快照 + DistCp + EC实现。
分为两个集群:
-
线上集群
数据加工任务访问
-
冷备集群
考虑存储成本,采用EC存储
存储采用HDFS默认的3副本。
EC存储原理图
EC存储基本原理
Hadoop3.x正式引入EC存储,一种基于纠删码实现的数据容错机制,通过将数据分块,然后基于算法计算一些冗余校验块,当其中一部分数据块丢失时,可通过这些冗余校验块和剩余数据块,恢复丢失数据块。
案例
如有三个数据块,分别存储1、2和3。担心其中一个数据块坏了,丢失内容。所以增加一个块,这块存储内容是前面三个数据块之和。若任一数据块坏了,可根据现有数据块计算出丢失的数据块内容。
如1丢失,可根据6-3-2计算出1,当然这只是最简单EC算法,只能容忍一个数据块丢失,实际EC算法更复杂。
EC存储,在不降低可靠性前提下(与HDFS 3副本可靠性相同),通过牺牲一定计算性能(计算校验块消耗额外计算资源),将数据存储成本降低一半,适合低频访问的冷数据存储,如备份数据。
线上集群的数据同步到冷备集群
先了解快照基本原理,才能理解后续的数据同步。
Hadoop 2.x支持对某文件或目录创建快照,几s内完成一个快照操作。快照前,先要对某目录或文件启用快照,此时对应目录下会生成.snapshot文件夹:
上图对/helloword目录启用快照,然后创建一个s1的备份。此时,在.snapshot下存在s1文件。然后删除/helloword/animal/lion文件时,HDFS会在animal目录创建differ文件,并把diifer文件关联到s1备份,最后把lion文件移动到differ目录下。
HDFS快照实际只记录了产生快照时刻之后的,所有的文件和目录的变化,适合每天只有少数文件被更新的数据中台,代价和成本也低。
有了快照后,就要把快照拷贝到冷备集群,这里选择Hadoop自带的DistCp,因为它支持增量数据的同步。它有differ参数,可对比两个快照,仅拷贝增量数据。同时,DistCp是基于MapReduce框架实现的数据同步工具,可充分利用Hadoop分布式计算的能力,保证数据拷贝性能。
数据从线上集群拷贝到冷备集群
首先,对于第一次开始数据备份的文件,我们会先创建一个快照,然后利用DistCp 拷贝全量的备份数据到冷备集群。然后后续的每一天,我们都会定时生成一个快照,并和前一天的快照基于distcp --differ 参数进行对比,将有更新的部分再同步到冷备集群。同步完成以后,会删除前一天的快照,这样就完成了每日数据的增量同步。
这里需要特别注意的是,拷贝数据会对线上I/O 产生比较大的压力,所以尽量在任务运行的低峰期进行同步(比如白天12点到晚上24点之间的时间),同时DistCp的bandwidth参数可以限制同步的速率,你可以根据I/O 负载和数据同步速率,动态调整。比如说,I/O 利用率100%,应该限制数据拷贝带宽,为10MB/s。
数据中台中文件目录的备份光这些还不够,还要备份数据的产出任务,表相关的信息:
- 任务的备份,要保存任务代码、任务的依赖关系、任务调度配置及任务告警、稽核监控等信息
- 表的备份主要是备份表的创建语句
网易提供产品化解决方案,数据开发可在提供的数据管理平台,选择一张表,创建备份,然后系统自动完成任务、文件和表的备份。平台也提供一键恢复功能,系统自动帮数据开发创建任务和表,拷贝数据从冷备集群到线上集群。
什么样数据应备份?
数据的备份策略应和数据资产等级打通,对核心数据资产,数据中台应强制备份。
假如数据没备份,但误删除,还有补救方法? 试下这机制:
2 垃圾回收箱设计
HDFS本身提供垃圾回收站功能,意外删除的文件可在指定时间内进行恢复。
Core-site.xml添加如下配置开启,默认关闭:
<property> <name>fs.trash.interval</name> <value>1440</value>
</property>
当HDFS一旦开启GC功能,用户通过命令行执行rm时,HDFS会将文件移到
/user/[用户名]/.trash/current/
目录。这目录下文件会在fs.trash.interval配置时间过期后,被系统自动删除。需恢复文件时,只需把
/user/[用户名]/.trash/current/
被删除文件移到要恢复的目录。
2.1 HDFS垃圾回收机制缺陷
只支持通过命令行执行rm,对在代码中通过HDFS API调用Delete接口时,会直接删除文件,GC机制并不生效。尤其Hive中执行drop table删除一个Hive内表,此时删除的数据文件并不会进入trash目录,巨大安全隐患。
改造后的HDFS回收站原理图:
推荐对HDFS的Client修改,对Delete API通过配置项控制,改成跟rm相同语义。即把文件移到trash目录。对Hive上的HDFS Client进行替换,确保用户通过drop table删除表和数据时,数据文件能正常进入HDFS trash目录。
这样,即可解决数据误删问题。但HDFS回收站不宜保留时间过长,因为回收站中的数据还是三副本配置,会占用过多存储空间。所以配合解决方案:回收站保留24h内数据,解决数据还没来得及被同步到冷备集群,误删除的情况。
对一天以上数据恢复,建议采取基于冷备集群的数据备份来恢复。
3 精细化的权限管理
避免敏感数据泄露。数据权限是数据中台实现数据复用的前提和必要条件。若刚开始系统没开启权限,后期接入权限,任务改造成本很高,几乎涉及所有任务。权限问题,在数据中台构建之初,须提前规划好。
数据中台支撑技术体系基于OpenLDAP + Kerberos + Ranger 实现的一体化用户、认证、权限管理体系。
数据中台用户、认证、权限系统架构:
如有几千台机器,却没个统一的用户管理服务,当想添加一个用户,需到几千台服务器创建初始化用户,OpenLDAP解决了这问题。轻量化的目录服务,数据以树型结构存储,提供高性能查询服务,适合用户管理。
OpenLDAP 树型目录架构示意图
在OpenLDAP中,可创建用户(User)和组(Group),对于每个用户,会有唯一的uid,对于每个组,通过Memberuid,我们可以添加一个用户到一个组中。
大数据平台上注册一个用户,平台会自动生成一个OpenLDAP用户,当该用户加入某项目,会将该项目对应的Group下增加一个Memberuid。假设大漂亮加入da_music项目,da_music的Group下会增加Memberuid:1002。
Hadoop和OpenLDAP集成
Hadoop可使用LdapGroupsMappings同步LDAP创建的用户和用户组,在LDAP中添加用户和组时,会自动同步到Hadoop集群内的所有机器。
非安全网络中,除了客户端要证明自己是谁,对于服务端而言,同样也需要证明我是我。为实现双向认证,生产环境启用安全等级最高的基于共享密钥实现的Kerberos认证。
Kerberos认证原理
进游乐场,先要身份证实名购买与你身份绑定的门票。每个游乐设施前都有票据授权机器,刷门票,授权机器会生成该游乐设施的票据,就可玩这游乐设施。
想玩另外一个游乐设施,也要刷门票,生成对应游乐设施票据。门票有效期内尽情玩游乐设施,一旦超期,需重新购买门票。
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 使用的是Principal标识用户的,它又是
怎么和OpenLDAP中的用户打通的呢?
我们访问HDFS,使用Principal,Hadoop可通过配置hadoop.security.auth_to_local,将Principal映射为系统中的OpenLDAP的用户。用户注册时,平台会为每一个新注册的用户生成Principal以及相对应的Keytab文件。
认证完成后,要解决哪些客户可以访问哪些数据的问题。使用Ranger解决权限管理。
因为Ranger 提供了细粒度的权限控制(Hive列级别),基于策略的访问控制机制,支持丰富的组件以及与Kerberos的良好集成。权限管理的本质,可以抽象成一个模型:“用户-资源-权限”。
数据就是资源,权限的本质是解决哪些人对哪些资源有权限。
在Ranger中,保存了很多策略,每一个资源都对应了一条策略,对于每个策略中,包含了很多组许可,每个一个许可标识哪个用户或者组拥有CRUD权限。
讲完了用户、认证和权限实现机制,那你可能会问,权限的申请流程是什么样子的呢?
在数据中台中,每一张表都有对应的负责人,当我们在数据地图中找到我们想要的数据的时候,可以直接申请表的访问权限,然后就会发起一个权限申请的工单。表的负责人可以选择授权或者拒绝申请。申请通过后,就可以基于我们自己的Keytab访问该表了。
由于数据中台中会有一些涉及商业机密的核心数据,所以数据权限要根据数据资产等级,制订不同的授权策略,会涉及到不同的权限审批流程,对于一级机密文件,可能需要数据中台负责人来审批,对于一般的表,只需要表的负责人审批。
4 操作审计机制
进行到第三步,权限控制的时候,其实已经大幅降低了数据泄露的风险了,但是一旦真的出现了数据泄露,我们必须能够追查到到底谁泄露了数据,所以,数据中台必须具备审计的功能。
由于用户每次访问数据,都要对权限进行验证,所以在校验权限的同时,可以获取用户访问表的记录,Ranger支持审计的功能,用户的访问记录会由部署在各个服务(HDFS,HBase等等)上的插件推送到Audit Server上,然后存储在Solr中,Ranger提供了API接口查询表的访问记录。但是必须指出的是,Ranger开启Audit 后,会对服务内的插件性能产生影响。
除了敏感数据泄露的风险,我还看到一些企业想要对开发和生产环境进行物理隔离。为什么企业会有这个诉求呢?
首先,很多传统公司的数据开发都是外包人员,从企业的角度,不希望数据开发直接使用生产环境的数据进行测试,从安全角度,他们希望生产和测试从物理集群上完全隔离,数据脱敏以后,给开发环境进行数据测试。
其次,涉及一些基础设施层面的组件升级(比如HDFS、Yarn、Hive、Spark等),贸然直接在生产环境升级,往往会造成兼容性的事故,所以从安全性的角度,企业需要有灰度环境,而用开发环境承担灰度环境的职能,是一个不错的选择。
最后,虽然可以为生产和开发环境设置不同的库和队列,从而实现隔离,避免开发任务影响线上任务和数据,但会导致任务上线需要改动代码,所以最理想的,还是实现开发和生产环境两套集群,同一套代码,在开发环境对应的就是开发集群,提交上线后,就发布到生产集群。
这些就是企业希望开发和生产集群物理隔离的原因,那我们接下来看一看该如何满足。
5 开发、生产集群物理隔离
两类不同企业群体。
5.1 安全性要求>>效率
传统企业,尤其金融行业,严格禁止数据开发使用线上数据测试,他们希望有两套完全不同环境,包括操作平台,任务在开发环境进行开发,配置任务依赖,设置稽核规则和报警,然后由运维审核后,一键发布到生产环境。
当数据开发要对数据测试时,可同步生产环境的局部数据(部分分区),数据会脱敏。
该模式部署架构
开发、测试环境本身是两套完全独立平台,因为每次数据测试,都要同步生产环境的数据,所以数据开发效率有较大影响,但优势在对数据安全实现最高保护。
很多企业需
5.2 兼顾安全、效率
他们没法接受同步生产环境数据,而是要在开发环境能直接使用线上数据测试。
部署架构
大数据平台和任务调度系统(Azkaban)都是一套,然后Hive、Yarn和HDFS都是两套,两套集群通过Metastore共享元数据。
好处
一个集群的Hive可直接访问另一个集群的数据。在同一Metastore中:
- 开发环境数据在dev库
- 生产环境数据在online库
用户在代码不需指定库,任务执行时,根据运行环境,自动匹配库。如:
- 在开发环境执行,Hive默认用dev库表
- 在生产环境执行,Hive默认用online库表
从而实现不需改代码实现一键发布。
5.3 选型
- 对安全性要求高,推荐第一
- 对效率要求高,同时兼顾一定安全性,推荐第二
6 总结
- 数据备份要兼顾备份性能、成本,推荐EC存储作为备份集群的存储策略
- 数据权限要实现精细化管理,基于OpenLDAP+Kerberos+Ranger可实现一体化用户、认证、权限管理
- 开发、生产环境物理隔离,两种部署模式,权衡效率、安全进行选择
参考
- HDFS EC 存储介绍
相关文章:

数据中台实战(11)-数据中台的数据安全解决方案
0 微盟删库跑路 除了快、准和省,数据中台须安全,避免“微盟删库跑路”。 2020年2月23日19点,国内最大精准营销服务商微盟出现大面积系统故障,旗下300万商户线上业务全停,商铺后台所有数据被清。始作俑者是一位运维&a…...

林沛满-TCP之在途字节数
本文整理自:《Wireshark网络分析的艺术 第1版》 作者:林沛满 著 出版时间:2016-02 我一直谨记斯蒂芬霍金的金玉良言—每写一道数学公式就会失去一半读者。不过为了深度分析网络包,有时候是不得不计算的,好在小学一年级…...

HTTPS 加密工作过程
引言 HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。例如臭名昭著的运营商劫持。显然, 明文传输是比较危险的事情,为此引入 HTTPS ,HTTPS 就是在 HTTP 的基础上进行了加密, 进一步的来保…...

校招秋招,性格和职业有关系吗?
企业在招聘应届毕业生时不再局限于普通的面试或者笔试,在互联网时代,为了能够更好的匹配需要的优质人才,企业会通过各种测试来提高招聘的准确率以及成功率。也许以前很多人都听说过性格和职业是有一定关系的,但是如何确定自己的性…...

网络和系统操作命令
目录 ping:用于检测网络是否通畅,以及网络时延情况。ipconfig:查看计算机的IP参数配置信息,如IP地址、默认网关、子网掩码等信息。netstat:显示协议统计信息和当前TCP/IP网络连接。tasklist:显示当前运行的…...
刷穿力扣(1~30)
更好的阅读体验 \huge{\color{red}{更好的阅读体验}} 更好的阅读体验 1. 两数之和 哈希表遍历数组,同时用 HashMap 维护已出现过的数及其下标若当前的数 nums[i] 满足 target - nums[i] 曾经出现过,则直接返回否则将其加入到哈希表中。 class Solution …...
栈和队列的基本操作
(一)实验类型:设计性 (二)实验目的: 1.掌握栈和队列的抽象数据类型。 2.掌握实现栈和队列的各种操作的算法。 3.理解栈与递归的关系。 4. 掌握队列的链式存贮结构及基…...
变压器绕组断股往往导致直流电阻不平衡率超标
变压器绕组断股往往导致直流电阻不平衡率超标, 例如, 某电厂 SFPSL—12000/220 型主变压器, 色谱分析结果发现总烃含量急剧增长, 测直流电阻, 其结果是高、 低压侧与制造厂及历年的数值相比较无异常, 但中压…...

stack和queque
1.stack 1.1定义 T 是容器内的数据类型; Container是数据类型的容器适配器 vector和list和stack的区别 1.2 stack的功能 注意这里没有迭代器;原因stack是先进后出的规律;这就规定该容器不可以随机访问; 2. queue...

信息学 学习/复习 抽签器(附源码)
问你一个问题,你考试前怎么复习呀? 效果图 以下是源代码,可自行修改 [C] #include<bits/stdc.h> #include<windows.h> using namespace std; vector<string>item; int main(void) {item.push_back("Manacher"…...

基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略(Simulink仿真实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

[0xGame 2023] week1
整理一下,昨天该第二周了。今天应该9点结束提交,等我写完就到了。 PWN 找不到且不对劲的flag 第1题是个nc测试,但也不完全是,因为flag在隐含目录里 高端的syscall 程序使用了危险函数,并且没有canary阻止࿰…...
Matlab矩阵——矩阵行列互换
问题:如何将 1*n 的矩阵转换为指定 M*N 的矩阵,或者将 M*N 的矩阵转换为 1*n 的矩阵? 处理方法:使用 reshape 函数进行矩阵的行列互换 分两种情况如下: 一、将 1*n 的矩阵转换为指定 M*N 的矩阵 假如有4个坐标值&a…...
OpenMesh 网格面片随机赋色
文章目录 一、简介二、实现代码三、实现效果一、简介 OpenMesh中的赋色方式与Easy3D很是类似,它统一有一个属性数组来进行管理,我们在进行赋色等操作时,必须要首先添加该属性才能进行使用,这里也进行记录一下(法向量等特征也是类似的操作)。 二、实现代码 #define _USE_…...

SpringSecurity源码学习一:过滤器执行原理
目录 1. web过滤器Filter1.1 filter核心类1.2 GenericFilterBean1.3 DelegatingFilterProxy1.3.1 原理1.3.2 DelegatingFilterProxy源码 2. FilterChainProxy源码学习2.1 源码2.1.1 doFilterInternal方法源码2.1.1.1 getFilters()方法源码2.1.1.2 VirtualFilterChain方法源码 3…...

8.2 JUC - 4.Semaphore
目录 一、是什么?二、简单使用三、semaphore应用四、Semaphore原理 一、是什么? Semaphore:信号量,用来限制能同时访问共享资源的线程上限 二、简单使用 public class TestSemaphore {public static void main(String[] args) …...
前端try和catch
为什么要使用try catch 使用try...catch语句是为了处理和管理可能会在程序运行过程中发生的异常或错误情况。以下是一些使用try...catch的主要原因: 错误处理:在开发过程中,无法避免地会出现各种错误,如网络请求失败、数据解析错误…...

Unity可视化Shader工具ASE介绍——2、ASE的Shader创建和输入输出
大家好,我是阿赵,这里继续介绍Unity可视化写Shader的ASE插件的用法。上一篇介绍了ASE的安装和编辑器界面分布,这一篇主要是通过一个简单的例子介绍shader的创建和输入输出。 一、ASE的Shader创建 这里先选择Surface类型的Shader,…...

目标检测算法改进系列之Backbone替换为Swin Transformer
Swin Transformer简介 《Swin Transformer: Hierarchical Vision Transformer using Shifted Windows》作为2021 ICCV最佳论文,屠榜了各大CV任务,性能优于DeiT、ViT和EfficientNet等主干网络,已经替代经典的CNN架构,成为了计算机…...

【技术干货】如何通过 DP 实现支持经典蓝牙的联网单品设备与 App 配对
经典蓝牙模块(Classic Bluetooth)主要用于呼叫和音频传输,所以经典蓝牙最主要的特点就是功耗大,传输数据量大。蓝牙耳机、蓝牙音箱等场景大多采用经典蓝牙,因为蓝牙是为传输声音而设计的,是短距离音频传输的…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作
一、上下文切换 即使单核CPU也可以进行多线程执行代码,CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短,所以CPU会不断地切换线程执行,从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...