四、MongoDB复制集安全

一、开启认证

  • 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>}]
)

猜你喜欢

转载自blog.csdn.net/panchang199266/article/details/84979617
今日推荐