起因
今天一看突然发现网站上的数据都没了,一看数据库,里面的表全没了,然后多了一张叫 RECOVERY
的 Collections
,还贴心的留下了个Email:varsovie@tutanota.com 来寻求帮助,真好。 =͟͟͞͞=͟͟͞͞(●⁰ꈊ⁰● |||)
搜了一下这个邮箱,还真有不少,找了一篇相似的:【掘金】
原因是MongoDB默认直接连接,无须身份认证,而对方很可能仅仅是尝试各个IP的27017端口
还好我数据库内没什么非常重要的文件,不过这次也给我提了个醒
- 尽量不要用默认端口(MongoDB为27017)
- 必要的话限制IP登录(
/etc/mongod.conf
文件内bindIp
) - 创建相应的管理员账户
- 强制要求密码登录
- 养成定时备份的习惯
创建相应的管理员账户
MongoDB中拥有不同权限的账号,具体可以查看:【官方文档】
其中常用的如下:
- 数据库普通用户角色
- read
- readWrite
- 数据库管理员角色
- dbAdmin
- dbOwner
- userAdmin
- 集群管理角色
- clusterAdmin
- clusterManager
- clusterMonitor
- hostManager
- 备份与还原角色
- backup
- restore
- 所有数据库角色(对所有数据库有效)
- readAnyDatabase
- readWriteAnyDatabase
- userAdminAnyDatabase
- dbAdminAnyDatabase
- 超级角色
- root
- 内部角色
- __system
roles是分配用户角色的地方,主要有
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
在你创建role的时候通过 role: "userAdminAnyDatabase"
来指定
这里以创建userAdminAnyDatabase
为例:
1 | > use admin |
创建成功后可以通过以下命令查看所有用户
1 | > use admin |
另外,删除某个用户则为:> db.system.users.remove({user:"xxx"})
强制要求密码登录
vim 编辑 /etc/mongod.conf
,添加以下内容:
1 | security: |
保存后重启mongod
,之后必须先通过 db.auth('your name','your password')
验证成功。
下次新建数据库的时候
1 | > use admin |