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" )