3、独立实例的访问控制

这里采用mongoDB默认认证机制,版本3.0使用SCRAM-SHA-1作为默认的挑战和响应认证机制
当启用访问控制时,副本集合和分片集群需要成员之间进行内部认证(这部分内容本节不考虑)

启用访问控制后,请确保拥有数据库中扥用户userAdmin或userAdminAnyDatabase角色admin.
该用户可以管理用户和角色,例如:创建用户、授予或撤销用户角色,以及创建或修改海关角色

我们可以在启用访问控制之前或之后创建用户,如果在创建任何用户之前启用访问控制, MongoDB提供了一个本地主机异常,允许我们在admin数据库中创建用户管理员。创建后,我们必须作为用户管理员进行身份验证,以根据需要创建其他用户

 

以下过程首先将用户管理员添加到运行无访问控制的MongoDB实例,然后启用访问控制

1、创建用户管理员

#在admin数据库中,添加具有userAdminAnyDatabase角色的用户,下面将在admin数据库中创建用户myUserAdmin

$ mongo 
  use admin
  db.createUser(
    {
      user: "myUserAdmin",
      pwd: "abc123",
      roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
  )

2、停止mongoDB

$ mongod -f /application/mongodb/conf/mongod.conf --shutdown

3、修改配置文件mongod.conf,进行security.authorization设置

...
security:
  authorization: enabled
...

4、启动mongoDB

$ mongod -f /application/mongodb/conf/mongod.conf

5、以管理员身份进行连接和验证

方式一:在连接期间验证
    $ mongo -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"

方式二:连接后验证
    $ mongo
    use admin
    db.auth("myUserAdmin", "abc123")

6、根据需要为部署创建其他用户

一旦作为用户管理员验证,使用db.createUser()创建其他用户,我们可以为用户分配内置角色或用户自定义角色
myUserAdmin用户只有权限管理用户和角色,如果我能尝试执行其他任何操作,MongoDB将返回错误

下面操作将创建用户myTester;此用户对数据库test有readWrite权限,对数据库reporting有read权限

  use test
  db.createUser(
    {
      user: "myTester",
      pwd: "xyz123",
      roles: [ { role: "readWrite", db: "test" },
               { role: "read", db: "reporting" } ]
    }
  )

  注意:
  创建用户的数据库(在此示例中 test)是该用户的身份验证数据库。虽然用户将对该数据库进行身份验证,但用户可以在其他数据库中担任角色; 即用户的认证数据库不限制用户的权限。

7、测试验证

 ①我们直接进行连接,进入test,插入数据
  $ mongo
  use test
  db.foo.insert({"name":"heboan","age":26})
  报错如下:
    WriteResult({
    "writeError" : {
      "code" : 13,
      "errmsg" : "not authorized on test to execute command { insert: \"foo\", documents: [ { _id: ObjectId('59564127bc84cbebc810bc54'), name: \"heboan\", age: 26.0 } ], ordered: true }"
      }
    })
  使用myTester用户认证,重新插入
    use test
    db.auth("myTester", "xyz123")
  结果成功插入:
    WriteResult({ "nInserted" : 1 })

  查找下刚刚插入的数据
    db.foo.find()
      { "_id" : ObjectId("59564257bc84cbebc810bc56"), "name" : "heboan", "age" : 26 }

  退出这个shell,重新再没有经过用户验证下查找这个数据,则会报错
    use test
    db.foo.find()
      Error: error: {
      "ok" : 0,
      "errmsg" : "not authorized on test to execute command { find: \"foo\", filter: {} }",
      "code" : 13,
      "codeName" : "Unauthorized"
    }

  ②没有经过用户验证登录mongoDB,
    use heboan
    db.foo.insert({x:1, y:1})
    结果报错:
      WriteResult({
      "writeError" : {
      "code" : 13,
      "errmsg" : "not authorized on heboan to execute command { insert: \"foo\", documents: [ { _id: ObjectId('59564459a9873101d91e46e7'), x: 1.0, y: 1.0 } ], ordered: true }"
      }
    })

  ③使用myTester用户验证登录mongoDB
    $ mongo
    db.auth("myTester", "xyz123")

    查询数据库reporting的数据
    use reporting
    db.foo.find() 
    结果:没有报错
    尝试插入数据
    db.foo.insert({x:1, y:1})
    报错,因为我们只赋予了它read权限
      WriteResult({
      "writeError" : {
      "code" : 13,
      "errmsg" : "not authorized on reporting to execute command { insert: \"foo\", documents: [ { _id: ObjectId('5956479646e51572598b76e4'), x: 1.0, y: 1.0 } ], ordered: true }"
      }
    })
    尝试进入数据库heboan(不存在,use就会新建,但是没有数据就不会再列表显示:所以我的理解是,如果第一次数据库里面没有数据,相当于这个数据库并没有真正的建立)
    use heboan
    db.foo.find()
      Error: error: {
      "ok" : 0,
      "errmsg" : "not authorized on heboan to execute command { find: \"foo\", filter: {} }",
      "code" : 13,
      "codeName" : "Unauthorized"
    }

8、结论:
需要创建一个管理员用户
在配置文件开启授权系统验证
利用管理员用户创建其他授权用户
创建的授权用户可以授权给多个数据库
管理员用户只有创建用户和授权的操作,不能其他任何操作
进shell验证用户有两种方式:1.连接的时候验证,2、连接后验证
如果直接进入shell,没有经过验证,无法进行其他操作(如:创建数据库,插入数据,查询数据等)

 

9、查看用户权限

use admin
db.auth("admin","abc123")

#查看所有用户
db.system.users.find()
{ "_id" : "admin.myUserAdmin", "user" : "myUserAdmin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "a0YOv3JY8dHzoK+nc3xxiQ==", "storedKey" : "VVgKMtl2mO8Y5ZMhqu3AiO70JD0=", "serverKey" : "U+Q9F7D3BOXXhKgMl02tm+/yKog=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
{ "_id" : "test.myTester", "user" : "myTester", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "kYiSZxnzmF8tX7FGdOvgew==", "storedKey" : "mSZHIJYYnsSmZpF4DrP9zgLltzc=", "serverKey" : "nDfqSVANMfDpZ+gx9hhVTvM5I2w=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "read", "db" : "reporting" } ] }

#指定用户
db.system.users.find({"user":"myTester"})
{ "_id" : "test.myTester", "user" : "myTester", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "kYiSZxnzmF8tX7FGdOvgew==", "storedKey" : "mSZHIJYYnsSmZpF4DrP9zgLltzc=", "serverKey" : "nDfqSVANMfDpZ+gx9hhVTvM5I2w=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "read", "db" : "reporting" } ] }

10、更新用户权限

use test
db.updateUser(
    "myTester",
   {
       roles: [{"role": "readWrite", "db": "test"}, {"role": "readWrite", "db": "heboan"}]
    }
    )

#查看更新后的权限
use admin
db.system.users.find({"user":"myTester"})
{ "_id" : "test.myTester", "user" : "myTester", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "kYiSZxnzmF8tX7FGdOvgew==", "storedKey" : "mSZHIJYYnsSmZpF4DrP9zgLltzc=", "serverKey" : "nDfqSVANMfDpZ+gx9hhVTvM5I2w=" } }, "roles" : [ { "role" : "readWrite", "db" : "test" }, { "role" : "readWrite", "db" : "heboan" } ] }

11、更新用户密码

use test
db.updateUser(
    "myTester",
   {
      pwd: "heboan123"
    }
    )

12、删除用户

use test
db.dropUser( "myTester" )

 

posted @ 2017-06-30 12:08  sellsa  阅读(207)  评论(0)    收藏  举报