一、数据固定
Mongodb数据库
Mongodb是面向集合的文档式数据库,不像关系数据库有表、列和行,Mongodb数据库是由一系列的文档组成,先介绍几个关于Mongodb的基本概念。
首先是文档(document),文档是Mongodb中数据的基本单元,非常类似关系型数据库中的行;其次是集合(collection),集合就是一组文档,如果把文档理解成为关系型数据库中的行,那么集合就类似关系型数据库中的表,Mongodb默认端口号为27017,同时Mongodb默认不会开启登录验证。
Mongodb数据库连接方式及查看数据(手动固定)
手动固定时,在bin目录下执行“./mongo”进入数据库,执行“show dbs”可以查看当前数据库下的所有实例。
手动固定时,执行db命令可以查看当前连接在哪个数据库下面,如果想要切换到其他数据库可以使用use dbname命令,使用show collections可以查看当前数据库下的所有集合,也可以理解成为查看当前数据库下的所有表。
使用db.collectionName.find()可以查询集合(表)中的全部数据,Mongodb数据库的查询语句跟传统关系型数据库的语句还是有很大差别,在find后面的括号里面可以加入任意的筛选条件来简单的筛选表里面的数据,来得到想要的结果。
Mongodb数据库常用提取固定方法(手动固定)
在日常的现场提取固定的工作中,我们通常针对某个单表的数据和数据库的全量备份进行手动恢复和分析。
下面就介绍一下关于Mongodb数据库在没有专用取证工具的情况下,如何导出单表数据和手动全量备份数据库?
首先是提取Mongodb中单个表的数据,根据上面说的,可以把Mongodb的文档理解成为表的行,集合理解成为整个表,所以在做单表数据导出的操作时是对Mongodb的集合(collection)进行导出,这里需要注意的是在对集合进行导出时可以指定导出文件的格式,导出文件分为JSON和CSV两种格式,可以在命令中通过参数指定导出的格式。
手动固定的导出语法如下:
mongoexport -d dbname -c collectionname -o filename –type json/csv -f field
导出语法的参数说明:
- “-d ”数据库名;
- “-c” collection名;
- “-o” 需要输出的文件名;
- “-type” 选择输出文件的格式;
- “-f” 输出的字段,这里需要注意的是默认输出的格式为json,如果type输出格式选择的是csv,则-f后面需要加上字段名。
示例:mongoexport -d testdb -c users --type csv -f “id” -o /tmp/user.csv
其次是固定整个数据库,也就是对数据库做一个全量备份,固定当前数据库所有数据,使用mongodump命令对数据库进行全量备份。
备份语法:
mongodump -h dbhost -d dbname -o dbdirectory
语法参数说明:
- “-h” 数据库所在服务器地址,也可以指定端口号,127.0.0.1:27017;
- “-d”需要备份的数据库实例名称;
- “-o”备份数据存放的位置。
数据库备份完成后可以通过mongorestore命令将备份文件还原到自己搭建的数据库中,查看备份文件中的数据。
还原语法:
mongorestore -h dbhost -d dbname --dir dbdirectory
语法参数说明:
- “-h” mongdb所在服务器地址;
- “-d” 需要恢复的数据库实例;
- “--dir” 备份数据所在位置,在正常情况下的备份还原数据库操作时需要将原先数据库里面的实例删除再进行导入备份操作,但是在取证和固定的环境下必定不能在原始数据库上进行操作,所以就不需要进行删除原始数据库的操作。
Mongodb数据库连接方式及查看数据(工具固定)
通过弘连网探勘验软件(以下简称网探)连接到Mongodb以后我们可以通过点击管理,来查看当前数据库中所有的实例,以及实例中表的数据。
网探的数据库管理界面我们可以通过鼠标的点击来切换数据库,同样也可以用鼠标的点击来查看每个数据库下的所有集合。
Mongodb数据库常用提取固定方法(工具固定)
上面讲过Mongodb数据库在没有专用工具的情况下,如何去提取固定单张表的数据和整个数据库的数据,下面结合网探介绍一下如何用工具固定Mongodb数据库。
通过网探我们可以使用数据库管理功能对其中的集合进行导出操作,对应的也就是手动固定里面使用命令导出表的操作。
我们还可以通过网探的一键提证的功能对数据库进行提取和固定,一键提证功能可以提取固定数据的配置信息、日志信息及数据库的数据。
同样我们可以通过一键提证功能导出整个数据库的BSON文件备份。
Mongo数据库配置文件及开启登录验证
上面提到过Mongodb默认是不开启密码认证的,若需要开启密码认证需要更改配置文件及添加用户操作。Mongodb默认有两个数据库,admin和local数据库,local数据库主要存储副本集的元数据,admin则存储的是Mongodb的用户、角色等信息。
Mongodb的密码跟传统数据库(mysql、oracle)还是有区别的,Mongodb的用户名和密码是基于特定数据库,不是基于整个系统,所以所有实例都需要配置用户和密码,首先更改mongod.conf里面security:authorization为enable,再选择要创建用户密码的数据库使用命令db.createUser来创建用户名和密码。
所以在取证固定的工作中一定要判断好需要哪个数据库中的数据及数据库的用户名和密码。
在Mongodb的配置文件中需要关注的是systemLog、storage、wireTiger、net和security部分,我们也可以通过网探来获取到Mongodb的配置文件路径,并且可以在网探中打开查看配置文件,具体的配置文件解析在下图:
有时,因案件情况不同,复杂程度不一,数据固定需求也不尽相同,则技术人员就需要采取不同的固定方式方法,才能拿到理想的证据。
二、日志分析
MongoDB中主要有四种日志,分别是系统日志、Journal日志、慢查询日志、oplog主从日志。
Q1系 统 日 志
系统日志记录了MongoDB启动和停止的操作、服务器在运行过程中发生的异常信息,日志格式为:
其中NETWORK代表了日志的分类,表示网络相关信息的日志,例如网络连接信息。还有其他的一些提示代表了不同类型的日志信息。
Q2
Journal日志
Journal日志保证了数据库在意外断电等意外情况下的数据完整性,它通过预写式的redo日志为MongoDB增加了额外的保护,开启此功能,MongoDB会在进行写入操作时建立一条Journal日志,其中包含了此次写入操作具体更改的磁盘地址和字节,如果此时服务器突然断电关机,再次启动时可对日志进行重放,重新执行那些停止前没能刷新到磁盘的写入操作,MongoDB配置WiredTiger工具使用内存缓冲区来保护Journal记录。
由于MongoDB使用的journal文件大小限制为100MB,因此WiredTiger大约每100MB数据创建一个新的日志文件,向MongoDB中写入数据时,先写入内存,然后每隔60秒再写入磁盘。同样写入journal时,也是先写入对应的buffer,然后每隔50ms在写入到磁盘的journal文件。
Journal除了故障恢复的作用之外,还可以提高写入性能,批量提交。在这个过程中,所有的写入都可以一次提交,是单事务的,全部成功或者全部失败。
启动数据库的Journal功能在配置文件中修改就可以,Journal日志在取证工作中的作用主要是为了恢复删除数据时使用。
Q3oplog主从日志
在讲oplog主从日志和慢查询日志之前,首先我们一起了解一下固定集合。
MongoDB中的普通集合是动态创建的,而且可以自动增长以容纳更多的数据。MongoDB中还有另一种不同类型的集合,叫做固定集合。固定结合需要先创建好,而且他的大小是固定的。固定结合的行为与循环队列一样,如果没有空间了,最老的文档会被删除以释放空间,新插入的文档会占据这块空间。
MongoDB的高可用复制策略有一个叫做副本集。副本集的复制过程中有一个服务器充当主服务器,而一个或多个充当从服务器,主服务器将更新写入oplog,oplog记录着发生在主服务器的更新操作,oplog是主节点的local数据库中的固定集合(oplog.rs)中,并将这些操作分发到从服务器上。
源自网络公开资源
每个备份节点都维护着自己的oplog,记录着每一次从主节点复制数据的操作。这样,每个成员都可以作为同步源给其他成员使用。
备份节点从当前使用的同步源中获取需要执行的操作,然后在自己的数据集上执行这些操作,最后再将这些操作写入自己的oplog,如果遇到某个操作失败的情况(只有当同步源的数据损坏或者数据与主节点不一致时才可能发生),那么备份节点就会停止从当前的同步源复制数据。
oplog中按顺序保存着所有执行过的写操作,副本集中每个成员都维护着一份自己的oplog,每个成员的oplog都应该跟主节点的oplog完全一致。
如果某个备份节点由于某些原因挂了,但它重新启动后,就会自动从oplog中最后一个操作开始进行同步。由于复制操作的过程是复制数据再写入oplog,所以备份节点可能会在已经同步过的数据上再次执行复制操作。MongoDB在设计之初就考虑到了这种情况:将oplog中的同一个操作执行多次,与只执行一次的效果是一样的。
oplog就是一个固定集合,MongoDB默认将其大小设置为可用disk空间的5%(默认最小为1G,最大为50G),也可以在MongoDB复制集实例初始化之前将mongo.conf中oplogSize设置为我们需要的值。它只能保持特定数量的操作日志,并且如果执行大量的批量操作,oplog很快就会被填满。
oplog日志
Q4慢查询日志
慢查询日志中记录了MongoDB中耗费较多资源的执行语句,通常作为优化数据库的依据,在慢查询日志中可以看到慢查询日志种类,例如:插入操作、删除操作、查询等,是我们优化查询的依据。
Q5日志分析专用工具推荐
以上就是系统日志、Journal日志、oplog主从日志及慢查询日志的简单介绍。
在日常的提取固定工作中,要对系统日志重点关注一下,因为其中记录了数据库的各种行为信息,手动可以查看系统日志内容,但是在分析的过程中需要快速定位到某一行还是比较困难。
我们可以使用专业的分析工具(弘连网探计算机/Linux勘验软件,如下图),通过该工具提供的日志查看功能,打开日志并利用其中查询功能快速定位到自己需要的日志位置。
同时我们在对系统日志进行分析时需要关注上文表格中提到的日志参数,每个参数代表一种行为,我们可以参照上文中的表来对比日志中的行为来判断数据库的格中行为,网探会自动帮我们列出系统日志的路径,双击就可以打开系统日志进行查看,在利用上面说的日志查看工具的搜索功能就可以很方便的对系统日志进行分析。
总体来说,MongoDB有以上四种日志,其中系统日志和journal日志是物理文件日志,而oplog主从日志和慢查询日志其实是MongoDB中的固定集合。oplog主从日志被放在local库下的oplog.rs集合中,慢查询日志被放在当前库下system.profile集合中。
因为MongoDB中的journal日志类似于MySQL的redo日志,oplog日志类似于MySQL的binlog,所以可能有人会问journal日志和oplog主从日志的顺序。其实我们仔细思考可以明白:oplog是MongoDB的一个固定集合,与其他的集合没有其他区别,所以是先写入journal日志的。
三、删除恢复
我们知道MongoDB数据库配置WiredTiger工具使用内存缓冲区来保护Journal记录。那么我们能否通过WiredTiger工具的数据打捞功能去恢复数据呢?
例如,在取证过程中发现一个云版本MongoDB,其中部分数据非常关键,通过工具连接数据库查看发现,目标库容量大小为0,疑似数据库被删除。
执行“show dbs”命令,显示目标库大小为0
这时,我们优先考虑使用备份去做数据库的删除恢复,经过查看该数据库备份策略是每天一次全量备份,30天为一个周期(也就是说,30天之后会清除所有备份文件重新进行备份)。
该数据库在上一个周期内就被删除数据,所以后面所有的备份都会是0。仔细检查数据库被删除后的残留备份文件,也许会发现备份中可能会包含一些WT文件(WiredTiger 文件),也就是一些源文件,我们就可以利用这些源文件进行删除恢复的操作,看看能否恢复出被删除的数据。
— 如何删除恢复?—
(思路分享)
01使用WiredTiger工具恢复
每个MongoDB数据库的集合/索引都对应一个WiredTiger Table,集合名跟Table名的映射关系保存在元数据里面,只有通过这部分元数据,才能获得这个映射关系。集合的数据对应“collection-uniqueid-hash.wt”文件,索引的数据对应“index-uniqueid-hash.wt”文件。
MongoDB数据库所有集合的元数据,都存在一个特殊的WiredTiger Table里,名字叫“_mdb_catalog”、“mdb_catalog.wt”文件里存储了MongoDB数据库中所有集合的元数据,数据库启动时需要从这个文件中读取相关信息这里可以看出,MongoDB数据库的元数据对于WiredTiger来说其实也是普通数据。
根据下图,我们可以看到有许多以“.wt”结尾的文件,我们只需要“collection***.wt”文件,这是数据库中集合所对应的数据文件。
我们就可以使用WT工具对数据进行尽可能地恢复,首先下载WT使用工具包,再用Windows环境下编译出可执行的WT工具。
下载WT使用工具包
编译出的可执行文件
准备好要恢复的“collection***.wt”,以及读取它必备的“_mdb_catalog.wt、sizeStorer.wt、storage.bson、WiredTiger、WiredTiger.basecfg、WiredTiger.lock、WiredTiger.turtle、WiredTiger.wt”(如下图),可以把这些文件放到一个新的目录里面。
然后使用WT工具,先对数据库的集合文件中的数据进行清洗,使用下图中的命令对需要进行打捞的数据进行清洗。
完成后,会把打捞出来的健康的wt文件dump到上级目录的“collection.dump”文件,注意这一步操作指定的collection不需要写wt扩展名。
这时,我们就已经把数据库的各个集合文件中的全部可用数据提取出来了。
下一步重新创建一个数据库,根据提取出来的集合文件,创建对应数量的空集合,然后使用WT工具,将提取出的文件一一写入到新创建的空集合中,这个时候就可以通过查询集合中的数据,确认这些集合与元数据的对应关系。
02从文件里提取BSON文档来恢复
有另外一种情况,如果wt文件也损坏了怎么办?wt数据文件中,数据库记录以BSON格式存储的,并默认通过snappy进行了压缩。数据默认没有进行加密。
MongoDB json格式的文档最终都是以BSON(Binary json)格式持久化存储,我们也可以通过从文件里提取的BSON文档来尝试恢复数据。
数据库被恶意破坏这种极端情况,是所有人都不想遇到的。
以上就是MongoDB数据库在没有备份或者数据库某些文件遭到破坏无法启动时,可以用来恢复数据的两种思路,希望能给大家带来帮助。