MongoDB 基础安全性(权限操作)

和其他所有数据库一样,权限的管理都差不多一样。mongodb存储所有的用户信息在admin 数据库的集合system.users中,保存用户名、密码和数据库信息。mongodb默认不启用授权认证,只要能连接到该服务器,就可连接到mongod。若要启用安全认证,需要更改配置文件参数auth。

以下测试理解

查看数据库:

> show dbs

发现 admin 竟然没有!~

找了好久,找不到相关说明,于是直接创建用户admin

 
  1. use admin

  2.  
  3.  
  4. db.createUser(

  5. {

  6. user: "admin",

  7. pwd: "admin",

  8. roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]

  9. }

  10. )

成功创建,再查询admin中的集合,有数据了!

 
  1. > show collections

  2. system.indexes

  3. system.users

  4. system.version


查看3个集合的信息:

 
  1. > db.system.users.find();

  2. { "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "cFISfpbm04pmIFpqiL340g==", "storedKey" : "WG1DSEEEHUZUBjsjsnEA4RFVY2M=", "serverKey" : "9Lm+IX6l9kfaE/4C25/ghsQpDkE=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }

  3. >

  4. > db.system.indexes.find();

  5. { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "admin.system.version" }

  6. { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "admin.system.users" }

  7. { "v" : 1, "unique" : true, "key" : { "user" : 1, "db" : 1 }, "name" : "user_1_db_1", "ns" : "admin.system.users" }

  8. >

  9. > db.system.version.find();

  10. { "_id" : "authSchema", "currentVersion" : 5 }

  11. >


现在启用 auth:
[root@localhost ~]# vi /etc/mongod.conf

auth=true


重启 mongod 服务:

[root@localhost ~]# service mongod restart

直接默认登录,查看集合,发现无权操作了:

[root@localhost ~]# mongo

 
  1. [root@localhost ~]# mongo

  2. MongoDB shell version: 3.0.2

  3. connecting to: test

  4. > show dbs

  5. 2015-05-09T21:57:03.176-0700 E QUERY Error: listDatabases failed:{

  6. "ok" : 0,

  7. "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",

  8. "code" : 13

  9. }

  10. at Error (<anonymous>)

  11. at Mongo.getDBs (src/mongo/shell/mongo.js:47:15)

  12. at shellHelper.show (src/mongo/shell/utils.js:630:33)

  13. at shellHelper (src/mongo/shell/utils.js:524:36)

  14. at (shellhelp2):1:1 at src/mongo/shell/mongo.js:47

  15. >


 

刚才在数据库 admin 创建了一个账户 admin ,先到数据admin进来连接(其他db则失败):

 
  1. [root@localhost ~]# mongo

  2. MongoDB shell version: 3.0.2

  3. connecting to: test

  4. >

  5. > db.auth("admin","admin")

  6. Error: 18 Authentication failed.

  7. 0

  8. > use mydb

  9. switched to db mydb

  10. > db.auth("admin","admin")

  11. Error: 18 Authentication failed.

  12. 0

  13. > use admin

  14. switched to db admin

  15. > db.auth("admin","admin")

  16. 1

  17. >


db.auth("admin","admin") 返回值为1,说明登录成功!~db.auth("admin","admin") 记录是不存在的,执行完后这一行在shell中不会记录历史。

所以现在创建另一个用户"myuser"

 
  1. db.createUser(

  2. {

  3. user: "myuser",

  4. pwd: "myuser",

  5. roles: [ { role: "readWrite", db: "mydb" } ]

  6. }

  7. )


也可以增删角色:

 
  1. #授予角色:db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ])

  2.  
  3. db.grantRolesToUser( "myuser" , [ { role: "dbOwner", db: "mydb" } ])

  4.  
  5.  
  6. #取消角色:db.grantRolesToUser( "userName" , [ { role: "<role>", db: "<database>" } ])

  7.  
  8. db.revokeRolesFromUser( "myuser" , [ { role: "readWrite", db: "mydb" } ])


因为在admin数据库创建的,只能在 admin 数据库中登录:

 
  1. > db.auth("myuser","myuser")

  2. Error: 18 Authentication failed.

  3. 0

  4. >

  5. > db

  6. mydb

  7. > use admin

  8. switched to db admin

  9. > db.auth("myuser","myuser");

  10. 1

  11. >


此时是可以切换到所在的数据库进行相关操作:

 
  1. > use mydb

  2. switched to db mydb

  3. >

  4. > db.tab.save({"id":999});

  5. WriteResult({ "nInserted" : 1 })

  6. >

  7. > db.tab.find({"id":999});

  8. { "_id" : ObjectId("554ef5ac1b590330c00c7d02"), "id" : 999 }

  9. >

  10. > show collections

  11. system.indexes

  12. tab

  13. >


在创建用户时可以在其数据库中创建,这样不用每次都进入admin数据库登录后再切换。如在数据库"mydb"创建用户"userkk"。

 
  1. use admin

  2.  
  3. db.auth("admin","admin")

  4.  
  5. use mydb

  6.  
  7. db.createUser(

  8. {

  9. user: "userkk",

  10. pwd: "userkk",

  11. roles: [ { role: "dbOwner", db: "mydb" } ]

  12. }

  13. )

  14.  
  15. db.auth("userkk","userkk")


 

------------------------------------------------------------------------------------------------------------------

                                                      华丽分割

------------------------------------------------------------------------------------------------------------------

现在授权测试:

#先访问到admin数据库

 
  1. use admin

  2.  
  3. db.auth("admin","admin")

#切换到 mydb ,在数据库 mydb 中创建角色
#roles: 创建角色"testRole"在数据库 "mydb" 中
#privileges: 该角色可查看"find"数据库"mydb"的所有集合
#db.dropRole("testRole")

 
  1. use mydb

  2.  
  3. db.createRole({

  4. role: "testRole",

  5. privileges: [{ resource: { db: "mydb", collection: "" }, actions: [ "find" ] }],

  6. roles: []

  7. })


#在admin数据库生成集合system.roles。查看角色。

 
  1. > use admin

  2. switched to db admin

  3. >

  4. > show collections

  5. system.indexes

  6. system.roles

  7. system.users

  8. system.version

  9. >

  10. > db.system.roles.find();

  11. { "_id" : "mydb.testRole", "role" : "testRole", "db" : "mydb", "privileges" : [ { "resource" : { "db" : "mydb", "collection" : "" }, "actions" : [ "find" ] } ], "roles" : [ ] }

  12. >


#回到mydb,在数据库mydb中创建用户并授予角色"testRole"
#db.dropUser("userkk")

 
  1. use mydb

  2.  
  3. db.createUser(

  4. {

  5. user: "userkk",

  6. pwd: "userkk",

  7. roles: [ { role: "testRole", db: "mydb" } ]

  8. }

  9. )


退出mongodb,重新登录进行操作。发现只能使用find
>exit

 
  1. [root@localhost ~]# mongo

  2. MongoDB shell version: 3.0.2

  3. connecting to: test

  4. > use mydb

  5. switched to db mydb

  6. >

  7. > db.auth("userkk","userkk")

  8. 1

  9. >

  10. > db.tab.find({"id":999})

  11. { "_id" : ObjectId("554ef5ac1b590330c00c7d02"), "id" : 999 }

  12. >

  13. > db.tab.insert({"id":1000})

  14. WriteResult({

  15. "writeError" : {

  16. "code" : 13,

  17. "errmsg" : "not authorized on mydb to execute command { insert: \"tab\", documents: [ { _id: ObjectId('554f145cdf782b42499d80e5'), id: 1000.0 } ], ordered: true }"

  18. }

  19. })

  20. >


给角色 "testRole"  添加3个 “Privileges”权限: "update", "insert", "remove"。再重新操作。

 
  1. use admin

  2.  
  3. db.auth("admin","admin")

  4.  
  5. use mydb

  6.  
  7. #添加Privileges给角色

  8. db.grantPrivilegesToRole("testRole",

  9. [{ resource: { db: "mydb", collection: "" },actions: [ "update", "insert", "remove" ]}

  10. ])

  11.  
  12.  
  13. exit #退出mongodb重新登录

  14.  
  15.  
  16. use mydb

  17.  
  18. db.auth("userkk","userkk")

  19.  
  20.  
  21. #增删数据可以操作了!~

  22. db.tab.insert({"id":1000})

  23. db.tab.find({"id":1000})

  24. db.tab.remove({"id":1000})

  25.  
  26.  
  27. #此时admin的角色记录为:

  28. > db.system.roles.find();

  29. { "_id" : "mydb.testRole", "role" : "testRole", "db" : "mydb", "privileges" : [ { "resource" : { "db" : "mydb", "collection" : "" }, "actions" : [ "find", "insert", "remove", "update" ] } ], "roles" : [ ] }

  30. >

  31.  


#更改角色 roles,把roles值全部更新。同样Privileges也可以更新替换!~

 
  1. use admin

  2.  
  3. db.auth("admin","admin")

  4.  
  5. use mydb

  6.  
  7. db.updateRole("testRole",{ roles:[{ role: "readWrite",db: "mydb"}]},{ w:"majority" })

  8.  
  9. db.auth("userkk","userkk")

  10.  
  11. show dbs

猜你喜欢

转载自blog.csdn.net/qq_36663951/article/details/81223441