基于C语言的DLP(数据泄露防护)核心实现

近年来,数据泄露事件越来越多,无论从外部合规要求还是内部安全需求,保障数据的完整性、一致性、可用性已经成为组织内部首要关注点。

组织内部数据可分为结构化及非结构化两种类型,结构化数据安全防护技术已经相对成熟,如数据库审计、防火墙、脱敏、加密、备份等产品可支撑数据生命周期下对数据的安全管控要求,但针对非结构化数据目前处于火热阶段,已是数据安全产品新的发力点,主要技术为DLP即数据泄露防护,DLP分为主机与网络两种监测方式,主机是通过在终端安装的防泄漏客户端实现文件扫描、截屏留证、传输管控等功能。另外是通过识别网络流量方式检测网络传输文件是否包含泄露内容。目前使用较为广泛、实施成本最低、客户容易接受的便是网络监测的方式。

本文主要介绍如何通过旁路镜像检测网络流量中相关文件,实现对敏感文件内容的防护。由于前期只考虑核心原理及技术最终实现,所以在代码方面还未来得及优化完善,另外我只通过解读pcap文件,识别doc文本一种环境,针对复杂环境还需完善。综上所述,本文知识探讨DLP核心技术实现原理和相关技术实现,所以代码层面会一定缺陷,还请见谅。

主机版DLP可依托开源openDLP进行实现,本文不进行介绍。

二、实现原理

通过镜像流量方式检测文件是否包含敏感内容,是否已经泄露,其实现方式流程为:1.采集网络流量;2.解析网络流量内容;3.根据文件头判断文件类型;4.导出tcp数据,根据判断的文件类型重命名文件,也可通过关键字转换成十六进制码进行在线匹配,如果匹配成功再进行文件保存留证;5.如果为图片,则通过OCR识别后进行判断,如果为非文字识别,可通过机器学习方式进行学习后再对图片进行识别。

我测试方式为,从网站下载一份word文档,另存为pcap文件,随后识别pcap文件中的文档类型并进行另存留证。

三、具体实现

  • 文件头基础介绍

在进行代码介绍前,首先需要了解文件头。网络流量对文件监测需要根据文件头进行判断,并根据文件头开始记录payload内容,下图为常见文件头内容(如不满足可自行搜索)。

基于C语言的DLP(数据泄露防护)核心实现

常见文件头

  • wireshark抓包

下图为进行文件下载时,wireshark抓包情况,首先可以看到发起了HTTP的GET请求,随后通过TCP分片进行文件下载。

基于C语言的DLP(数据泄露防护)核心实现

wireshark请求流程

当我们将文件头内容与wireshark抓包内容进行匹配时,可发现抓包数据中内包含doc文件头(d0 cf 11 e0),如下图:

基于C语言的DLP(数据泄露防护)核心实现

doc文件头

下载doc文件,打开效果如下:

基于C语言的DLP(数据泄露防护)核心实现

doc文件正常浏览

当我们对下载后的原始文件以十六机制方式查看时,其效果如下:

基于C语言的DLP(数据泄露防护)核心实现

doc文件十六进制方式浏览

可见与wireshark抓包数据中内包含doc文件头(d0 cf 11 e0)一致。

以TCP匹配包含文件头为开始,直至TCP流结束,中间所有内容结合起来便是doc文件内容。

由此对于文件及抓包数据间关系,我们已经有了初步了解,接下内容我将结合代码实现进行详细介绍。

  • 代码实现

首先代码分为匹配文件头、读取文件内容、文件数据拼接三个函数。

匹配文件头函数主要是通过file流、文件头内容、偏移量和数据长度进行匹配计算,最终记录至offset文件偏移量中。具体函数代码实现如下:

基于C语言的DLP(数据泄露防护)核心实现

匹配文件头

读取文件内容函数主要危读取文件流内容,将数据内容保存至file_content中。

基于C语言的DLP(数据泄露防护)核心实现

读取文件内容

文件数据拼接函数,主要是将多个TCP传输的数据文件进行拼接汇总,以便形成数据文件,方便输出成word(以TCP匹配包含文件头为开始,直至TCP流结束,中间所有内容结合起来便是doc文件内容。)。

基于C语言的DLP(数据泄露防护)核心实现

文件数据拼接

主函数。首先通过逐步读取pcap数据包内容,直至tcp环节。如下图:

基于C语言的DLP(数据泄露防护)核心实现

主函数-tcp环节

其次,匹配文件,判断是否包含所属文件头,如果包含则记录其开始位置,如下图:

基于C语言的DLP(数据泄露防护)核心实现

调用匹配文件函数

如果匹配到,则对应读取pcap中每次TCP流内容,并存储dlpT结构体中,如下图:

基于C语言的DLP(数据泄露防护)核心实现

读取数据内容

读取完毕后,将每次的TCP流内容进行汇集拼接,如下图:

基于C语言的DLP(数据泄露防护)核心实现

数据流拼接

以上内容,只用于第一个TCP流,即包含数据头文件的TCP流,至于中间TCP流,可通过五元组及ACK方式进行组合判断是否为同一个请求,如果为同一个请求,便读取其内容,如下图:

基于C语言的DLP(数据泄露防护)核心实现

读取TCP中间流内容

最后拼接TCP中间流数据内容,如下图:

基于C语言的DLP(数据泄露防护)核心实现

拼接中间流数据内容

需要注意的是,本次pcap中,有12位tcp option字段,测试用我写死了。该字段长度可变,可通过计算方式获得。option字段长度=数据包长度-ethernet头部14字节-IP头部20字节-tcp头部20字节-tcppaylod字节。

最终我们将拼接内容的,输出至文件,如下图:

基于C语言的DLP(数据泄露防护)核心实现

写入文件

文件效果如下:

基于C语言的DLP(数据泄露防护)核心实现

生成文件

基于C语言的DLP(数据泄露防护)核心实现

生成文件打开效果

基于C语言的DLP(数据泄露防护)核心实现

生成文件与源文件16进制对比

已上实现了对文件的提取与保存,针对如何进行敏感识别,由于原理已非常简单,我并未未进行实现。具体实现原理可以分两种,1.如读取word内容后与已设置的关键字进行匹配识别,如果匹配成功则可认定包含敏感字段,如果严禁一些可通过NLP自然语言进行处理后匹配。2.通过实时方式进行匹配,其实现原理为将汉字转换成十六进制,与pcap文件进行匹配,如果成功则告警并保存文件,如匹配“处理结果”,其unicode码如下:

基于C语言的DLP(数据泄露防护)核心实现

处理结果转Unicode

通过十六进制方式打开doc文件,“处理结果”的内容如下:

基于C语言的DLP(数据泄露防护)核心实现

处理结果-十六进制

doc文件十六进制与TCP流中数据是一样的。我们只需转换后通过十六进制匹配网络流数据即可实现实时的敏感数据匹配功能。

以上就是基于C语言的DLP(数据泄露防护)的核心实现,希望对你有所帮助。