起因

今天一看突然发现网站上的数据都没了,一看数据库,里面的表全没了,然后多了一张叫 RECOVERYCollections,还贴心的留下了个Email:varsovie@tutanota.com 来寻求帮助,真好。 =͟͟͞͞=͟͟͞͞(●⁰ꈊ⁰● |||)

shell
shell
navicat
navicat

搜了一下这个邮箱,还真有不少,找了一篇相似的:【掘金】
原因是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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
> use admin
switched to db admin
> db.createUser(
... {
... user: "your name",
... pwd: "your password",
... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
... }
... )
Successfully added user: {
"user" : "*****",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}

创建成功后可以通过以下命令查看所有用户

1
2
3
> use admin
switched to db admin
> db.system.users.find()

另外,删除某个用户则为:> db.system.users.remove({user:"xxx"})

强制要求密码登录

vim 编辑 /etc/mongod.conf,添加以下内容:

1
2
security:
authorization: enabled

保存后重启mongod,之后必须先通过 db.auth('your name','your password') 验证成功。

下次新建数据库的时候

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> use admin
switched to db admin
> db.auth("xxx","xxx") # userAdminAnyDatabase 权限的用户
1

> use newdb
switched to db newdb
> db.createUser(
... {
... user: "your name",
... pwd: "your password",
... roles: [ { role: "readWrite", db: "newdb" } ]
... }
... )
Successfully added user: {
"user" : "***",
"roles" : [
{
"role" : "readWrite",
"db" : "***"
}
]
}