Mongo的安全验证
2016-03-24 17:13
579 查看
参考如下的文档:
https://docs.mongodb.org/manual/tutorial/enable-authentication/
1.1. 在启用匿名验证的情况下,创建一个可以管理所有数据库用户的用户。
1.2. 用—auth选项重新启动MongoDB服务。
>先停止和删除已有的MongoDB服务,然后用如下的命令重新安装:
(如果去掉—auth, 就是允许匿名验证)
然后net start MongoDB.
>用命令行连接Mongo,
注意,一定要带上数据库名字admin,否则会报验证失败错误。因为它会找所在数据库中的system.users表,如果不写admin数据库的名字,可能就去找test.system.users, 当然找不到,就会报验证失败的错误。
1.3. 用命令行连接上后,就可以创建其他用户了。
当在admin中创建如下权限的用户时,是对所有数据库都有效的,也就是说权限会应用到cluster中所有的数据库中。
dbOwner role, when scoped to the admin database
userAdmin role, when scoped to the admin database
userAdminAnyDatabase role
例子:
目前我看到最大的权限时root:
例子:
另外还有readAnyDatabase,readWriteAnyDatabase。
更多的Mongo内置角色请看这个文章:https://docs.mongodb.org/manual/reference/built-in-roles/#userAdminAnyDatabase
上面的这些角色我试了几个,以下是体会:
userAdminAnyDatabase: 只能管理用户,不能查看collection中的数据,其他权限应该也没有。
dbAdminAnyDatabase: 只能查看db列表,可能能够增加和删除db,但是不能查看collection,其他很多权限应该也没有。
readWriteAnyDatabase: 可以对所有数据库的所有collection进行增删改查操作。
Root: 目前我所看到的最高角色,在 MongoVue中貌似可以做任何事情。
但是: 以上的这些超级用户权限,在MongoVue中跟文档上描述的权限时一致的,但我用.net的API操作的时候,写入collection的时候总是会报验证失败的错误。
在用.net的API操作Mongo的时候,要想写入一个db中的一个collection, 只有对单个的数据库创建的用户才是好用的。
如果要执行dropDatabase和createDatabase的操作,除了在单个的数据库上,还需要在admin也添加dbOwner的权限(或者其他创建数据库的权限?这个没试过。dbOwner是好用的。)
2. Mongo的验证机制:
参考这个文档:https://docs.mongodb.org/manual/core/authentication/
在Mongo3.0之前,默认的验证机制是MONGODB-CR, 从3.0开始,默认的验证机制是SCRAM-SHA-1.
貌似.net针对Mongo的API还不支持SCRAM-SHA-1,所以如果用Mongo3.0以及以后的版本,必须将Mongo的默认验证机制改成MONGODB-CR。 方法参考这个文章:http://stackoverflow.com/questions/30854155/how-to-change-default-authentication-method-from-scram-sha-1-back-to-mongodb-cr
就是在mongo的命令行中定位到admin数据库后,执行如下的命令:
如果要改回SCRAM-SHA-1,用如下的命令:
(参考: https://docs.mongodb.org/manual/release-notes/3.0-scram/ )
此时schema.currentVersion为5.
3. 删除用户:
定位到所在的数据库后,运行命令db.dropUser('<username>')
https://docs.mongodb.org/manual/tutorial/enable-authentication/
1.1. 在启用匿名验证的情况下,创建一个可以管理所有数据库用户的用户。
use admin db.createUser( { user: "admin", pwd: "admin", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } ) |
>先停止和删除已有的MongoDB服务,然后用如下的命令重新安装:
"C:\Program Files\MongoDB\Server\3.0\bin\mongod.exe" --config "C:\Program Files\MongoDB\Server\3.0\etc\mongodb.conf" --dbpath "C:\Program Files\MongoDB\Server\3.0\bin\data\db" --directoryperdb --service --install --auth |
然后net start MongoDB.
>用命令行连接Mongo,
mongo admin -u root -p root |
1.3. 用命令行连接上后,就可以创建其他用户了。
当在admin中创建如下权限的用户时,是对所有数据库都有效的,也就是说权限会应用到cluster中所有的数据库中。
dbOwner role, when scoped to the admin database
userAdmin role, when scoped to the admin database
userAdminAnyDatabase role
例子:
db.createUser( { user: "dbOwner", pwd: "dbOwner", roles: [ { role: "dbOwner", db: "admin" } ] } ) |
root Provides access to the operations and all the resources of the readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin roles, restore combined. Changed in version 3.0.7: The root has validate action on system. collections. Previously, root does not include any access to collections that begin with the system. prefix. The root role includes privileges from the restore role. |
db.createUser( { user: "root", pwd: "root", roles: [ { role: "root", db: "admin" } ] } ) |
更多的Mongo内置角色请看这个文章:https://docs.mongodb.org/manual/reference/built-in-roles/#userAdminAnyDatabase
上面的这些角色我试了几个,以下是体会:
userAdminAnyDatabase: 只能管理用户,不能查看collection中的数据,其他权限应该也没有。
dbAdminAnyDatabase: 只能查看db列表,可能能够增加和删除db,但是不能查看collection,其他很多权限应该也没有。
readWriteAnyDatabase: 可以对所有数据库的所有collection进行增删改查操作。
Root: 目前我所看到的最高角色,在 MongoVue中貌似可以做任何事情。
但是: 以上的这些超级用户权限,在MongoVue中跟文档上描述的权限时一致的,但我用.net的API操作的时候,写入collection的时候总是会报验证失败的错误。
if (!String.IsNullOrWhiteSpace(userName)) { var db1Credential = MongoCredential.CreateMongoCRCredential(databaseName, userName, password); settings.Credentials = new[] { db1Credential }; } |
db.createUser( { user: "user1", pwd: "user1", roles: [ { role: "dbOwner", db: "Database1" } ] } |
use admin db.createUser( { user: "user1", pwd: "user1", roles: [ { role: "dbOwner", db: "admin" } ] } |
2. Mongo的验证机制:
参考这个文档:https://docs.mongodb.org/manual/core/authentication/
在Mongo3.0之前,默认的验证机制是MONGODB-CR, 从3.0开始,默认的验证机制是SCRAM-SHA-1.
貌似.net针对Mongo的API还不支持SCRAM-SHA-1,所以如果用Mongo3.0以及以后的版本,必须将Mongo的默认验证机制改成MONGODB-CR。 方法参考这个文章:http://stackoverflow.com/questions/30854155/how-to-change-default-authentication-method-from-scram-sha-1-back-to-mongodb-cr
就是在mongo的命令行中定位到admin数据库后,执行如下的命令:
var schema = db.system.version.findOne({"_id" : "authSchema"}) schema.currentVersion = 3 db.system.version.save(schema) |
(参考: https://docs.mongodb.org/manual/release-notes/3.0-scram/ )
db.adminCommand({authSchemaUpgrade: 1}); |
3. 删除用户:
定位到所在的数据库后,运行命令db.dropUser('<username>')
相关文章推荐
- 算法基础:最大递减数问题(Golang实现)
- LeetCode Algorithms #101 <Symmetric Tree>
- zygote启动过程分析
- Intent中的四个重要属性——Action、Data、Category、Extras
- goldengate的replicat简单拆分
- LeetCode Algorithms #198 <House Robber>
- 百练:1003:Hangover
- 异常com.google.gson.internal.StringMap cannot cast to..原因&解决方案
- 又一道简单题&&Ladygod(两道思维水题)
- Search gold(dp)
- GOOGLE VR SDK开发VR游戏,VR播放器之二
- django环境搭建
- GOOGLE VR SDK开发VR游戏
- Go语言:通过组合获得接口
- GOOGLE VR SDK开发VR游戏,VR播放器之一
- 【杭电oj】3635 - Dragon Balls(带权并查集,好题)
- GCM(谷歌云推送)客户端服务器端开发全指南(服务器篇)
- 记录一些常用git命令,省得老google
- 【深度学习经典论文翻译2】GoogLeNet-Going Deeper with Convolutions全文翻译
- 安卓智能语音机器人--AlphaGo?你也可以