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和端口及返回结果代码。
- 代码也疯狂:diagram生成流程图
- 设置你的Gravatar头像的方法
- 阅读Ext 学习Javascript(二)Core/Ext.extend 从继承说起
- IronPython资料
- WordPress免插件仅代码实现“返回顶部、返回底部、评论”效果(样式一)
- encodeURIcomponent编码和ASP.NET之间编码转换
- WordPress免插件仅修改代码去掉评论/留言里的链接
- 阅读Ext 学习Javascript(一)Core/Ext.js
- 利用腾讯的ip地址库做ip地址定位
- WordPress登陆不了后台的原因及解决方法(登陆界面不断返回)
- select元素的options.add 与 insertbefore的区别
- 如何去理解 拓扑排序算法
- WordPress免插件仅代码实现文章归档(模板页面)I
- Bing Map App 开发 还没入门遇见错误无法继续
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CSP
- Saltstack_使用指南07_远程执行-执行模块
- 学习从拥有一支好笔开始
- Saltstack_使用指南08_远程执行-返回程序
- 人生苦短,何不用vim装13
- Saltstack_使用指南09_远程执行-编写执行模块
- 如何安装FreeIPA
- 编译及使用hive-testbench生成Hive基准测试数据
- 树酱的前端知识体系构建(下)
- Babel配置傻傻看不懂?
- Saltstack_使用指南10_配置管理-状态模块
- Saltstack_使用指南11_配置管理-状态之间依赖关系 4.1. 部署架构4.2. Apache和PHP的SLS【正向依赖】4.3. mariadb 的 SLS
- 前端工程化之CICD那点破事
- Saltstack_使用指南12_配置管理-jinja模板 4.1. 部署架构4.2. 本章涉及的 pillar 的信息4.3. 配置文件 httpd.conf 修改
- Saltstack_使用指南13_runner的job和manage与execution的saltutil 5.1. master执行5.2. 查看当前活动的jobs