用 MongoDB 要小心一点
阅读 14
在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