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