重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
MongoDB权限管理
创新互联建站是一家专注于网站设计、网站制作与策划设计,邹平网站建设哪家好?创新互联建站做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:邹平等地区。邹平做网站价格咨询:18980820575
版本:Mongodb3.0
说到对数据库我安全问题我们一般就会从以下几点考虑怎么去解决数据库安全的问题。
1.最安全的是物理隔离:
2.网络隔离:
3.防火墙隔离:
4.用户名和密码:
下面我们来说说mongodb的用户名和密码认证:
认证是确定client身份的机制,默认情况下mongodb并没有开启权限认证,我们部署好MGDB之后需要进行,一般常用mongodb权限认证的方式有:
1.auth开启(在启动的时候知道--auth=true)
2.Keyfile开启
怎么进行认证,在命令行mongo --auth或者在配置文件里加入配置信息,来开启认证;auth是一个布尔值,只需要在配置文件里加入auth=ture就开启认证了,那Keyfile呢?
Auth和keyfile的区别:
Auth : 单机实例认证,
Keyfile : 副本集和分片之间验证;
复制集是一个整体,复制集之间通信需要验证对方的身份,因为没有Keyfile,所以节点之间是不知道其他节点,Keyfile是集群节点间的一个×××明,怎么去创建keyfile,我们可以去使用openssl命令;
[root@localhost ~]# openssl rand -base64 111 .keyFile
[root@localhost ~]# cat .keyFile
EG8ABQZU9C87lPRKFVbClBYhxTw8Hyv91NkOoqLBF3eRfnAUxPCTcevB82fYM+Zo+tPOjnsPiVZrCZmAsG26ZFrB/SHhTj/E+F3QARFWKnm4DJNBhzLnjZOKtoao61BMcRAye0H7HG0geMQtbGBX
在未开启keyfile认证的时候不去创建用户,否则也会当keyfile配置重启后,用户创建可能进行回滚,当我们进行创建完成keyfile后再进行认证创建用户;
Keyfile的注意:
1.内容 base64编码集【a-z A-Z + /】
2.长度 1000bytes
3.权限 chmod 600 keyfile
现在我们开始传教
创建用户
语法;
db.createUser(
{
User:
pwd:
Roles:
}
)
创建root用户,在创建之前我们开启的auth认证,但是库没有任何用户,那我们需要添加参数setParametmer=enableLocalhostAuthBypass=1,来跳过认证情况下本机登录无需认证。
创建root用户的时候,是一个全局用户,必须只能创建在admin库
> db.createUser({user:'admin',pwd:'123123',roles:[{role:'root',db:'admin'}]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
[root@localhost ~]# mongo localhost:27017
MongoDB shell version: 3.0.12
connecting to: localhost:27017/test
> show dbs
admin 0.078GB
local 0.078GB
> use admin
switched to db admin
> show users
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin", #你这个用户是创建在admin库
"roles" : [
{
"role" : "root",
"db" : "admin" #角色的作用域
}
]
}
> db.auth('admin','123123') #认证
>1 #认证成功
删除用户:
1、db.dropUser(
2、db.dropAllUser() 删除所有用户,
如何修改用户密码:
角色:
什么是角色:对某一个资源的权限的集合
mongodb有什么角色:
MongoBD有两种角色
1.自带 的角色(bulid-in roles)
读写:
read 、readWrite
管理员:
dbAdmin、dbOwner、userAdmin、clusterAdmin
clusterManager、clusterMonitor、hostManager
备份:
backup、restore
全局:
readAnyDatabase、readWriteAnyDatabase、
userAdminAnyDatabase、dbAdminAnyDatabase
超级用户:
root
2.自定义角色
语法:
Use admin
dbCreateRole(
{
role:
Privileges:[
{resource:{db:
actions:[
],
Roles:[{role:
}
)
创建角色:
>use ycj
>db
>ycj
>db.createRole({role:'testycj',privileges:[{resource:{db:'ycj',collection:''},actions:['find','insert','re
move']}],roles:[{role:'read',db:'test'}]})
Error: Roles on the 'ycj' database cannot be granted roles from other databases(不能再其他数据库下创建角色)
这个时候我们切到admin库下,>use admin,创建用户成功;因为我们创建的角色是在admain下创建的。
> show users #查看db的用户
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
查看admin的权限:
> show roles;
{
"role" : "readWriteAnyDatabase",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
...........
...........
...........
{
"role" : "testycj",
"db" : "admin",
"isBuiltin" : false,
"roles" : [
{
"role" : "read",
"db" : "test"
}
],
"inheritedRoles" : [
{
"role" : "read",
"db" : "test"
}
]
}
{
"role" : "userAdmin",
"db" : "admin",
"isBuiltin" : true,
"roles" : [ ],
"inheritedRoles" : [ ]
}
可以看到我们的admin的root权限中,已经存在我们传教的testycj权限,同时我们也发现的root权限其实就是其他的权限的集合组成,比如readwrite、restore、readWriteAnyDatabase...,因为我们是在admin下创建的权限,所有这个自定义权限的作用域就是admin,在其他域将不能使用。
> db.runCommand({usersInfo:'admin',showPrivileges:1}) #查看这个用户的所有信息·
{
"users" : [
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin", #在哪个库创建的
"roles" : [
{
"role" : "root",
"db" : "admin"
}
],
"inheritedRoles" : [ #继承的角色
{
"role" : "root",
"db" : "admin"
}
],
"inheritedPrivileges" : [
{
"resource" : {
"cluster" : true #对集群操作需要权限
},
"actions" : [ #所操作的权限
"addShard",
"appendOplogNote",
"applicationMessage",
"authSchemaUpgrade",
"cleanupOrphaned",
"connPoolStats",
.......
.......
接下来我们就以yjctest权限去创建用户,
>use admin
>db.createUser({user:'ycj',pwd:'123',roles:[{role:'testycj',db:'admin'}]})
>db.auth(‘ycj’,’123’)
>1
现在我们开启两个远程总段回话A和B来测试一下
A:ycj
B:admin