官方公众号企业安全新浪微博
FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。
FreeBuf+小程序
0x00 背景
为了确定数据的价值,并建立数据价值相匹配的防护体系,我们引入了分类分级制度。通常,我们会碰到敏感数据单个类型的判定,比如姓名、手机号,idcard等,这些信息属于基本信息。还有企业内的基本信息,员工id,职位,余额等。而业务信息通常是这些基本信息的组合。企业最有价值并能采取防护手段的其实也是业务信息。为了建立良好的措施进行业务信息防护,我们需要分类分级业务信息。但是现实业务信息很复杂,比如员工信息包括了姓名、手机号、员工id、职位等,用户信息包括了姓名、用户id、余额等。而这两条信息看起来很类似。员工信息是企业私有信息,而用户信息是个人用户隐私信息,其背后的防护措施不一样,敏感等级不一样,其防护措施也不一样。
0x01 问题
分类分级建设,每个行业应该都有流程规范指南。在落地层面,就分类的精准度来讲,还很难达到数据安全的目的。举个例子,某业务数据库包含2个表,理想描述如下:
表1 | 表2 |
---|---|
手机号 | 手机号 |
话费 | 消费金额 |
月份 | 套餐类型 |
姓名 | 套餐名称 |
交易流水号 | 交易流水号 |
创建时间 | 创建时间 |
注意,实际表字段基本是以英文作为字段名,并且通常以非标准的命名,比如手机号可能用phone、tel、t_num等命名,单个字段的识别属于敏感数据识别的范围,暂不在此讨论。从企业业务(以移动集团为例子)类型里我们可以人工识别,将表1归为为话费单(C1-3消费信息和账单)。而表2归为订阅套餐(C1-1:业务订购关系)。这是比较理想的数据分类例子。然而对于程序来说,往往无法很好的判断出话费和消费金额的区别,月份和套餐类型的类型,这种字段信息模糊的场景,我们在实际企业数据安全建设过程中经常遇到。还是以上面例子来看,实际识别的表如下:
表1 | 表2 |
---|---|
手机号 | 手机号 |
金额 | 金额 |
未识别 | 未识别 |
姓名 | 套餐名称 |
交易流水号 | 交易流水号 |
创建时间 | 创建时间 |
这种情况下,2个表都无法完全匹配给话费单和订阅套餐表,那么有没有一种有效的匹配算法,可以量化匹配度,得到较为满意和可解释的结果呢?我们引入了一种评价技术,基于欧氏向量空间的分类技术。
0x02 欧氏向量空间
a)欧氏向量空间也叫线性空间。比如对于一个二维坐标系,那么每个点的位置就是一个二维向量空间(x,y)。如果有2个位置为:(x1,y1)、(x2,y2)。那么两点之间距离为:√(〖(x1-x2)〗^2+〖(y1-y2)〗^2 ).一般地,对于N维线性空间,两个位置为(a1,a2…,an),(b1,b2…bn),他们的距离(范数)为:√(〖(a1-b1)〗^2+〖(a2-b2)〗^2+⋯+〖(an-bn)〗^2 ). 我们认为,两个位置的向量距离越短,他们的相似度越高,当距离为0,则表示2个位置完全相同。
b)数据分类,即识别一组数据,并划到预定义的业务类型。如前所述:
我们将数据分类最佳匹配问题转换为多维空间求最短距离问题。通过以下步骤来实现:
1、初始化N种数据类型数组,其值为1。
2、每个具体分类根据行业的规范,会预定好模板,分配好数据类型组合(0或者1),形成一个N维数组。
3、识别标记数据的类型,并按第一步所示排序填充为一个N维数组。
4、与每个分类计算欧氏距离,得到包含N个距离值。
5、按距离排序,取最小值所属分类,即为最可能的分类。
举个例子,以开头说的员工信息和用户信息来演算,员工信息=(姓名、手机号、idcard、职位),用户信息=(姓名,手机号,idcard,余额)。
1、初始化所有数据类型:
姓名=0,手机号=1,idcard=2,余额=3,余额=4,用做标记数组下标。
数据类型数组=[1,1,1,1,1]
2、内置分类模板:
员工信息=[1,1,1,1,0].
用户信息=[1,1,1,0,1].
3、现在假定出现了一条数据,包含姓名,手机号,余额、idcard,我们将其排序得到
待匹配数组=[1,1,1,1,0]。(将不存在数据类型数组的字段置为0)。
4、与每个模板进行匹配,得到
距离1(员工信息)=0(所有元素差异为0)
距离2(用户信息)= 1.41(最后2个不一样)
5、排序,得到该信息与员工信息匹配度更高,我们判定该数据为员工信息。
0x03 考虑权重问题
我们在前面简单举了例子以说明该算法在最佳匹配上的用法,那如果其中某些元素特别关键,我们称为核心属性。而上面算法无法针对核心属性加权计算。比如员工信息如果有一个字段是岗位,那么一旦一条信息中出现岗位,我们应该提高该条信息属于员工信息的概率。而如果不进行优化算法,当碰到一条数据包含:姓名、手机号、idcard、余额、岗位的时候。会发现两个匹配值一样(都是1.41)。如果我们将岗位权重调整为2,上述计算过程如下:
1、初始化所有数据类型:
姓名=0,手机号=1,idcard=2,岗位=3,余额=4,用做标记数组下标。
数据类型数组=[1,1,1,2,1]. (注意,我们相比上面的例子,将岗位的权重调整为2了)
2、内置分类模板:
员工信息=[1,1,1,2,0].
用户信息=[1,1,1,0,1].
3、现在出现了一条新数据,包含姓名、手机号、余额、idcard、岗位,我们将其排序得到待匹配数组=[1,1,1,2,1]。(将不存在数据类型数组的字段置为0)。
4、与每个模板进行匹配,得到
距离1(员工信息)=1(余额字段不匹配)
距离2(用户信息)= 2(岗位字段不匹配)
5、排序,得到该信息与员工信息匹配度更高,我们判定该数据为员工信息。
0x04 总结
通过该算法,我们成功的摒弃了传统的基于规则和人工优先级排序的方法来解决分类歧义问题,并且额外得到了一系列最佳结果推荐值。当然这里还有一些依赖于人工经验的问题,比如所有类型匹配度都很低的时候,还是会选举一个最匹配的分类。所以实际处置过程,需要设置一个合适的阈值,低于该阈值的结果,都不计入有效范围,以防止误报。