一、开启认证
- auth :单点认证
- keyFile:集群认证
(一)配置 auth 开启认证(单点认证)
1、先创建root用户
备注:root 权限用户只能创建在 admin 数据库上
开启 28001 、28002实例(因为是复制集,所以至少有两个),在28001 实例上创建用户:
IMOOC:PRIMARY> db.createUser(
... {
... user:'root',
... pwd:'root',
... roles:[
... {role:'root',db:'admin'}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
2、配置 auth=true
echo 'auth=true' >> conf/28001.conf
echo 'auth=true' >> conf/28002.conf
echo 'auth=true' >> conf/28003.conf
3、登录,验证、测试
(1)重启 28001、28002、28003实例
(2)登录28001
(3)验证
db.auth('root','root')
#1代表验证通过
1
(4)测试
#能查询到所有数据库,即可说明权限认证通过
show dbs
(二)配置 keyFile 开启认证(集群验证)
keyFile 的注意事项
- 内容 base64 编码集[a-z A-Z + /]
- 长度 1000 bytes
- 权限 chmod 600 keyFile
1、先创建root用户
备注:root 权限用户只能创建在 admin 数据库上
开启 28001 、28002实例(因为是复制集,所以至少有两个),在28001 实例上创建用户:
IMOOC:PRIMARY> db.createUser(
... {
... user:'root',
... pwd:'root',
... roles:[
... {role:'root',db:'admin'}]})
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
2、创建 .keyFile 文件,生成秘钥,修改 .keyFile 文件 600权限
openssl rand -base64 102
#随机生成100位的base64数字
#创建 .keyFile 文件
touch .keyFile
#随机生成100位的base64数字
openssl rand -base64 102 > .keyFile
#修改 .keyFile 文件 600权限
chmod 600 .keyFile
3、配置 keyFile
注意:一旦配置 keyFile 选项,auth 相当于自动开启了,所以可以注解掉 auth 配置项
echo 'keyFile=/usr/local/mongodb/.keyFile' >> conf/28001.conf
echo 'keyFile=/usr/local/mongodb/.keyFile' >> conf/28002.conf
echo 'keyFile=/usr/local/mongodb/.keyFile' >> conf/28003.conf
4、登录,验证、测试
(1)重启 28001、28002、28003实例
(2)登录28001
(3)验证
db.auth('root','root')
#1代表验证通过
1
(4)测试
#能查询到所有数据库,即可说明权限认证通过
IMOOC:PRIMARY> show dbs
admin 0.078GB
imooc 0.078GB
local 0.578GB
(三)删除用户
#删除某个用户,接受字符串参数
db.dropUser(user_name)
#删除当前库的所有用户
db.dropAllUsers()
二、权限
(一)角色
角色分为2种,一种是自带的(built-in roles),还有一种是自定义角色。
1、build-in roles角色分类
- 读写:read、readWrite
- 管理员:dbAdmin、dbOwner、userAdmin、clusterAdmin、clusterManager、clusterMonitor、hostManager
- 备份:backup、restore
- 全局:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级:root
2、自定义角色
db.createRole(
{
role:'testRole',
privileges:[
{
# db、collection 若为 '',代表所有
resource:{db:'imooc',collection:''},
actions:['find','insert','remove']
}
],
# Roles:继承已存在的角色权限,若无,则以 '' 代替
Roles:[
{role:<role_name>,db:<db_name>}
]
}
显示已有角色的权限:
db.runCommand({usersInfo:'user_name', showPrivileges:1})
(1)自定义角色 testRole
db.createRole(
... {
... role:"testRole",
... privileges:[
... {
... resource:{db:"imooc",collection:""},
... actions:["find","insert","remove"]
... }
... ],
#继承 test 库的 read 权限
... roles:[{role:"read",db:"test"}]
... })
#创建成功的话,出现下面的代码
{
"role" : "testRole",
"privileges" : [
{
"resource" : {
"db" : "imooc",
"collection" : ""
},
"actions" : [
"find",
"insert",
"remove"
]
}
],
"roles" : [
{
"role" : "read",
"db" : "test"
}
]
}
(2)创建用户,分配 testRole 角色
db.createUser(
... {
... user:"testrole",
... pwd:"123",
... roles:[{role:"testRole",db:"admin"}]})
#用户创建成功的话,出现下面代码
Successfully added user: {
"user" : "testrole",
"roles" : [
{
"role" : "testRole",
"db" : "admin"
}
]
}
(3)验证新建的 testrole 用户,是否拥有对 test 库的读权限
#第一步:先在 admin 库用 root 用户验证
db.auth('root','root')
#第二步:切换 test 库,存入一条数据
use test
db.imooc.insert({x:1})
#第三步:在 admin 库用 testrole 用户验证
db.auth('testrole','123')
#第四步:切换 test 库,查询刚刚存入的数据,若存在,即继承了 test 库的 read 权限
use test
db.imooc.find()
#出现该记录,表示成功读取到了 test 中的数据
{ "_id" : ObjectId("5c11c796ca1209b5d74473d4"), "x" : 1 }
(二)用户
1、创建用户
参考上方
2、修改用户密码
需要具备 changePassword(能修改所有用户密码) 或 changeOwnPassword(只能修改自己的密码) 角色。
db.changeUserPassword(<use_name>,<new_password>)
db.updateUser(<use_name>,{update_object})
(三)权限伸缩
1、增加权限
db.grantRolesToUser(
<user_name>,
[{role:<role_name>,db:<db_name>}]
)
案例:db.grantRolesToUser( 'testrole', [{role:'readWrite',db:'test'}])
2、收缩权限
db.revokeRolesFromUser(
<user_name>,
[{role:<role_name>,db:<db_name>}]
)