身份验证
身份验证是验证试图连接数据库的客户机的身份的过程。MongoDB提供各种方法来验证客户机的身份。基于挑战的默认策略包括:
- SCRAM-SHA-1: 该身份验证机制使用简单的基于文本的用户名和密码,通过传输层安全(transport layer security, TLS)保护的通道传输。
- MongoDB-CR:与SCRAM一样,MongoDB-CR根据身份验证数据库验证用户名和密码。MongoDB-CR已从3.0版本中删除,现在只有较老的迭代使用它。
- 这两种方法都发送加密的密码,并且为每个新会话生成不同的散列,因此没有人能够嗅出它们。MongoDB也可以使用外部认证协议:
- LDAP:轻量级目录访问协议允许用户使用集中的密码登录。LDAP旨在帮助任何人定位和访问他们在公共或私有网络中需要的信息。
- Kerberos:这是一个用于服务器-客户机交互的密钥身份验证协议。使用Kerberos,用户只能使用访问票据登录一次。
显示数据库下用户信息
show users
字段解析:
- user:用户名
- db:对应数据库
- roles:角色与对应数据库信息
- mechanisms:验证策略
删除用户
db.dropUser('gao')
修改用户密码
db.changeUserPassword(“要修改密码的用户名”,”新密码”)
修改权限
updateUser官方语法
{
updateUser: "<username>",
pwd: passwordPrompt(), // Or "<cleartext password>"
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>", | "<CIDR range>", ...]
},
...
],
mechanisms: [ "<scram-mechanism>", ... ],
digestPassword: <boolean>,
writeConcern: { <write concern> }
}
例:db.updateUser("usertest",{roles:[ {role:"read",db:"testDB"} ]})
注:updateuser它是完全替换之前的值,如果要新增或添加roles而不是代替它
则使用方法: db.grantRolesToUser() 和 db.revokeRolesFromUser()
例:
db.grantRolesToUser("usertest", [{role:"readWrite", db:"testDB"},{role:"read", db:"testDB"}]) # 修改权限
db.revokeRolesFromUser("usertest",[{role:"read", db:"testDB"}]) # 删除权限:
删除用户
db.dropUser('usertest')
创建新用户
官方语法:
{
user: "<name>",
pwd: passwordPrompt(), // Or "<cleartext password>"
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
authenticationRestrictions: [
{
clientSource: ["<IP>" | "<CIDR range>", ...],
serverAddress: ["<IP>" | "<CIDR range>", ...]
},
...
],
mechanisms: [ "<SCRAM-SHA-1|SCRAM-SHA-256>", ... ],
passwordDigestor: "<server|client>"
}
例:
db.createUser(
{
user: "dba",
pwd: "dba",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
db.createUser(
{
user: "maindataip",
pwd: "maindata",
roles: [ {role: 'readWrite', db: 'maindata'} ],
authenticationRestrictions: [ {
clientSource: ["10.xx.x.xxx", "10.xx.x.xxx","10.xx.x.xxx","xxx.x.x.1" ],
serverAddress: ["xx.xx.x.xxx"]
} ]
}
)
解析
- user:用户名
- pwd:密码
- role:角色
- db:数据库
- roles:是一个列表,可以有多个值
- clientSource:客户端白名单列表(服务端只对列表中的ip地址开发)
- serverAddress:服务端白名单列表(用户只能访问列表中的ip)
- mechanisms:选择认证机制
- passwordDigestor:不太清楚,应该是选择服务器或者客户端来验证密码(此处不确定)
注:mongodb内置角色
Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
数据库用户角色
read:允许用户读取指定的数据库
readWrite:允许用户读写指定数据库
数据库管理角色
dbAdmin:允许用户在指定数据库执行管理函数,创建索引,删除索引,查看统计.
userAdmin:允许用户向system.users集合写入,可以在指定数据库创建删除管理账号
dbOwner:指定数据库最大的权限,是readWrite+dbAdmin+userAdmin的和。
群集管理角色(只在admin数据库可用)
clusterAdmin:用户所有分片和复制集相关函数的管理权限
clusterManager:管理和监控群集。
clusterMonitor:只能访问监控工具。
hostManager:监视和管理。
备份和还原角色
backup
restore
所有角色(只在admin数据库可用)
readAnyDatabase:赋予用户所有数据库的读权限
readWriteAnyDatabase:赋予用户所有数据库的读写权限
userAdminAnyDatabase:赋予所有数据库的useradmin权限
dbAdminAnyDatabase:赋予所有数据库的dbadmin权限。
超级角色(只在admin可用)
root:超级账号,超级权限
---------------------------------------------------以下无正文-----------------------------------------------------
mongodb用户设计:
admin:创建一个root权限,一个userAdminAnyDatabase权限
自定义数据库:一个dbOwner,根据需求建想要权限用户
需求:如增加一个数据库,在不添加用户的前提下能够管理新增库
解决方法:登录拥有userAdminAnyDatabase权限用户,到拥有该用户的库下给原有用户授权
例:db.grantRolesToUser("原有用户名",[{role:"readWrite",db:"新数据库"},{role:"角色“,db:"新数据库"}])
注:授权后,该用户并不属于新增数据库用户,只是拥有该新增库的管理权。
(给原有用户添加权限也可使用grantRolesToUser)