生成密鑰文件
在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 }
在這表示已經修改成功了。