27017 - 永远的教训,MongoDB黑客事件和如何避免

        话说疫情前,本人开发过一款针对社交媒体的的SaaS应用,为了存储用户的操作日志,选用了MongoDB。一切看似顺风顺水,直到有一天,用户反馈应用无法使用。我急忙登录数据库检查,却发现数据全没了,取而代之的是一条挑衅的信息:“恭喜你,被黑了!打入某账户0.00x个比特币后,交回数据库!” 那一刻,我简直想哭。原来,那会儿初次接触MongoDB,在忙碌的开发中忘了一件大事——给MongoDB设置密码! 黑客使用 ip+port 轻松进入了我的数据库中。。。

        这下子,不仅几百个用户的记录数据丢失,我还得面对用户的不满和质疑。最尴尬的是,还得向用户解释“正在努力恢复数据”,那种感觉,就像是在大庭广众之下承认自己的失误。尽管后来尽力恢复了一些数据,但损失已经无法挽回。

        这次事件给了我深刻的教训:数据库安全绝不是小事,哪怕只是日志数据,也要做好防护。从此,我再也不敢让任何数据库“裸奔”了。希望我的这段“血泪史”能提醒大家,一定要记得给MongoDB加密码,别等到黑客留言才追悔莫及!

27017 ------- 永远的教训  嘿嘿!

接下来,一起来分享一下 如何防护好你的mongoDB:

MongoDB 是一个非常强大的 NoSQL 数据库,但如果没有适当的安全措施,数据可能会面临泄露或损坏的风险。为了确保数据的安全性,我们需要配置和采取一些关键的安全措施。

1. 启用认证 (Authentication)

  • 什么是认证?
    认证是指数据库通过用户名和密码来验证用户的身份,只有验证通过的用户才能访问数据库。
  • 为什么需要认证?
    如果没有启用认证,任何人都可以随便访问你的数据库,修改或删除数据,甚至更改配置。启用认证后,只有经过授权的用户才能登录和操作数据库。
  • 如何启用?
    默认情况下,MongoDB 允许所有人访问,但你可以通过配置文件启用认证。在 MongoDB 中,创建用户时,需要为他们设置用户名和密码,并定义他们的权限(例如,读、写或管理员权限)。

示例:

mongod --auth

这里需要指出的是,你需要在mongoDB的config中配置中开启权限使能哦!

然后通过 mongo 命令行工具来创建一个管理员账户:

use admin
db.createUser({ user: "admin", pwd: "yourpassword", roles: ["root"] })

2. 启用加密 (Encryption)

  • 加密的作用?
    加密确保存储在 MongoDB 中的数据即使被黑客获得,也无法读取。MongoDB 提供了数据加密(在磁盘上)和传输加密(通过 SSL/TLS)两种方式。
  • 如何启用加密?
    • 数据加密:MongoDB 提供了内建的加密功能,可以对数据进行磁盘级别的加密。这样,即使有人物理访问了数据库服务器,数据也会被加密,无法直接读取。
    • 传输加密:使用 SSL/TLS 加密连接,确保数据库与应用程序之间的数据传输安全,防止中间人攻击。

示例: 开启 SSL 加密:

mongod --sslMode requireSSL --sslPEMKeyFile /path/to/server.pem

3. IP 白名单 (IP Whitelisting)

  • 什么是 IP 白名单?
    通过 IP 白名单,你可以限制只有来自特定 IP 地址的请求才能访问数据库。这样可以防止外部不安全的网络或恶意用户访问你的 MongoDB 实例。
  • 如何实现?
    在 MongoDB 的配置文件中设置 bindIp 选项,将其限制为只允许某些 IP 地址访问数据库。

示例:

bindIp: 127.0.0.1,192.168.1.100

这意味着 MongoDB 只能接受来自本地(127.0.0.1)和 IP 地址为 192.168.1.100 的请求。

4. 角色基础权限管理 (Role-Based Access Control, RBAC)

  • 什么是 RBAC?
    MongoDB 提供了细粒度的权限控制,可以为不同的用户分配不同的角色(如读写权限、数据库管理权限等),确保每个用户只能访问和操作他们有权限的部分。
  • 为什么需要?
    如果没有角色权限控制,数据库可能会面临权限滥用的风险,管理员、开发人员和普通用户可以拥有不同的访问权限,这有助于避免不必要的安全问题。
  • 如何设置?
    在 MongoDB 中,你可以创建用户并为其分配不同的角色。例如,可以给某个用户赋予只读权限,而给其他人赋予读写权限。

示例:

db.createUser({
  user: "readOnlyUser",
  pwd: "password",
  roles: [{ role: "read", db: "test" }]
})

5. 启用审计日志 (Audit Logs)

  • 什么是审计日志?
    审计日志记录了 MongoDB 中的所有操作,包括成功的和失败的登录、数据操作等。通过审计日志,你可以跟踪所有重要的操作,查看谁做了什么,防止潜在的安全漏洞。
  • 为什么需要审计日志?
    审计日志对于安全事件的后续调查、风险评估、合规性要求等非常有用。它可以帮助你追踪到数据库中是否存在不正常的访问行为。
  • 如何启用?
    审计日志需要在 MongoDB 的配置文件中启用,并且需要指定日志记录的详细信息。

示例:

auditLog:
  destination: file
  format: JSON
  path: /var/log/mongodb/auditLog.json

6. 避免暴露管理接口 (Disable Remote Management)

  • 什么是管理接口?
    MongoDB 提供了一些管理功能,比如 mongodmongo shell,可以在服务器上进行操作和配置。你可以限制这些管理接口的访问,只允许可信的 IP 地址进行远程管理,或者干脆禁止远程管理。
  • 为什么要禁止暴露?
    如果这些接口暴露在公网,黑客就可以尝试通过弱密码、漏洞等手段进行攻击。因此,最好将它们只暴露在内部网络上,或者完全禁用。

示例:

--nohttpinterface

7. 定期更新和修补漏洞 (Regular Updates)

  • 为什么需要定期更新?
    MongoDB 会发布新的版本,修复已知的安全漏洞和缺陷。定期检查 MongoDB 的新版本,并及时升级,能够避免已知漏洞被黑客利用。
  • 如何更新?
    定期访问 MongoDB 官方网站或使用包管理工具(如 apt、yum)检查并更新 MongoDB。

8. 备份数据 (Backup)

  • 备份的重要性?
    即使做了所有安全措施,万一发生灾难性故障或被攻击,数据丢失也能影响公司运营。因此,定期备份数据非常重要。
  • 如何备份?
    MongoDB 提供了多种备份方式,比如 mongodumpMongoDB Atlas 等,可以定期进行数据库备份,确保重要数据不会丢失。

还有,记得更换你的端口,不要让人轻易就找到了!

MongoDB 的 默认端口27017

默认端口不更改的风险:

  1. 容易成为攻击目标
    由于 27017 是 MongoDB 默认的端口,很多攻击者知道这个端口是 MongoDB 的标准端口。如果你的 MongoDB 实例暴露在公网上,而且没有适当的安全措施(如认证、IP 白名单等),攻击者可以轻松地扫描出这个端口并尝试入侵你的数据库。

  2. 端口扫描
    网络攻击者通常会使用端口扫描工具扫描公网 IP 地址上的常见端口,包括 27017。如果你的 MongoDB 没有正确配置认证,或者没有启用防火墙和访问控制,攻击者可能会通过暴力破解(猜密码)或其他方式获取数据库访问权限。

  3. 攻击工具的普遍支持
    很多现成的攻击工具都会针对 MongoDB 默认端口进行扫描,并寻找不加密或没有认证的 MongoDB 实例。这使得默认端口的安全性进一步降低。如果端口不更改,攻击者只需要一个简单的端口扫描工具,就能轻松发现目标。

  4. 特定漏洞的利用
    许多MongoDB的安全漏洞与特定版本的数据库相关,如果攻击者知道你的MongoDB版本和端口,可以通过已知漏洞(如未打补丁的漏洞)进一步尝试入侵。

如何减少风险?

  1. 更改默认端口
    虽然更改默认端口并不是一种完美的安全措施,但它可以增加安全性。改变默认端口可以让攻击者更难以识别你的 MongoDB 实例所在的端口,至少减少了扫描攻击的可能性。

    如何更改端口:
    在 MongoDB 配置文件(mongod.conf)中修改 net.port 配置项:

    net:
      port: 28017  # 更改为你选择的其他端口
    
  2. 启用防火墙
    使用防火墙(如 iptables 或云服务提供商的安全组)限制只允许特定的 IP 地址访问 MongoDB 实例。你可以通过只允许公司内部 IP 或特定可信 IP 访问 27017 端口来保护数据库。

  3. 启用认证和授权
    如前所述,确保启用 MongoDB 的认证和授权机制,不让未授权的用户访问数据库。通过设置强密码和角色权限控制,进一步限制对数据库的访问。

  4. 使用 VPN 或内网访问
    将 MongoDB 实例限制为只能通过公司内部网络访问。如果必须从外部访问,可以通过 VPN 或专用的安全通道进行连接。

  5. 定期更新和修补漏洞
    确保 MongoDB 的版本保持更新,及时安装官方发布的安全补丁,防止黑客利用已知漏洞进行攻击。

好了 今天就讲了这个一个故事和分享,希望对你有用!

写在最后:非关系型数据库用起来很自由,没有那么多条条框框!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值