利用MongoDB自带的审计功能可以记录对MongoDB数据库的每个操作,但它自带的审计功能只能把日志记录到console、syslog或者file中,不利于日常查看统计,这里讲一下审计日志的配置及导入数据库中。
审计日志配置
在配置文件中添加如下代码即可启用审计功能:
# 审计日志设置
auditLog:
destination: file
format: BSON
path: /home/zzz/mongodb_ser/data/audit.bson
设置审计日志过滤功能
# 审计日志设置
auditLog:
destination: file
format: BSON
path: /home/zzz/mongodb_ser/data/audit.bson
filter: '{ atype:{ $in: ["authCheck","createCollection","createDatabase"] },"param.ns":{$nin:[ "admin.system.version"]},"param.command":{$nin:[ "isMaster","ismaster","saslStart","saslContinue","listCollections","listDatabases","listIndexes","collStats","find","getlasterror","buildinfo","getLastError","aggregate"] } }'
setParameter: { auditAuthorizationSuccess: true }
上面配置可以记录大部分操作日志,又不会把没用的日志记录下来,可以节约空间。具体过滤设置可以参考下面附录里。
将审计日志导入到数据库
首先创建一个审计日志导入用户及数据库,使用admin登录,必须在auditdb数据库中创建用户,否则下面的导入代码无法运行。
zzz@zzz-vb:~$ /mongodb/bin/mongo localhost:27017/admin -uadmin -p123456
MongoDB shell version: 3.2.22
connecting to: localhost:27017/admin
MongoDB Enterprise > use auditdb
switched to db auditdb
MongoDB Enterprise > db.createUser({user:"audit",pwd:"123456",roles:[{role:"readWrite",db:"auditdb"}]})
然后创建一个可执行文件audit.sh,并填入下面代码即可,每运行一次文件都会把审计日志中的日志导入到数据库中,并删除审计日志。
echo "导入审计日志开始"
/home/zzz/mongodb_ser/bin/mongorestore -h localhost:27017 -uaudit -p 123456 -d auditdb -c auditLog /home/zzz/mongodb_ser/data/audit.bson
wait
echo "导入审计日志结束"
echo "关闭MongoDB"
/home/zzz/mongodb_ser/bin/mongod -f /home/zzz/mongodb_ser/mongo.yml -shutdown
current_date=`date -d "-1 day" "+%Y%m%d"`
mv /home/zzz/mongodb_ser/data/audit.bson /home/zzz/mongodb_ser/data/audit_${current_date}_.bson
wait
echo "重新启动MongoDB"
/home/zzz/mongodb_ser/bin/mongod -f /home/zzz/mongodb_ser/mongo.yml
附录:
审计日志过滤器配置说明:
过滤条件格式为:
"param.ns":{$nin:[ "admin.system.version"]},
"param.command":{$nin:[ "isMaster,"ismaster""]}
- ns 代表对所有 atype 类型的 数据库.集合 过滤,因为上面是不包含集合admin.system.version所以 atype 没有名为 ns 的param也会记录,若换成包含或等于则atype 没有名为 ns 的param不会记录该类型日志。
- authcheck 类型日志包含所有的操作日志除了createCollection、createDatabase,所以当atype 包含authcheck 类型时,可以把其他类型日志去掉,否则会造成重复记录日志
- 对于同一个操作也会对应对个authcheck 类型审计日志,比如删除用户时,会记录两次审计日志,它们的command 一个为delete,另一个是dropUser,所以若想每个操作只记录一次审计日志,还要对command字段进行过滤,比如过滤掉dropUser这类日志,因为每个集合删除记录时都会记录delete日志,所以只能过滤掉dropUser。
- 不知道为什么会 command 会出现大小写问题,有的地方是首字母大写有的没有,所以有点类型要把两种都加上
- 默认authcheck 类型日志只会记录失败的记录,若想记录所有日志,在配置文件根下添加:
setParameter: { auditAuthorizationSuccess: true }
MongoDB运算符
- 比较
$eq 匹配等于指定值的值。
$gt 匹配大于指定值的值。
$gte 匹配大于或等于指定值的值。
$lt 匹配小于指定值的值。
$lte 匹配小于或等于指定值的值。
$ne 匹配所有不等于指定值的值。
$in 匹配数组中指定的任何值。
$nin 不匹配数组中指定的任何值。 - 逻辑
$or 用逻辑联接查询子句OR将返回符合任一子句条件的所有文档。
$and 用逻辑联接查询子句AND将返回两个子句都匹配的所有文档。
$not 反转查询表达式的效果,并返回与查询表达式不匹配的文档。
$nor 用逻辑联接查询子句NOR将返回两个子句均不匹配的所有文档。