利用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

附录:

审计日志过滤器配置说明:

mongodb日志存储 mongodb开启日志审计功能_MongoDB


过滤条件格式为:

"param.ns":{$nin:[  "admin.system.version"]},
  "param.command":{$nin:[  "isMaster,"ismaster""]}
  1. ns 代表对所有 atype 类型的 数据库.集合 过滤,因为上面是不包含集合admin.system.version所以 atype 没有名为 ns 的param也会记录,若换成包含或等于则atype 没有名为 ns 的param不会记录该类型日志。
  2. authcheck 类型日志包含所有的操作日志除了createCollection、createDatabase,所以当atype 包含authcheck 类型时,可以把其他类型日志去掉,否则会造成重复记录日志
  3. 对于同一个操作也会对应对个authcheck 类型审计日志,比如删除用户时,会记录两次审计日志,它们的command 一个为delete,另一个是dropUser,所以若想每个操作只记录一次审计日志,还要对command字段进行过滤,比如过滤掉dropUser这类日志,因为每个集合删除记录时都会记录delete日志,所以只能过滤掉dropUser。
  4. 不知道为什么会 command 会出现大小写问题,有的地方是首字母大写有的没有,所以有点类型要把两种都加上
  5. 默认authcheck 类型日志只会记录失败的记录,若想记录所有日志,在配置文件根下添加:
setParameter: { auditAuthorizationSuccess: true }
MongoDB运算符
  1. 比较
    $eq 匹配等于指定值的值。
    $gt 匹配大于指定值的值。
    $gte 匹配大于或等于指定值的值。
    $lt 匹配小于指定值的值。
    $lte 匹配小于或等于指定值的值。
    $ne 匹配所有不等于指定值的值。
    $in 匹配数组中指定的任何值。
    $nin 不匹配数组中指定的任何值。
  2. 逻辑
    $or 用逻辑联接查询子句OR将返回符合任一子句条件的所有文档。
    $and 用逻辑联接查询子句AND将返回两个子句都匹配的所有文档。
    $not 反转查询表达式的效果,并返回与查询表达式不匹配的文档。
    $nor 用逻辑联接查询子句NOR将返回两个子句均不匹配的所有文档。