MongoDB数据库其安全性并不高,为了防止被一些好心人进行攻击,有效的方法是启用身份验证、不允许远程访问或者添加IP访问限制。
1、MongoDB用户与权限管理
1.1、常用权限
权限 | 说明 |
---|---|
read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
userAdmin | 允许用户从system.users集合写入,可以在指定数据库里创建、删除和管理用户 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
clusterAdmin | 必须在admin数据库中定义,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的读权限 |
readWriteAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 必须在admin数据库中定义,赋予用户所有数据库的dbAdmin权限 |
root | 必须在admin数据库中定义,超级账号,超级权限 |
1.2、创建管理用户
MongoDB有一个用户管理机制,简单描述为管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员。管理员通常没有数据库的读写权限,只有操作用户的权限,我们只需要赋予管理员userAdminAnyDatabase角色即可。另外管理员账号必须在admin数据库下创建。
由于用户被创建在哪个数据库下,就只能在哪个数据库登录,所以把所有的用户都创建在admin数据库下,这样切换数据库时就不需要频繁的进行登录了。
先use admin切换至admin数据库进行登录,登录后再use切换其他数据库进行操作即可。第二次的use就不需要再次登录了。MongoDB设定use第二个数据库时如果登录用户权限比较高就可以直接操作第二个数据库,而不需要登录。
1.2.1、切换数据库
管理员需要在admin数据库下创建,所以先切换至admin数据库。
代码语言:javascript复制use admin
1.2.2、查看用户
通过db.system.users.find()函数查看admin数据库中的所有用户信息。
也可以使用show users查看用户。
1.2.3、创建用户
使用db.createUser({用户信息})函数创建用户。
代码语言:javascript复制db.createUser({ user:"<name>",
pwd:"<cleartext password>",
customData:{<any information>},
roles:[ {role:"<role>",db:"<database>"} | "<role>",
... ] });
- user:用户名
- pwd:密码
- customData:存放用户相关的自定义数据,该属性也可忽略
- roles:数组类型,配置用户的权限
示例:
代码语言:javascript复制#创建一个新用户,用户名和密码都为pbinlog
代码语言:javascript复制db.createUser({user:"pbinlog",pwd:"pbinlog",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
【注意】具体格式不需要死记硬背,直接复制过来使用即可。
创建完用户后,可以使用show users命令查看。
1.2.4、重启服务
管理员账号创建完成后,需要重新启动MongoDB,并开启身份验证功能才会生效。
先通过db.shutdownServer()函数关闭服务。
也可以使用配置文件方式关闭服务:
代码语言:javascript复制mongod -f /usr/local/mongodb/bin/mongodb.conf --shutdown
修改MongoDB启动配置文件,添加开启身份认证。
代码语言:javascript复制#修改配置文件
vi /usr/local/mongodb/bin/mongodb.conf
#开启身份认证
auth = true
执行完上面操作后,重新使用配置文件启动MongoDB。
代码语言:javascript复制/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb.conf
1.2.5、身份认证
启动完后,进行身份认证操作
代码语言:javascript复制#切换到admin数据库进行身份认证 use admin
#进行身份认证,返回结果1表示认证成功,返回0表示认证失败。
db.auth("pbinlog","pbinlog")
登录成功后即可进行该用户所拥有的角色对应的权限的其他操作,比如show users再次查看所有用户信息。
1.3、创建普通用户
需求:创建一个test数据库,给这个数据库添加一个用户,用户名为testuser,密码为123456,并授予该用户对test数据库的读写操作权限。
1.3.1、管理员登录数据库
代码语言:javascript复制#切换到admin数据库 use admin
#身份认证
db.auth("pbinlog","pbinlog")
1.3.2、创建数据库
MongoDB没有特定的创建数据库的语法,在使用use切换数据库时,如果对应的数据库不存在则直接创建并切换。(懒惰机制)
代码语言:javascript复制use test
1.3.3、创建用户
代码语言:javascript复制db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
1.3.4、身份认证
代码语言:javascript复制#切换到test数据库 use test
#身份认证
db.auth("testuser","123456")
#测试:执行文档插入语句
db.user.insert({"name":"zhangsan"})
#验证:查询一下
db.user.find()
1.4、更新用户
1.4.1、更新角色
如果需要对已存在的用户进行角色修改,可以使用db.updateUser()函数来更新用户角色。【注意】:执行该函数需要当前用户具有userAdmin或userAdminAnyDatabase或root角色。
代码语言:javascript复制db.updateUser("用户名",{"roles":[{"role":"角色名称",db:"数据库"},{"更新项2":"更新内容"}]})
例如:给pbinlog用户再添加readWriteAnyDatabase和dbAdminAnyDatabase权限。
代码语言:javascript复制db.updateUser("pbinlog",{"roles":[{"role":"userAdminAnyDatabase",db:"admin"},{"role":"readWriteAnyDatabase",db:"admin"},{"role":"dbAdminAnyDatabase",db:"admin"}]})
1.4.2、更新密码
更新用户密码有以下两种方式,更新密码时需要切换到该用户所在的数据库。
【注意】:需要使用具有userAdmin或userAdminAnyDatabase或root角色的用户才能执行。
- 使用db.updateUser("用户名",{"pwd":"新密码"}) 函数更新密码
- 使用db.changeUserPassword("用户名","新密码") 函数更新密码
1.5、删除用户
通过db.dropUser() 函数可以删除指定用户,删除成功后悔返回true。删除用户时需要切换到该用户所在的数据库。
【注意】:需要使用具有userAdmin或userAdminAnyDatabase或root角色的用户才能执行。
代码语言:javascript复制db.dropUser("testuser")