用 MongoDB 要小心一点

阅读 14
标签: MongoDB

在MongoDB推出早期,它以灵活、快速开发而火,抢占了一波市场。

但是,它在安全上做得非常粗糙!最让我不可思议的是:它的服务启动后,默认是没有设定密码的,除非你进行显式指定。

很多不熟悉的小白在安装完成后,其数据库就是处于大门敞开的状态。任何一个人,只要知道它的服务器IP地址和端口号(默认为27017),就可以在其中自由玩耍了。

我自己比较小心,会开启密码,并指定以配置文件进行启动:

mongod -f mongodb.yaml

在 mongodb.yaml 文件中开启密码保护:

net:
  bindIp: 0.0.0.0
  port: 27017
setParameter:
  # 关闭本地免密通道
  enableLocalhostAuthBypass: false
security:
  # 开启身份认证
  authorization: 'enabled'

这样,MongoDB服务启动后,非法用户是没法进行连接的。但是,今天下午,我的MongoDB居然挂了,一查日志发现被攻击了,一个美国IP在疯狂暴力破解我的密码。日志信息如下:

{
  "t": { "$date": "2026-04-29T16:08:54.540+08:00" },
  "s": "I",
  "c": "NETWORK",
  "id": 22943,
  "ctx": "listener",
  "msg": "Connection accepted",
  "attr": {
    "remote": "23.95.86.214:45956",
    "uuid": "fef6f499-17cf-4717-bb34-00c4e1c1cbe4",
    "connectionId": 92630,
    "connectionCount": 470
  }
}

可以看到,这个IP为23.95.86.214,其TCP网络连接数都到 470 了,让我的小小服务器压力山大。我查了下这个IP,它是美国的一个数据中心(ColoCrossing / HostPapa),通常被自动化扫描器、代理或恶意脚本广泛使用。另外,日志中还有 ACCESS 信息:

{
  "t": { "$date": "2026-04-29T16:08:54.529+08:00" },
  "s": "I",
  "c": "ACCESS",
  "id": 20251,
  "ctx": "conn92593",
  "msg": "Supported SASL mechanisms requested for unknown user",
  "attr": { "user": { "user": "django_mongo", "db": "admin" } }
}

可以看到,攻击者在疯狂使用不同的用户名和密码来进行暴力破解,上面就使用了 django_mongo 这个用户名。在1秒不到的时间内,猜测了上千个不同的用户名和密码!虽然,很遗憾,没有让你猜到。但MongoDB服务器却由于TCP连接过多而宕机。日志中有很多 Too many open files 提示:

{
  "t": { "$date": "2026-04-29T16:08:54.544+08:00" },
  "s": "E",
  "c": "NETWORK",
  "id": 6328201,
  "ctx": "AuthorizationManager-181",
  "msg": "Unable to create eventfd object",
  "attr": {
    "error": {
      "code": 264,
      "codeName": "TooManyFilesOpen",
      "errmsg": "error in creating eventfd: Too many open files, errno: 24"
    }
  }
}

解决方法也很简单,就是关闭外网访问,在配置文件中:

net:
  bindIp: 127.0.0.1
  port: 27017

将bindIp改成127.0.0.1,只允许本地进行连接,看你如何去猜!

最后编辑于: 2026-04-29

评论(0条)

(必填)
复制成功