查看原文
其他

安全数据分析:数据库

计算机与网络安全 计算机与网络安全 2022-06-01

一次性进群,长期免费索取教程,没有付费教程。

教程列表见微信公众号底部菜单

进微信群回复公众号:微信群;QQ群:460500587



微信公众号:计算机与网络安全

ID:Computer-network

关系数据库(RDBMS)是1970年Edgar Codd提出的,采用严格关联的数据模型,适应了当时的数据发展。


尽管对新型数据库技术大肆宣传,但是关系数据库仍然有用处。然而,关系数据库不应该是在解决问题、发现“异常”或整理安全数据时唯一的工具。在这里,我们将会通过安全用例探索这些新技术,同时,向您展示如何使用现有的RDBMS中的关系。


 SQL/RDMBS数据库基本概念 


可能您比较熟悉传统RDBMS系统,如MySQL、MariaDB、Oracle或PostgreSQL。


如果您没有关系数据库的初步经验,也许会比有经验的人更有优势,但是会对一些话题和参考内容感到困惑。下面简短的RDBMS系统介绍将帮助您理解一些基本概念。


绝大多数RDBMS系统有以下的核心属性:


数据以表的形式组织,列代表属性(字段),行存储独立的记录。举个例子,一个用于保存防火墙日志条目的RDBMS表应具备一种结构,该结构如图1所示,其行记录日志条目,独立数据元素被分割为:


一个独立的防火墙标识符(fw_id)

时间戳(ts)

源IP地址(src_ip)

源端口(src_port)

目标IP地址(dst_ip)

目标端口(dst_port)

接收/拒绝(action)

传输的字节数(num_bytes)


一个表或者表集合的完整结构被称作一个模式。

图1  防火墙、代理以及资产数据库表的图形表示形式

表中的数据以行和字段的形式被引用。“键”是一个独立字段或者字段的组合确保表中的每个记录能够独立识别,帮助区分表之间的关系。防火墙(图1a)和代理(图1b)表通过原IP地址(src_ip)“链接”到一起,并且它们又通过其id字段同时被“链接”到资产数据库(图1c)。


字段可以是一个或多个索引的一部分,这些索引是独立的数据结构,能够提供优化方法来组织字段中的数据,并能够极大地加速查找数据的操作。


数据通过一种结构化的查询语言(SQL)进行访问和操作。SQL被设计为以用户可读和独立于平台的方式执行插入、更新和删除行为,再加上对数据执行查询的功能。对于图1中的示例数据库,您能够在代理和防火墙表中对一个源IP地址的目标信息(时间戳和IP)进行查询,使用下面的SQL描述:

应用程序不应该依靠数据的物理结构。当需要决定在数据库中如何从物理上存储数据以及指示索引如何组织时,有很多选择。所有的选择应该能把应用或能够执行相同高级别查询的用户操作抽象出来,并能够忽略物理表示的变化。


关系结构,基本统一的查询语言和物理抽象属性是SQL数据库流行的主要贡献因素,特别是映射问题,如客户记录和销售订单映射到字段和行,是相当简单并“有意义”的。然而,关系结构并不适用于所有类型的数据或问题。


一、实现有约束的存储器


相比于Codd的时代,我们有充足的计算资源。内存、存储器、CPU和网络存储器都相对便宜,同时,在设计、构建和使用数据库时已不再需要适应物理存储器的底层架构。DBA这个职业变得越来越业余,与在任何一个Debian风格的Linux工具箱(对于Windows和MacOS有相似的简单的安装选项)中执行sudo apt-get install mariadb-server一样简单。在一些情况下,这种简单和普遍性会支持这样的谬论,即传统SQL/RDBMS数据库由于“缺少可扩展性和功能性”将会灭绝。


事实是现代SQL数据库可以与Web服务器、代理服务器防火墙和邮件服务器媲美,它们的开箱配置都是自适应模式。默认的功能和性能能够满足您的运行需求,当记录数和架构复杂性增加时还能表现良好。但是,当数据的种类或数量开始接近默认配置的边界,您就会遇到问题。了解最常见的约束类型很重要,因为您的SQL需求会增长,同时,在遇到问题时知道如何处理。


1、架构方面的约束


第一眼看上去可能不明显,但是以下两个简单的SQL表结构存在明显的差异:

对于新接触SQL的用户,第一段代码生成了包含IP地址src和dst字段(其值为字符串,作为“0”…“9”)的数据表,而第二段程序生成了一个表,其相应的字段被存储为宽度为10的无符号整数。


当您生成一个存储“网络”信息的表,为IP地址使用字符存储是很有诱惑力的,因为那就是人类与它们进行交互的方式。同时,仅仅把UNIX的时间戳看做是一个较大的整数也是很有趣的(如图1的ts字段),因为它就是那样。目标TCP/UDP端口从技术上讲也是整数。然而在处理这些选择时会存在一些显著问题。


如果src和dst字段都被索引了,您正在为单个IP地址发出查询,一开始您可能不会注意到任何问题,如下所示:

索引将快速找到包含src值的行,同时,数据库引擎将尽快将结果从硬盘传输到查询客户端。如果您没有那些字段的索引,那么相同的查询将要执行全表顺序扫描(a full table sequential scan),当您有百万行数据时,这将是一个耗时相当长的操作。


如果您需要找到一部分子网的所有匹配行,也许会生成复杂的正则表达式(regex)或将IP地址空间分割为多个片段,以便受益于SQL的LIKE智能查询前缀优化操作。否则您需要将子网分割为独立的IP地址,以便受益于全速查询。非优化的通配符搜索,特别是那些没有共同的前缀的情况,需要全表扫描,为每个字段值执行正则表达式的字符串比较。


通过转化IP地址的数字表示,您可以获得磁盘空间、内存大小和查询时间效率,因为很多索引类型都被优化用于数字范围的选择。从整数转化,或转化为整数和使用内置的INET_ATON或INET_NTOA函数一样简单。相似的,从一个整数的时间戳转而使用一个date字段将带来更直接的查询成分和提高查询的执行速度。最后,将dpt从一个整数转化为一个smallint将为每个记录节约2字节,这很重要,如果您打算使用内存表或应付数十亿条记录。


如果您经常处理特殊字段类型(如IP地址和地理位置数据),甚至可以考虑使用不同的数据库平台,如PostgreSQL,它具有自定义字段多样化的直接支持。


RDBMS模式还倾向于固定结构。尽管从已经存在的表中可以添加或移除列,但是这样做无论是在创建时还是以后都存在缺点。您会马上遇到空间的问题,因为这个操作使新的字段被添加到了每一行(不论是否必要),对于已经生成的较大的表结构,还会占用大量的时间。一些RDBMS系统会补偿这些问题,但是您正在成为专业的数据库管理员,不应该给人留下“业余数据库管理员”的印象。


 需要使用EXPLAIN来解决一些问题 


一个真正的数据库专家需要钻研一些黑暗艺术。SQL查询类似于魔法,错误的拐点可以彻底改变结果(通常是往坏的方向)。您可以通过EXPLAIN语句得到如何调整模式和优化查询的方法,这在大部分RDBMS系统中都是可用的。


XPLAIN将会很好地解释查询引擎会对SQL做什么而不实际执行。举个例子,如果要将AlienVault数据库装载到一个简单的SQL数据库中,如下所示:

为了得到来自中国(CN)的所有IP地址计数,您可能会发出以下查询:

您会发现加上EXPLAIN前缀后查询得到了很好的结果:

对于这个查询,没有使用键,所以这需要表扫描。可以通过在cc字段添加一个索引来优化:

并返回EXPLAIN来观察是否有变化:

在这种情况下,EXPLAIN输出显示SQL查询引擎识别了cc字段的索引,使用它可以减少被扫描的行数。


在更复杂的查询中使用EXPLAIN是一个好主意,特别是那些经常运行的查询。实际上当您的架构或SQL组合需要改进时,您可能会把瓶颈问题归结于“那些劣质、陈旧的SQL数据库”。


2、存储约束


个人用户已经能访问5TB的硬盘。对于这种一般用户商品的容量类型,难以想象一个数据库如何会受到存储的制约,更不用说企业级磁盘,通过更大、速度更快的磁盘和磁盘阵列有更多的选择。开源SQL数据库如MySQL或者MariaDB,拥有多达256TB的独立的表,它适用于,比如说,一个能够保存16 EIB数据的BTRFS文件系统。那么,到底“约束”是什么?


速度——如果分析需求是温和的,出于成本和方便部署的考虑,可以使用用户级设备。然而,给出用户驱动的设计方式后(它们不是设计来满足数据库的工作负载),5400RPM USB 2.0硬盘可能成为甚至是中等项目的瓶颈。您可以在一个用户存储阵列中使用用户磁盘,但这将只是暂时掩盖了问题。当您增加数据集的大小,如果分析工作流性能显著下降,就需要考虑投资速度更快、包含更多高速缓存的磁盘。而且,如果性能严重不足,那么是时候将设备更换为更快的企业级存储的商用服务器硬件设备,或者至少是固态硬盘,和一个合适的工业级存储阵列。


高速缓存——在执行大部分操作时,数据库同时使用硬盘和RAM。在DBA社区讨论RAM和高速缓存会挑起大量辩论,就如同在防御社区讨论桌面签名病毒一样。增加RAM的数量将使数据库运行得更快,特别是当需要反复发出同样的查询时(考虑一个反复的嵌套SELECT查询,但是有不同的SELECT声明)提速更加明显。RAM和硬盘高速缓存在将数据插入数据库时也是有用的,因为写高速缓存可以用于掩盖I/O瓶颈。


容量——您能在一个表中存储大量的数据不意味着您应该这样做。举个例子,您可以在一个RDBMS表中存储三年的企业防火墙日志数据,但这会带来很多问题,因为这会引起性能问题。通过在绝大多数现代的RDBMS系统中优化底层存储配置和使用可行的表分区技术,可以使一个查询的马拉松过程变成一个冲刺,并有可能保证所有的东西在一个系统上。


3、RAM方面的约束


缺少可用RAM或使用无法利用大量RAM的传统RDBMS是任何需要扩展的项目的厄运的预兆。数据库使用RAM(在其他事物之间)来缓存硬盘中的一部分表并缓存查询结果。更先进的SQL数据库还能使用RAM作为内存表。如果您知道必须常使用参照数据(如资产元数据,非经常变化的IP列表),在您进行连接(JOIN)、联合(UNION)和子查询(SELECT)时,将这些信息装载到内存SQL表能够得到大量好处。这通常和定义一个查询一样简单,它可以是一个现存表的行或字段的所有集合,需要填充一个内存配置。比如说,如果希望将AlienVault表中的所有IP地址存储到一个内存表中(来保证它呆在那里而不是依靠高速缓存保存),您可以执行以下代码:

最好避免消费级RAM,并选择高品质ECC(纠错码)内存,以避免数据损坏的风险。


4、数据方面的约束


确实有一些“安全数据”的例子能够适应关系模型,包括防火墙日志、Web服务器日志、反恶意软件日志和资产信息。上面每个例子资源都简单映射到相互连接的行和列。


为了优化数据库表结构和查询效率,Codd想出了归一化(normalization)的概念,它是一种描述方法,用于描述如何组织字段和表以便尽最大可能减少冗余和如何尽可能减小修改或扩展数据库架构带来的影响。“过归一化”一个数据库会让底层数据的处理更困难和复杂。“欠归一化”的数据库会增加应用代码或者存储程序的数据库复杂性,还会(很有可能)增加不必要的存储数据的大小。


归一化那些被设计用于适应表的表格式的数据往往是一个简单的任务。映射和归一化分层数据(比如JSON VERIS数据)意味着把层次结构转换成图的邻接表、物化的路径或嵌套集合,他们会增加查询的复杂性。您可以通过在特定的字段将JSON树的较大的块存储为BLOB(二进制大对象),以限制嵌套,但是这会导致查询变得复杂和缓慢,因为您对这些字段进行了全文本搜索。


RDBMS系统很适合大量不同问题集合和数据类型,但是他们不应该是您工具箱中唯一的工具,因为还有很多可用的用户选项。


Maria是是什么?


很多朋友都用过或者正在接触MySQL RDBMS。很多年里它都是初始“LAMP”(Linux/Apache/MySQL/PHP)中用于构建网站组件栈的基本元素。在Oracle收购MySQL后,出现了一个名为“MariaDB”的数据库,它是社区开发的一个分支。MariaDB是MySQL的插入式替换。您可以卸载MySQL(当然要保存数据),并安装MariaDB,所有东西都会正常运行。


MariaDB的版本和特性已经向MySQL的版本看齐了,但是显著的不同是发生了新的迭代,包括尖端的存储引擎的支持,动态列和NoSQL环境接口(Cassandra)。


选择MariaDB而不是MySQL、PostgreSQL或者传统商用RDBMS产品是您和您的安全分析团队必须要做出的决定,当然这个决定可能很大程度上依赖于公司需求。如果您“不能”使用MariaDB,那么它一定要成为您任务列表中的一个项目。

二、探索替代性的数据库


有许多长期存在的和新的数据库存储和数据库管理系统,它们避开了SQL的惯例和规范。这些技术大都是属于NoSQL(Not only SQL),这样便于对他们分类,但是也增加了一些困惑,因为他们每个系统的特性和功能是不同的。相比SQL,它们提供不同的方法来设计解决方案和存储信息,这样做是为了在结合数据分析制定安全策略时得到好处。下面介绍一些比较突出的例子,加上一两个安全用例,以便在您进行选择时能提供一些思路。


1、BerkeleyDB


Perl死忠们非常熟悉Berkeley DB(BDB),您可以找到R(RBerkeley)和Python(pybsddb)以及大多数其他脚本/编程语言的支持。BDB是一个本地(也就是嵌入式)键/值存储,正如其描述所表示的:它让您定义一个键并存储任何和它相关的数据,然后利用键执行高效的查找。根据它的定义,它不是一个关系数据库、一个面向对象的数据库、一个网络数据库或者一个数据库服务器。不同于RDBMS系统中的键和字段,BDB是与值无关的。


如果您曾接触过SpamAssassin的默认配置或postfix或者处理过开源LDAP服务器,如OpenLDAP,那么您已经遇到过BDB了。


键/值存储在以下场景中性能很好,数据写入很少,但读操作很多,比如说高速缓存。再一次考虑IPv4地址空间。如果您只需要缓存一个IP地址的某些属性(比如,地理定位数据或信誉数据)并只需要本地资源,让BDB成为您的平台有很多优点。它没有传统RDBMS数据库的开销(尽管现代版本的BDB“遵循”SQL语法)并能够优化键和值数据结构。另外,键和数据是独立于语言的(也就是说,您可以用R填充BDB存储,并用Python来读取他们,反之亦然)。下图展示了一个非常基本的用R存储IP地理定位的例子。

要注意R将返回一个关于数据库句柄在db_close()功能调用后不可使用的警告信息。这只是一个参考消息,可以将其忽略。


下图展示了一个相似的用Python读回相同数据的例子。

要将这个例子扩展到存储整个AlienVault数据库非常简单,通过IP地址索引,并使用存储在值部件中的其他相关字段。


Berkeley DB还有固态线程支持并延展到256TB。如果您的工作负载能处理磁盘寻道时间,您不希望被维护一个服务器进程或缓存的多节点基础设施的麻烦所困扰,如果您需要多平台或多编程语言支持,它确实是一个不错的选择。


 BDB替代品 


Oracle现在是Berkeley DB的所有者。尽管仍然使用的是GNU AGPL v3许可证,Oracle还是提供了一个具有授权选项的商业版本。如果您认为这可能在未来完全商业化,还有其他替代数据库,他们能提供相同的特性集,包括:


Kyoto Cabinet

MapDB


2、Redis


Redis是一个开源、具备BSD许可的高级键–值存储系统。仅从表面上看,人们很容易认为Redis仅仅是一个服务器版的键–值存储。它最基础的命令是GET和SET,而其基础数据类型是二进制数据串(因此您可以在键或值中存储任何类型的数据)。Redis实际上不仅仅是一种内存数据结构服务器,而且可以保存在硬盘中(因此具有其他有用的特性)。由于每个数据结构和元素必须适应内存以便进行Redis处理,所以内存需求不应被忽视。而这种约束可以防止您试图把大量相关或分层的结构硬填入Redis,而这也确实不是Redis设计的目的。


Redis作为一个数据结构服务器运行,其为四种基本存储类型提供了运行框架,这四种存储类型为:lists、hashes、sets以及sorted sets。


Lists存储单一二进制安全串,并将其插入列表前端(LPUSH)或者列表末尾(RPUSH)。List可以组成极好的消息队列结构,同时优于保持“最新的n个”元素可用。


Hashes以一种非常节约空间的方式提供可修改的区域来扩张键值NoSQL模型。您可以通过复制Berkeley DB定位来实现,直接源于Redis命令行:

主要区别在于,您可以通过网络上的任何客户端在数据库服务器中查询,而不仅仅是访问本地文件。所有信息都在内存中,查询可以再瞬间完成。


Set存储不重复的二进制安全串。这使其能很好地把元素关联起来做出快速的成员判断。比如,建立一个工作站集合,为每个节点分配一个IP地址,这就很容易判断数据包中的IP地址是否来自于工作区节点。

Sorted sets提供了一种方法将分级的值与一个数据集相关联。您可以通过利用Alien Vault数据库中各恶意主机对应的“风险”及“可靠性”字段的数值为各恶意主机建立相应的“风险”或“可靠性”的集合。您可以对这些已知的恶意主机试图访问您的资源保持计数(或您的资源试图访问这些恶意主机)。


 Redis高级特性 


Redis支持分区(partition)功能,这使您能够利用其他系统内存来保存部分Redis数据结构。这与您可以在MariaDB、MySQL、Oracle中分区表一样,突破单系统RAM限制。


Redis同样具有内置的发布-订阅(publish-subscribe)服务。通过这个功能,您可以建立大量客户端来订阅一个频道,这个频道可以用来发布一些输入记录,或者一些怀疑清单上的独立IP地址。当任何新的数据被插入时,每个客户端都将得到消息并采取一些行动,例如运行一组分析例程或解析信息并将信息存储到多个SQL及NoSQL数据库中供后续处理使用。


Python(redis-py)和R(rredis)对Redis提供了健壮的支持,并且API极易使用。假如您希望有一种集中并有效的方式知道您从外部资源获得的一个IP地址是否在受损害的范围中,这项需求不是通过在笨重的集中式日志管理系统中进行查询来完成,而是建立一个工作任务,从日志流中获得IP并将其以简单键值对或哈希的方式(包括所需的元数据)存储进集中式Redis数据库中来实现。watcher.py提供了一个如何“看”日志文件(在本例中,使用的是web服务器日志)并将其存储入Redis的Python示例。


watcher.py和lastseen.py作为独立的shell脚本(在每个文件中,按照各自的注释说明执行)在Cahopy环境中能更好地工作。同时您还需要运行一个Web服务器。为了能够完全模仿这两个例子,您可以通过在shell下使用sudo apt-get install nginx命令安装nginx(需要在watcher.py例中使用),并使用sudo/etc/init.d/nginx start命令产生日志输出。

lastseen.py展示了查询语句的组成。

现在,可以通过命令快速知道您是否见过某个IP地址。(使用一个您已知的地址来代替下面的24.62.253.107从而获得类似于下面的“已查找到”的结果。)

如果您在想,“我可以只用grep”,记住这是一个持续的流,涉及潜在的数以百计甚至数以千计的来源持续了几周或几个月不停的在线活动。如果您搭建了合适的架构,Redis总会战胜grep。


3、HIVE


如果您已经研究过或正在使用Hadoop,那么对Hive一定不会陌生。Hive位于Hadoop分布式文件系统的顶端,Hadoop系统可以将数据分散存储在数以千计的节点上。数据在各个节点上执行MapReduce任务。“map”组件获取大量的数据元素,将它们拆分为键/值对,供后续进行计算或比较。“reduce”组件获取到各“map”执行的结果,并将它们汇总为一个最终的结果集(这其中可能会包括一些其他的比较或者计算)。


 MapReduce Redux 


MapReduce是由谷歌创建的,其设计主要用于能够有效地计算大量节点集群(如数以千计的节点)中存储的数据。MapReduce通过将数据切分到整个集群中并安排一些工作节点,使之基于本地数据集合进行运算(map)从而得到一些中间结果。这些中间结果进而由其他工作节点整理、总结,得出最终结果(reduce)。图2展示了这一过程。

图2  MapReduce的图示

HIVE对HDFS的数据提供类似SQL的接口。Hive将这种复杂的SQL抽象出来,成为Mapreduce的任务,而不是要求使用者成为一个资深的Java程序员来编写、执行Mapreduce任务。这里有一点很重要:在Hadoop的体系中,所有操作都归结为基于大量数据的Mapreduce任务。在选择Hadoop作为分析平台的一部分时,建立Hadoop环境以及保证其正常运行的复杂度融入在了成本与收益的分析当中。


虽然Hive提供了SQL的便捷性,但是一些SQL的重要特性并没有包含进来。例如,Hive的查询语言(HiveQL)对SQL JOIN仅提供有限的支持。如果需要在不同条件下合并表,那么由于Hadoop MapReduce的限制,这时就不能通过Hive进行操作。在使用SQL的ORDER BY对结果集进行排序操作时,也需要留意,因为当前Hive仅使用一个简单的处理引擎来执行排序任务,这其中存在潜在的瓶颈。Hive以及HiveQL在使用中还有许多类似这样的微妙之处。您并不需要成为一名Java专家,但需要了解HiveQL查询是如何转化为MapReduce任务并且学习如何利用这个平台优化查询。


 使用Hadoop分析“一定规模的”Netflow数据 


如果您曾经参与过关于数据以及Hadoop的讨论,数量、速度以及多样性的概念会不可避免的被提到。


数量,指总共有多少数据。

速度,指数据的增长速度以及被处理的速度。

多样性,指摄取到以及需要被处理的数据类型的多样性。


大多数安全数据的各项指标都处于较低或中等水平。但是,即使在中等规模的网络中,Netflow数据也能够很容易地达到数量和速度的上限。


一条流信息被定义为一个具有一些相同属性的,通过同一网络设备的单向的数据包序列。这些收集到的流信息被传往外部设备:NetFlow采集器。网络流信息是高粒度的,例如,流信息记录包括了例如IP地址、数据包以及字节计数、时间戳、服务类型(TOS)、应用端口号、输入以及输出接口等细节信息。


NetFlow数据常被用于安全分析,但这也是一项具有挑战性的工作。例如,如果有10Gbps的链接,其中只有50%的利用率,这时每小时需要处理2.3TB的NetFlow数据。这明显是一个Hadoop的任务,因为输入数据流的汇聚以及存储可以被分发到一个大的集群上(那些数据会压垮一个单独的主机)并转换为Hadoop本地文件格式。然后,就可以开始设计MapReduce任务,例如执行异常检测或者分析DDos捕获模式。


一些工具,例如PacketPig能帮助减少一些枯燥的工作,如获取NetFlow数据并导入适于分析的环境,但是它不能抽象这类环境的复杂性。如果希望能开始对NetFlow数据进行分析,那么您需要熟练掌握许多NoSQL技术。


若时间、地点、人员以及预算充沛,并且通过一些用例搭建了Hadoop/HDFS/Hive,这将是一个很值得的投资。想象下这样的场景,将一整年所有系统、网络设备、防火墙、邮件服务器以及其中的所有日志文件存储进一个大规模、高效的数据仓库并能针对所有的元素进行基本查询。这正是Hive和Hadoop的力量所在。


 HBase、Cassandra、Pig又怎样呢? 


完整的Hadoop的生态系统正在以无情的速度扩张着。它自身环境的进展(例如Hadoop 2.0)、与其他环境的集成(例如Cassandra、MongoDB)以及独特的供应商特定产品都引入了新兴的、具有自己长处、侧重点和特质的替代品。


您需要分析所有可用的选项,并且把它们映射为您所认为的需求。然后,选择一个方向并坚持下去。Hadoop的分析环境(类似罗马)不可能在一天之内搭建完。尽管已经发展了一段时间,这个系统还远未成熟,您需要花些时间、通过一步步的努力来打造一个新的平台。

4、MongoDB


MongoDB可以被称为NoSQL数据库中的MySQL,因为其具有一个很大、很活跃的社区,并且在开发过程中部署灵活,同时在生产环境中还具有良好的扩展性。核心在于,根据平台的弱模式性质,Mongo提供了一种方案来实现原型设计的迅速建立。与传统的SQL类型的数据库在使用前需定义相关字段不同,Mongo允许使用者从基础、简要的模式开始,逐渐完善需求。


在进行下面的例子之前,先在shell终端下通过sudo apt-get install mongodb命令安装MongoDB并通过sudo/etc/init.d/mongodb start将其启动。


例如,可以在Linux shell提示符后输入命令实现在AlienVault信誉数据库中保存IP地理位置信息。

然后增加其他信息,例如该主机参与的恶意活动的类型。

如果给定了Mongo的存储方式以及模式管理的方式,您需要花费一定的精力来更新增加的字段。如果需要重新运行,还需要转储和重载数据库来再次获得存储空间和查询效率。


Mongo依赖JSON并且在API调用中使用二进制JSON(BJSON)。这意味着您可以舒服地使用JavaScript表示法并且保留JSONLintURL来帮助您在输入数据出现错误时方便地定位问题。JSON提供了存储深度嵌套或分层的记录及结构的能力,这些需要您重新思考规范化方面的观念。如果您习惯使用RDBMS规范化,那么就需要后退一步,忽略掉大部分您曾经学到的东西并拥抱广阔的NoSQL的宇宙吧。


例如,在AlienVault数据库的恶意节点中可能存在许多相关的恶意活动。在使用传统的规范化SQL时,需要建立一个单独的表,以主机名为键,包括恶意节点字段并为每个条目建立一行:

然后,通过执行JOIN来检索结果。在Mongo中,您可以在记录中将这些部分存储为JSON数组。

从这个简单的例子中可能很难看出增加这种额外复杂度的价值,但是如果回顾VERIS JSON,其中的优势就清晰多了。创建一个规范化的表结构来存储所有字段对于一个事件是可能的,但是没有必要赋予Mongo具有有效存储、处理以及复杂字段结构的查询能力。如果在之前的例子中,您已经安装了Mongo,您可以通过sudo apt-get install git命令安装git工具。这个工具在下图中需要使用,该工具可以在5分钟内从位于GitHub库(https://github.com/vz-risk/)的VERIS Community Database中下载并导入复杂事件的数据,并且在这之前不需要创建数据库或数据资料表模式。

如果记录的计数足够大,可以跨越多个Mongo节点,这些简单的查询在执行时将保持不变。Mongo也可以执行数据聚类,或甚至在整个集群上运行MapReduce任务,来模仿一些Hadoop和更传统的SQL数据库的功能。


在数据采集和清理过程中,可以将Mongo当做一种工具使用,在这里您可能已经在编程或脚本语言中使用了传统的内置结构。例如,日志处理功能是安全数据分析过程中不太光鲜的工作之一。它们具有不同的格式和大小,像思科IronPort的电子邮件日志就需要额外处理以便将其转化为适于分析的形式。请参见下图。

因为Mongo允许以增量模式构建,可以在解析日志文件时使用这个特性来为每条消息创建记录,然后逐步增加字段。最终,以一个完整的数据库或者是以一个看起来完整的记录的方式结束。Mongo对于之前记录的条目类似于下图的示例。

当所有的记录被成功创建,可以通过Mongo与Python,或R语言来进行时间序列分析、z轴缩放异常检测、聚类或者许多其他的分析。


 为什么Mongo不适用于所有场景? 


人们有可能会陷入试图使用Mongo处理一切问题的陷阱,特别是它会让您有点懒。尽管这对于一些任务来说是不错的,但是这个平台仍有一些缺陷。那么,您可能希望了解到在什么情况下Mongo是适合的:


记录计数的操作正在改进,但是仍然比其他数据库平台慢,因为Mongo在底层使用b树的数据库文件结构。


条目名称没有被压缩并且每条记录会按照其名称长短占用空间。这将导致在实际使用中查询语句的可读性不好,可能在其中会使用sip代替src_ip或source ip,使用u替代“username”等,除非您对这些数据非常熟悉。


维护操作仍然需要并且会造成损坏。您需要定期压缩数据库,这个操作会很耗费时间,并且会阻塞整个集群的操作。尽管也许在您的分析环境中不存在这样的问题,但是在使用Mongo向其他用户展示交互数据接口时,仍需小心。


在默认情况下,向Mongo数据库写入数据有点类似于UDP数据包的传送:“发送了,祈祷能被收到”。您需要对“write concern”选项进行明确设置来获得类似于TCP的行为。然而这个设置对性能有明显影响,因为需要保证汇总入Mongo的日志条目被成功写入。


5、特殊目的的数据库


关于到底是什么真正构成了数据库这个问题,不同的人会给出不同的答案。对于那些坚守在SQL世界中的人来说,NoSQL对他们的认知是强烈的侮辱。而对于那些已经习惯了NoSQL范式的人们,ElasticSearch和Neo4j这样的工具使他们感觉非常不适。


数据库在分析工作中担当着重要的角色:


1)标识数据源(例如,日志、传统数据库、告警信息)。

2)收集、转换(如果需要)以及存储数据。

3)查询数据存储。

4)提供基于查询结果的分析。


如果您选择使用纯SQL或NoSQL数据库,然后您需要自己执行大多数的安装及清理任务的工作,这需要像DBA那样熟悉底层数据库平台。


(1)ElasticSearch适用于日志存储


如果您更关注于数据的“分析”而不是导入数据的方式,您也许会对ElasticSearch这样的工具感兴趣。这个工具将后台抽象化并在前端提供输入、查询以及分析接口。


ElasticSearch能够处理送给它的所有数据并提供直接查询及数据导出方式。您只需要将半结构化或非结构化的数据送入其中,并合并入不同的域,从而使之支持智能查询。它利用一个全文本搜索层来关联多点NoSQL,这样做即使您需要查询大量数据也能在瞬间获得结果。它高度面向日志类数据并与Mongo类似,支持聚合框架。


如果在安全工作中您需要分析很多日志,可以考虑使用ElasticSearch。


(2)Neo4j适用于连接关系


许多信息安全领域的分析将关注点放在节点之间的连接上。您已经了解到网络图结构是如何使处理节点间关系变得更容易。尽管可以在SQL数据库或Mongo、Redis中建立图结构,但使用类似Neo4j的工具会使得这项工作更加容易,Neo4j提供了对网络图建模及操作的直接支持。


如果igraph操作让您着迷,那么您会对Neo4j中的特性有很深刻的印象,因为它基本上是横跨数百万或数十亿节点进行相似计算和分析。您可以从Netflow源、防火墙、代理、邮件以及dns日志中向Neo4j中导入高层次的顶点+边的关系数据,并将从这些来源中获取到的数据添加到连接和节点信息中。


在设计Neo4j时,您需要先在头脑中建立一个图模型并学习一门新的、图形专用查询语言Cypher来完成工作。然而,许多细粒度的工作中还需要您写一些JavaPython代码,或是使用Neo4j REST接口把查询结果输入到您选择的分析平台中。


三、结语


要成为一名真正的安全数据科学家,需要从已有的单一关系的数据库中转变思想。在解决实际问题时需要保持开放的观点,并了解到每种类型的数据库技术在处理具体任务时都有一些独特的好处。


本文结合一些小型实例展示了在不同SQL以及NoSQL数据库环境中的多种技术的概况。其中指出了其中的优势和弱点并提供了一些关于如何增强同传统SQL存储进行交互的建议。


您需要跟上数据库的发展脚步,包括SQL和NoSQL,从而了解到哪些地方在未来需要作出调整。如果您正在处理越来越多的数据,也许您需要花费更多一点时间在Hadoop生态系统中,从而可以了解到需要达到的水平以及正在面临的约束。


最后,您已经了解到数据库能够具有多种形式,这些形式被看作通往终点的手段(比如,日志解析),也可以作为数据库内部或其本身的一个终点。

微信公众号:计算机与网络安全

ID:Computer-network

【推荐书籍】

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存