记一次新手mongo被黑经历
故事
早上打开网站,一刷新,页面空了,数据返回空数组。好家伙,服务应该没挂,数据库应该也没挂,没有数据了?莫非被黑了。进数据库一看,如下图,哈哈哈,刺激!
听到好几次数据库被黑,敲诈比特币的故事,真在自己手头发生,还挺兴奋🤩
安全项1 - mongod.conf配置bindIp
在MongoDB的配置文件mongod.conf
中,bindIp
选项用于指定MongoDB服务器监听的IP地址。这是一个安全设置,可以防止未经授权的访问。
例如,如果你的mongod.conf
文件中有以下设置:
net:
bindIp: 127.0.0.1
这意味着MongoDB只会监听来自本机(localhost)的连接,不会接受来自其他机器的连接。
如果你想让MongoDB监听所有IP地址,可以将bindIp
设置为0.0.0.0
:
net:
bindIp: 0.0.0.0
但是请注意,这样做可能会增加安全风险,因为任何能够访问这个IP地址的机器都可以尝试连接到你的MongoDB服务器。在生产环境中,你应该尽可能地限制bindIp
的范围,只允许可信的IP地址连接。
如果你有多个可信的IP地址,你可以使用逗号分隔它们:
net:
bindIp: 192.168.1.100,192.168.1.101
在这个例子中,MongoDB只会监听192.168.1.100
和192.168.1.101
这两个IP地址。
安全项2 - 端口开放
安全组一般不开放数据库端口,或仅开放给指定ip
备注:查看公网ip
curl ifconfig.me
安全项3 - 用户名密码
在默认情况下,MongoDB是监听在127.0.0.1之上的,任何客户端都可以直接链接27017,默认是非授权模式(也就是不需要任何权限验证,不需要验证账户,直接在命令行中输入mongo,就可以进行相关操作,这是非常不安全的)。mongodb使用的是基于角色的访问控制RBAC来管理用户对实例的访问. 用户和权限之间用角色来承接,是用户-角色-权限这样一个关系。
为数据库设置用户密码,是直接且基础的防护措施,不要因测试服而不重视,累积起来后,也是非常重要的项目数据,应当严谨对待。测试服数据的安全能保证工程进展的效率。
创建用户密码
首先,本地需要跑起mongo,这里用docker启动。
docker search mongo // 查看版本,可跳过
docker pull mongo // 默认下载最新版本
docker image ls -a // 查看下载镜像
docker run -d -p 27017:27017 --name mongodb -v /var/lib/mongodb:/data/db mongo -auth // 容器启动mongo并需要验证
docker exec -it mongodb /bin/bash // 进入mongo
db.createUser({user:'xxx', pwd:'xxx', roles:[{role:'root',db:'admin'}]})
db.use admin
db.auth('user', 'pwd') // 很重要,auth后才能执行后续操作
mongodb角色具体可查看:
Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
安全项四 - 数据库备份
思路:使用mongodump进行备份,使用cron定期运行
补充
当然,使用云数据库,安全防护会更完备一些。云数据库通常提供了一系列的安全防护措施,这些措施往往超过了你自己在本地部署和管理数据库时所能提供的。例如,数据加密、访问控制、防火墙和网络安全、备份和恢复、安全更新补丁、审计和监控等。
转载自:https://juejin.cn/post/7390480675173007410