MongoDB安全实战之审计

邓开表同学实战MongoDB系列文章,非常不错,赞!大力推荐!

本文主要讲诉MongoDB的审计能力。在数据库安全的生命周期中,包括:保护、检测、响应及补救。检测的核心就是审计(Audit)。有些情况下,审计不仅仅用于检测不好的行为,也作为对整个数据库的行为进行监控而存在。审计能够告诉我们谁访问了什么、在什么地方、什么时间、采用了何种方式。

1、前言

在数据库安全的生命周期中,包括:保护、检测、响应及补救。检测的核心就是审计(Audit)。有些情况下,审计不仅仅用于检测不好的行为,也作为对整个数据库的行为进行监控而存在。审计能够告诉我们谁访问了什么、在什么地方、什么时间、采用了何种方式。

有效的审计不仅仅意味着安全,也有助于数据库整体的完善。

MongoDB企业版包括审计mongod服务和mongos路由器能力。允许管理员和用户跟踪系统活动,支持各种操作审计。一个完整的审计解决方案必须包括所有的mongod服务和mongos路由器进程。

MongoDB的审计机构能够将审计事件日志以输出在控制台(console),syslog,JSON文件或一个BSON文件四种方式显示。具体如何配置审计,步骤如下:

2、启用和配置审计的输出格式

使用--auditDestination配置项来启用MongoDB审计和指定输出的审计事件。

2.1 审计日志输出到syslog,如:

mongod  --dbpath /var/lib/mongo  --auditDestination syslog

或者,在MongoDB配置文件设置,如下:

auditLog:
destination: syslog

2.2 审计日志输出到console控制台

mongod  --dbpath /var/lib/mongo  --auditDestination console

或者,在MongoDB配置文件添加以下配置:

auditLog:
destination: console

2.3 与console、syslog不同,为了使审计以一个JSON格式文件输出审计事件,需要指定auditDestination设置文件,并设置--auditFormat JSON,输出文件名--auditpath路径。

mongod  --dbpath /var/lib/mongo --auditDestination file --auditFormat JSON --auditPath /var/lib/mongo/auditLog.json 

或者,在MongoDB配置文件添加以下配置:

auditLog:
    destination: file
    format: JSON
path: /var/lib/auditLog.json

2.4与JSON文件相似,以BSON格式输出审计事件,需要设置--auditDestination为文件file,以及设置--auditFormat、--auditPath这两个配置项。

mongod --dbpath /var/lib/mongo  --auditDestination file --auditFormat BSON --auditPath /var/lib/mongo/auditLog.bson

或者,在MongoDB配置文件添加以下配置:

auditLog:
    destination: file
    format: BSON
path: /var/lib/auditLog.bson

使用bosndump命令将bosn文件转换成可读的信息输出在终端:

bsondump /var/lib/mongo/auditLog.bson

注意:JSON和BSON输出格式相比,以JSON格式输出对服务器性能影响比较大。

3、配置审计过滤器

MongoDB Enterprise版本支持各种操作的审计。当开启MongoDB审计时,默认情况下,记录所有审计操作,在审计事件的动作,详细信息和结果。如果需要指定要记录的事件,审计的特征,则在--auditFilter配置项。

--auditFilter配置项以一个查询文档的字符串格式表示。语法如下:

{<field1>:<expression1>,...}

<field1>: <字段>可以在审计信息的任何内容领域,包括在文档返回字段。

<expression>: 指查询条件的表达式。

3.1

3.1 审计内容领域主要包括以下:

字段

类型

记录描述

atype

string

记录审计事件的行动,详细信息和结果。

ts

document

文档包含”$date”日期键值对,其中是以时间戳格式的值

local

document

文档包含ip键值对,及port键值对

remote

document

文档包含与事件相关联的远程连接ip键值对和port键值对

users

array

用户识别文档数组。由于MongoDB允许登录不同的用户数据库,该数组可以有一个以上的用户。每个文档包含用户名的user字段和该用户身份验证数据库的db字段。

roles

array

指定给用户的角色的文档数组,每个文档包含角色名称的role字段和该角色关联的数据库的db字段。

param

document

定义审计事件的具体细节,详细可以查看表2

result

integer

错误代码

表1

3.2 审计事件行为,细节信息和结果

以下表2列出了每一个atype的相关参数细节和结果值:

atype

param

result

authenticate

{user: <user name>,db: <database>,mechanism: <mechanism>}

0-表示成功18-表示认证失败

authCheck

{command: <name>,ns: <database>.<collection>, (可选) args: <command object> (args可编辑)}

0-表示成功13-没有权限的操作

createCollection

{ns: <database>.<collection>}

0-表示成功

createDatabase

{ns: <database>}

0-表示成功

createIndex

{ns: <database>.<collection>,indexName: <index name>,indexSpec: <index specification>}

0-表示成功

renameCollection

{old: <database>.<collection>new: <database>.<collection>}

0-表示成功

dropCollection

{ns: <database>.<collection>}

0-表示成功

dropDatabase

{ns: <database>}

0-表示成功

dropIndex

{ns: <database>.<collection>,indexName: <index name>}

0-表示成功

createUser

{user: <user name>,db: <database>,customData: <document>,roles: [ { role: <role name>, db: <database> }, ... ]}

0-表示成功

dropUser

{user: <user name>,db: <database>

0-表示成功

dropAllUsersFromDatabase

{db: <database>}

0-表示成功

updateUser

{user: <user name>,db: <database>,passwordChanged: <boolean>,customData: <document>, (可选)roles: [ { role: <role name>, db: <database> }, ... ]}

0-表示成功

enableSharding

{ns: <database>}

0-表示成功

removeShard

{shard: <shard name>}

0-表示成功

shutdown

{}

0-表示成功

表2

例子1:

使用审计过滤器记录createCollection和dropCollection行为的审计。

mongod --dbpath /var/lib/mongo \
--auditDestination file  \
--auditFilter ‘{ atype : {$in: [“createCollection”,”dropCollection”] } }’ \
--auditFormat BSON \
--auditPath /var/lib/mongo/auditLog.bson

或者,在MongoDB配置文件添加以下配置:

auditLog:
   destination: file
   format: BSON
   path: /var/lib/mongo/auditLog.bson
   filter: ‘{ atype : {$in: [“createCollection”,”dropCollection” ] } }’

模拟在创建一个集合之后,再删除掉集合:

查看BSON审计输出文件信息:

bsondump /var/lib/mongo/auditLog.bson 

上面审计输出文件信息分别显示了,创建集合的时间,创建服务ip和端口及远程连接终端ip和端口及返回结果代码;删除集合的时间,创建服务ip和端口及远程终端ip和端口及返回结果代码。

原文发布于微信公众号 - 大数据和云计算技术(jiezhu2007)

原文发表时间:2018-02-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java一日一条

servlet/filter/listener/interceptor区别与联系

由于最近两个月工作比较清闲,个人也比较“上进”,利用工作空余时间,也继续学习了一下,某天突然想起struts2和struts1的区别的时 候,发现 为什么st...

592
来自专栏极客猴

详解 python3 urllib

本文是爬虫系列文章的第一篇,主要讲解 Python 3 中的 urllib 库的用法。urllib 是 Python 标准库中用于网络请求的库。该库有四个模块,...

761
来自专栏个人随笔

房上的猫:了解java与学习java前的准备

一.java  概述:   1.通常指完成某些事情的一种既定方式和过程   2.程序可以看做对一系列动作执行过程的描述   3.计算机按照某种顺序完成一系列指令...

3589
来自专栏程序员宝库

NGINX 宏观手记

任何一个工具都有它的灵魂所在,作为一个PHP程序员,我们可能仅仅使用了它的一小部分,这篇文章让你更加了解Nginx,本章大多都是总结、翻译、整理 ,希望你可以知...

471
来自专栏我是攻城师

如何在IDE中体验一把Java8?

3267
来自专栏架构说

河狸家:Redis 源码的深度剖析

大家好!我叫陈科,目前就职于河狸家,主要做架构方面的工作,今天和大家分享的是 Redis 的源码分析。 Redis 这个东西很简单,懂 C 语言的同学花一个下...

3487
来自专栏从零开始学自动化测试

Selenium2+python自动化3-解决pip使用异常

一、pip出现异常 有一小部分童鞋在打开cmd输入pip后出现下面情况:Did not provide a command ? Did not provide...

34210
来自专栏青玉伏案

Git知识总览(六) Git分支中的远程操作实践

前几篇博客陆陆续续的讲了好多关于Git操作的内容, 其中在上篇博客聊了《Git中的merge、rebase、cherry-pick以及交互式rebase》,本篇...

33611
来自专栏互联网技术杂谈

beanstalkc Tutorial 中文版

英文原版:https://github.com/earl/beanstalkc/blob/wip-doc-rtfd/doc/tutorial.rst

3028
来自专栏游戏杂谈

jscript调用bat注意事项

开发的游戏项目,需要一个工具,对指定的资源进行复制、加密,然后打包。之前打包时都手工操作,复制与加密这二步分别写了几个工具(lua加密与图片资源加密是分开的),...

873

扫码关注云+社区