MongoDB開啟安全認證
注意
- 對MongoDB部署啟用訪問控制會強制執行身份驗證,要求用戶識別自己。當訪問啟用了訪問控制的MongoDB部署時,用戶只能執行由其角色確定的操作。
- 啟用訪問控制后,請確保在admin數據庫中擁有userAdmin或userAdminAnyDatabase角色的用戶。該用戶可以管理用戶和角色
未開啟復制集的實例
以下過程首先將用戶管理員添加到運行無訪問控制的MongoDB實例,然后啟用訪問控制。
啟動MongoDB
連接到實例
- 如:
mongo --port=27017
- 1
創建用戶管理員
- 在admin數據庫中添加具有userAdminAnyDatabase角色的用戶。例如:
use admin db.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
然后斷開連接
重新啟動具有訪問控制的MongoDB實例
- 使用–auth命令行選項重新啟動mongod實例,如果使用配置文件,則使用security.authorization設置。例如:
mongod --auth --port 27017
- 1
或者使用配置文件,增加參數:
security:
authorization: enabled //冒號后面需要空一格
- 1
- 2
以用戶管理員身份進行連接和驗證
- 在連接期間進行身份驗證,例如:
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
- 1
- 連接后驗證,例如:
use admin db.auth("myUserAdmin", "abc123" )
- 1
- 2
- 創建用戶的數據庫是該用戶的身份驗證數據庫。雖然用戶將對該數據庫進行身份驗證,但用戶可以在其他數據庫中擔任角色;即用戶的認證數據庫不限制用戶的特權。
開啟復制集的實例
在副本集中執行密鑰文件訪問控制
- 對於成員的內部認證,MongoDB可以使用密鑰文件,密鑰文件的內容作為成員的共享密碼。密鑰長度必須在6到1024個字符之間,並且只能包含base64集合中的字符
- 密鑰文件的內容在所有相互連接的mongod和mongos實例上必須相同。您必須將密鑰文件存儲在副本集的每個成員上。
- 執行內部認證也強制執行用戶訪問控制
- 密鑰文件是最低限度的安全形式,最適用於測試或開發環境。
注意:執行訪問控制的以下過程需要停止mongod服務
創建一個密鑰文件
- 使用密鑰文件身份驗證,副本集中的每個mongod實例使用密鑰文件的內容作為共享密碼,用於驗證部署中的其他成員。可以使用您選擇的任何方法生成密鑰文件。例如,以下操作使用openssl生成密碼文件,然后使用chmod來更改文件權限,以便僅為文件所有者提供讀取權限
openssl rand -base64 753 > <path-to-keyfile> chmod 400 <path-to-keyfile>
- 1
- 2
將密鑰文件復制到每個副本集成員
- 將密鑰文件復制到托管副本集成員的每個服務器。確保運行mongod實例的用戶是文件的所有者,並且可以訪問密鑰文件
關閉副本集的所有成員
- 關閉復制集中的每個mongod,從次節點開始。直到副本集的所有成員都離線,包括任何仲裁者。主節點必須是最后一個成員關閉以避免潛在的回滾。要關閉mongod,請使用mongo shell連接每個mongod,並在admin數據庫上發出db.shutdownServer():
use admin db.shutdownServer()
- 1
- 2
啟動執行訪問控制的副本集的每個成員
- 使用keyFile參數運行mongod同時強制內部身份驗證和基於角色的訪問控制。使用配置文件或命令行啟動副本集中的每個mongod。
- 配置文件
如果使用配置文件,請將security.keyFile選項設置為keyfile的路徑,
security: keyFile:<path-to-keyfilie>
- 1
- 2
使用配置文件啟動mongod:
mongod --config <path-to-config-file>
- 1
- 命令行
如果使用命令行選項,請使用–keyFile數啟動mongod:
mongod --keyFile <path-to-keyfile>
- 1
連接主節點
- 通過localhost接口將mongo shell連接到配置服務器mongod主節點
必須使用localhost接口連接,因為沒有為部署創建任何用戶。創建第一個用戶后,無論您如何連接到mongod,都必須使用該用戶進行身份驗證。
創建用戶管理員
- 創建第一個用戶后,localhost異常不再可用。
- 第一個用戶必須具有創建其他用戶的權限,例如具有userAdminAnyDatabase的用戶。這確保您可以在Localhost異常關閉后創建其他用戶。
以下示例在admin數據庫上創建具有userAdminAnyDatabase角色的用戶
admin = db.getSiblingDB("admin") admin.createUser( { user: "fred", pwd: "changeme1", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
驗證用戶管理員
- 在mongo shell中,使用db.auth()進行身份驗證。
db.getSiblingDB("admin").auth("fred", "changeme1" )
- 1
- 或者使用-u ,-p 和–authenticationDatabase參數將新的mongo shell連接到主副本集成員
mongo -u "fred" -p "changeme1" --authenticationDatabase "admin"
- 1
創建集群管理員(可選)
- 集群管理員用戶具有clusterAdmin角色,它允許對復制操作的訪問。創建群集管理員用戶並在admin數據庫中分配clusterAdmin角色,例如:
db.getSiblingDB("admin").createUser( { "user" : "ravi", "pwd" : "changeme2", roles: [ { "role" : "clusterAdmin", "db" : "admin" } ] } )
- 1
- 2
- 3
- 4
- 5
- 6
- 7
創建其他用戶(可選)
...
來源:https://blog.csdn.net/jeanette_zlj/article/details/79563954