MongoDB数据库其安全性并不高,为了防止被一些好心人进行攻击,有效的方法是启用身份验证、不允许远程访问或者添加IP访问限制。
1、MongoDB用户与权限管理
1.1、常用权限
1.2、创建管理用户
MongoDB有一个用户管理机制,简单描述为管理用户组,这个组的用户是专门为管理普通用户而设的,暂且称之为管理员。管理员通常没有数据库的读写权限,只有操作用户的权限,我们只需要赋予管理员userAdminAnyDatabase角色即可。另外管理员账号必须在admin数据库下创建。
由于用户被创建在哪个数据库下,就只能在哪个数据库登录,所以把所有的用户都创建在admin数据库下,这样切换数据库时就不需要频繁的进行登录了。
先use admin切换至admin数据库进行登录,登录后再use切换其他数据库进行操作即可。第二次的use就不需要再次登录了。MongoDB设定use第二个数据库时如果登录用户权限比较高就可以直接操作第二个数据库,而不需要登录。
1.2.1、切换数据库
管理员需要在admin数据库下创建,所以先切换至admin数据库。
useadmin
1.2.2、查看用户
通过db.system.users.find()函数查看admin数据库中的所有用户信息。
也可以使用show users查看用户。
1.2.3、创建用户
使用db.createUser({用户信息})函数创建用户。
db.createUser({
user:"<name>",
pwd:"<cleartext password>",
customData:{<anyinformation>},
roles:[ {role:"<role>",db:"<database>"} | "<role>",
...
]});
user:用户名
pwd:密码
customData:存放用户相关的自定义数据,该属性也可忽略
roles:数组类型,配置用户的权限
示例:
#创建一个新用户,用户名和密码都为pbinlog
db.createUser({user:"pbinlog",pwd:"pbinlog",roles:[{role:"userAdminAnyDatabase",db:"admin"}]})
【注意】具体格式不需要死记硬背,直接复制过来使用即可。
创建完用户后,可以使用show users命令查看。
1.2.4、重启服务
管理员账号创建完成后,需要重新启动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
1.2.5、身份认证
启动完后,进行身份认证操作
#切换到admin数据库进行身份认证use admin
#进行身份认证,返回结果1表示认证成功,返回0表示认证失败。
db.auth("pbinlog","pbinlog")
登录成功后即可进行该用户所拥有的角色对应的权限的其他操作,比如show users再次查看所有用户信息。
1.3、创建普通用户
需求:创建一个test数据库,给这个数据库添加一个用户,用户名为testuser,密码为123456,并授予该用户对test数据库的读写操作权限。
1.3.1、管理员登录数据库
#切换到admin数据库use admin
#身份认证
db.auth("pbinlog","pbinlog")
1.3.2、创建数据库
MongoDB没有特定的创建数据库的语法,在使用use切换数据库时,如果对应的数据库不存在则直接创建并切换。(懒惰机制)
usetest
1.3.3、创建用户
db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]})
1.3.4、身份认证
#切换到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角色。
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"}]})
1.4.2、更新密码
更新用户密码有以下两种方式,更新密码时需要切换到该用户所在的数据库。
【注意】:需要使用具有userAdmin或userAdminAnyDatabase或root角色的用户才能执行。
使用db.updateUser("用户名",{"pwd":"新密码"}) 函数更新密码
使用db.changeUserPassword("用户名","新密码") 函数更新密码
1.5、删除用户
通过db.dropUser() 函数可以删除指定用户,删除成功后悔返回true。删除用户时需要切换到该用户所在的数据库。
【注意】:需要使用具有userAdmin或userAdminAnyDatabase或root角色的用户才能执行。
db.dropUser("testuser")