mongodb副本集授权访问

生成密钥文件

在keyfile身份验证中,副本集中的每个mongod实例都使用keyfile的内容作为共享密码,只有具有正确密钥文件的mongod或者mongos实例可以连接到副本集。密钥文件的内容必须在6到1024个字符之间,并且在unix/linux系统中文件所有者必须有对文件至少有读的权限。

可以用任何方式生成密钥文件例如:

mkdir /web/data/mongo_key
openssl rand -base64 756 > /web/data/mongo_key/KeyFile.file
chmod 400 /web/data/mongo_key/KeyFile.file

第一条命令是生成密钥文件,第二条命令是使用chmod更改文件权限,为文件所有者提供读权限

复制秘钥

将密钥复制到集群中的每台机器的指定位置

一定要保证密钥文件一致。文件位置随便。但是为了方便查找,建议每台机器都放到一个固定的位置。我的配置文件都放在/web/data/mongo_key/KeyFile.file

创建用户

建议在没开启集群认证的时候先添加好管理员用户名和密码然后再开启认证再重启

创建管理员

use admin;
db.createUser({user:"admin",pwd:'Sd!_e2019',roles:["root"]})

为da库创建管理用户

use da
db.createUser({user: "amt", pwd: 'AmT!_2019', roles: [{ role: "dbOwner", db: "da" }]})
db.createUser({user: "admin", pwd: 'Sd!_e2019', roles: [{ role: "dbOwner", db: "da" }]})
use admin
db.createUser({user:"admin",pwd:'Sd!_e2019',roles:["readWriteAnyDatabase"]})

Built-In Roles

(常用内置角色):

作用 角色
数据库用户 Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
数据库管理 readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
集群管理 clusterAdmin、clusterManager、 clusterMonitor、hostManager;
备份恢复 backup、restore;
所有数据库角 readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
超级用户 root:只在admin数据库中可用。超级账号,超级权限

修改配置文件

依次在每台机器上的mongod(注意是所有的mongod不是mongos)的配置文件中加入下面一段配置。

security:
  keyFile: /web/data/mongo_key/KeyFile.file
  clusterAuthMode: "keyFile"
  authorization: enabled

然后启动mongo副本集成员

测试

连接任意一台机器的mongo

./bin/mongo –port 27010

#认证 
use admin;
db.auth('admin','Sd!_e2019');
db.auth('amt','AmT!_2019');

#查询所有用户
use admin;
db.system.users.find().pretty()

修改鉴权方式

修改鉴权方式为MONGODB-CR (4.0)

> use admin
switched to db admin

> db.system.version.findOne({"_id" : "authSchema"})
{ "_id" : "authSchema", "currentVersion" : 5 }
# currentVersion为5则表示当前数据库的认证机制是SCRAM-SHA-1,需要改成MONGODB-CR,currentVersion的值为3

> var schema = db.system.version.findOne({"_id" : "authSchema"})

> schema.currentVersion = 3
3

> db.system.version.save(schema)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.system.version.find()
{ "_id" : "authSchema", "currentVersion" : 3 }

在这表示已经修改成功了。