MongoDB对数据安全提供了多种保证,其中包含验证、访问控制、加密来确保部署的数据安全。
1.开启访问控制强制校验
这就需要所有的客户端和服务端在连接系统的时候提供凭据。在集群部署的时候需要为每一个MongoDB服务开启验证。
验证方法
MongoDB提供db.auth()
方法进行验证,在使用mongo shell命令的时候,可以在控制台输入验证信息。
db.auth( <username>, <password> )
更多验证方法,参考:https://docs.mongodb.com/manual/reference/method/db.auth/#db.auth
mongo --username <user> --password <pass> --host <host> --port 28015
验证机制
MongoDB提供了多种验证机制:
- SCRAM-SHA-1
- MongoDB Challenge and Response (MONGODB-CR)
- x.509 Certificate Authentication.
- LDAP proxy authentication
- Kerberos authentication.
内部验证
除了验证客户端的身份,MongoDB可以要求验证集群中的身份验证。
集群验证
在共享集群上,客户端可以直接通过mongos验证,但是一些操作可以实现共享。
2.MongoDB 3.0+ 安全权限访问控制实例
如何mongod实例运行没有访问控制之前,增加用户管理员?
用户权限管理
1.启动MongoDB服务
mongod --fork --logpath=/home/xxx/mongo/mongdb.log
2.连接到实例
mongo
3.创建的用户管理员
添加一个userAdminAnyDatabase
角色的用户。例如,下面创建用户admin在admin数据库:
use admin
db.createUser(
{
user: "admin",
pwd: "admin123",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
4.重新启动MongoDB实例,并启用访问控制。
mongod --fork --logpath=/home/xxx/mongo/mongdb.log --auth
5.用户管理员身份验证
创建连接mongo shell 时进行授权,指定-u <username>, -p <password>, and the --authenticationDatabase <database>
mongo -u "admin" -p "admin123" --authenticationDatabase "admin"
或者 mongo shell连接时不认证,使用db.auth()授权
use admin
db.auth("admin", "admin123" )
服务器已开启认证后,如何创建用户管理员
若首次启动即添加身份认证,因为mongodb的身份只能使用客户端连接后,use admin
,再在admin下使用
db.createUser()
创建对应用户,如果有权限控制,可能会令一个用户也添加不了。其实这是多虑的,mongodb添加了Localhost Exception。
1.启动MongoDB实例的访问控制
启动mongod实例 AUTH命令行选项,如果使用配置文件的设置,security.authorization。
sudo service mongod start
2.通过localhost exception连接MongoDB实例
添加第一个用户, 使用Localhost Exception,连接一个mongod实例。运行Mongo shell和mongod实例必须来自同一主机
Localhost Exception 允许启用访问控制并创建第一个用户在系统中
3.同上创建用户方式相同,不再赘述
普通用户安全访问权限
1.启动MongoDB:
mongod --fork --logpath=/home/xxx/mongo/mongdb.log --auth
2.再次打开 mongo shell:
mongo -u "admin" -p "admin123" --authenticationDatabase "admin"
或者
mongo
use admin
db.auth("admin", "admin123" )
此时show collections,报错:
2015-03-17T10:15:56.011+0800 EQUERYError: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { listCollections: 1.0 }",
"code" : 13
}
at Error (<anonymous>)
at DB._getCollectionInfosCommand (src/mongo/shell/db.js:643:15)
at DB.getCollectionInfos (src/mongo/shell/db.js:655:20)
at DB.getCollectionNames (src/mongo/shell/db.js:666:17)
at shellHelper.show (src/mongo/shell/utils.js:625:12)
at shellHelper (src/mongo/shell/utils.js:524:36)
at (shellhelp2):1:1 at src/mongo/shell/db.js:643
因为,用户admin只有用户管理的权限。
3.创建用户,用户都跟着数据库走
use test
db.createUser(
{
user: "test1",
pwd: "test1",
roles: [
{ role: "readWrite", db: "test" }
]
}
)
4.查看刚刚创建的用户
show users
结果为:
{
"_id" : "test.test1",
"user" : "test1",
"db" : "test",
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
5.查看整个mongoDB全部的用户
use admin
db.system.users.find()
> db.system.users.find().pretty()
{
"_id" : "admin.myUserAdmin",
"user" : "myUserAdmin",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "4DvAj1iKzHkAocxvLSHIiw==",
"storedKey" : "UIyGAiDpVtedBo2COQu77auhLic=",
"serverKey" : "Nyeq9uCtmEEF5bUxXw3Rf7ZKMvw="
}
},
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
{
"_id" : "test.test1",
"user" : "test1",
"db" : "test",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "d9KsgiwkupQS3R4GULhtoQ==",
"storedKey" : "q0kNcliYpON03zNv9BeeQ1Z9BrE=",
"serverKey" : "Hw1CypmMNaJI53bbelJtQIACgkA="
}
},
"roles" : [
{
"role" : "readWrite",
"db" : "test"
}
]
}
6.创建完毕,验证一下:
> use test
> db.auth('test1','test1')
1
> show collections
ypmlist
修改权限
使用updateuser()方法语法以下:
db.updateUser(
"<username>",
{
customData : { <any information> },
roles : [
{ role: "<role>", db: "<database>" } | "<role>",
...
],
pwd: "<cleartext password>"
},
writeConcern: { <write concern> }
)
Parameter | Type | Description |
---|---|---|
username | string | 要更新用户名 |
update | document | 替换用户数据的文档。此数据完全取代了用户的相应数据。 |
writeConcern | document | 可选,写操作级别 |
指定要更新的字段和它们的新值。在更新文档中的所有字段都是可选的,但必须至少包含一个字段。 更新文档具有以下字段:
Field | Type | Description |
---|---|---|
customData | document | 可选。任意信息。 |
roles | array | 可选。授予用户的角色。对角色数组覆盖以前的数组的值更新 |
pwd | string | 可选。用户密码 |
修改权限操作
> use admin
switched to db admin
> db.auth("admin", "admin123" ) #需要使用管理员权限修改用户信息
1
use test
db.updateUser(
"test1",
{
pwd: "itcast",
customData: { title: "Senior Manager" },
"roles" : [
{
"role" : "readWrite",
"db" : "test"
},
{
"role" : "readWrite",
"db" : "example"
}
]
}
)
超级用户
use admin
db.createUser(
{
user: "itcast",
pwd: "itcast",
roles: [ { role: "root", db: "admin" } ]
}
)
以下是系统默认角色
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
参考
https://piaosanlang.gitbooks.io/mongodb/content/02day/section2.1.html
https://docs.mongodb.com/manual/core/authentication/