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" )
浙公网安备 33010602011771号