MongoDB安全性设置
安全设置建议
1) 启用访问控制和强制验证。要求所有客户端和服务器连接前提供有效的凭据
2) 配置基于角色的访问控制。
3) 加密通信。配置MongoDB为所有传入和传出连接使用SSL/TLS加密
4) 限制网络曝光。确保mongoDB在安全的网络环境运行,并限制连接MongoDB的连接接口
5) 使用专用的用户运行MongoDB
MongoDB认证
认证是验证客户端身份的过程。当启用访问控制时,MongoDB要求所有客户端进行身份认证,以确定其访问
MongoDB认证机制:
1) SCRAM-SHA-1
2) MongoDB质询和响应(MongoDB-CR)
3) x.509证书
另外,MongoDB企业版还支持使用LDAP及Kerberos认证
MongoDB用户
要在MongoDB中验证客户端,必须先在MongoDB中添加用户
要添加用户,可以使用db.createUser()方法,添加用户时可以为用户分配角色以确定用户权限
注意:在数据库中创建的第一个用户应该是具有管理其他用户权限的管理员
添加用户时,可以在指定的数据库中创建用户。该数据库称为用户的认证的数据库。针对同一个用户可以为不同的数据库设置不同的操作权限
认证用户
1) 在连接mongod服务时,可以使用选项-u, -p, --authenticationDatabase指定用户信息
2) 先连接到mongod服务,然后针对身份验证数据库使用db.auth()方法
MongoDB创建用户
MongoDB采用基于角色的访问控制来确定用户的访问权限。授予用户一个或者多个角色,来确定用户对资源的访问
示例:创建用户
1) 创建管理员用户
> use admin > db.createUser( ... { ... user: "admin", ... pwd: "redhat", ... roles: [{role:"root",db:"admin"}] ... } ... ) >
测试使用该用户连接mongod
[root@node1 ~]# mongo --host 192.168.0.105 -u admin -p --authenticationDatabase admin 或者 [root@node1 ~]# mongoconn > use admin switched to db admin > db.auth("admin","redhat") 1
2) 添加指定用户,针对game数据库创建具有读写权限
> use game > db.createUser( ... { ... user: "user01", ... pwd: "redhat", ... roles: ["readWrite"] ... } ... )
3) 查看所有用户
> db.getUsers() [ ] > > use admin switched to db admin > db.getUsers()
4) 删除用户
> use game > db.dropUser("user01") true
5) 在game数据库中创建用户user02, 并向用户提供readWrite和dbAdmin角色
> use game > db.createUser( ... { ... user: "user02", ... pwd: "redhat", ... roles: ["readWrite", "dbAdmin"] ... } ... )
6) 在game库创建没有角色的用户user03
> use game switched to db game > > db.createUser( ... { ... user: "user03", ... pwd: "redhat", ... roles: [] ... } ... ) Successfully added user: { "user" : "user03", "roles" : [ ] } >
7) 在admin数据库中创建针对game数据库的用户
> use admin > db.createUser( ... { ... user: "admin01", ... pwd: "redhat", ... roles: ... [ ... { role: "readWrite", db: "game" } ... ] ... } ... )
MongoDB内置角色参考如下:
1、数据库用户角色(Database User Roles)
read
readWrite
2、数据库管理角色(Database Administrator Roles)
dbAdmin:提供索引、信息统计等管理权限。此角色不提供用户管理、角色管理的权限
userAdmin:提供在当前数据库上创建和修改角色和用户的权限
dbOwner:提供readWrite, dbAdmin, userAdmin角色的权限
3、集群管理角色(Cluster Administrator Roles)
clusterAdmin:提供集群管理访问权限
clusterManage:提供集群管理和监控权限
clusterMonitor:为MongoDB Cloud Manager和OPS Manager监控代理工具提供只读访问权限
hostManager:提供监控和管理服务器的能力
4、备份与恢复角色(Backup and Restore Roels)
backup
restore
5、All-Database Roles(All-Database Roles)
readAnyDatabase: 拥有除了 local 和 config 以外的所有数据的 read 角色权限,此外还提供 listDatabases 操作权限
readWriteAnyDatabase: 拥有除了 local 和 config 以外的所有数据的 read, readWriteAnyDatabase 角色权限,此外还提供 listDatabases 操作权限
userAdminAnyDatabase: 拥有除了 local 和 config 以外的所有数据的 userAdmin 角色权限
dbAdminAnyDatabase: 拥有除了 local 和 config 以外的所有数据的 dbAdmin角色权限, 此外还提供 listDatabases 操作权限
6、超级角色
root
MongoDB用户管理
1、查看用户角色
> db.getUser("testuser")
2、查看角色权限
> use admin switched to db admin > db.getRole( "read", {showPrivileges: true}) { "role" : "read", "db" : "admin", "isBuiltin" : true, "roles" : [ ], "inheritedRoles" : [ ], "privileges" : [ { "resource" : { "db" : "admin", "collection" : "" ........
3、撤销用户在game数据库上的readWrite权限
> db.revokeRolesFromUser( ... "testuser", ... [ { role: "readWrite", db: "game"} ] ... )
4、赋予用户权限
> db.grantRolesToUser( ... "testuser", ... [ { role: "read", db: "game"} ] ... )
5、修改用户密码
> db.changeUserPassword("testuser", "123")