標籤:document sys 網路流 指定 dmi 方法 put god 系統
要保證一個安全的MongoDB運行環境,DBA需要實施一些控制保證使用者或應用程式僅僅訪問它們需要的資料。這些措施包括但不限於:
一、認證機制
認證是驗證用戶端使用者身份的過程。開啟存取控制後,MongoDB需要所有用戶端認證它們自己身份以決定它們的存取權限。儘管認證和授權比較相近,但是認證是區別於授權的,認證是證明身份,授權是決定它們訪問的資源和操作。
1、使用者
為了認證用戶端,你必須要添加一個對應的使用者到MongoDB.
- 使用者管理介面:db.createUser()方法可以建立一個使用者,添加完成後可以分配角色給使用者,第一個使用者必須是管理員,用來管理其他使用者。你也可以更新存在的使用者,必須修改密碼和許可權。
- 認證資料庫:當添加一個使用者後,你在某個指定的資料庫中添加該使用者,那麼這個資料庫對於該使用者就是個認證資料庫。一個使用者可以有許可權訪問多個資料庫,通過分配角色許可權來做到。
- 認證使用者:為了認證使用者,可以通過db.author()方法。
- 分區叢集使用者:為分區叢集建立使用者,可以通過mongos執行個體進行,mongodb將使用者資訊儲存到config server的admin庫中。但是有些操作需要直接連接到分區主機上進行的,這時這些使用者就不行了,需要到分區主機上建立shard local系統管理使用者
2、認證機制
1)SCRAM-SHA-1
2)MONGODB-CR
3)x.509
二、角色型存取控制
MongoDB預設是沒有開啟存取控制,你能開啟通過--auth參數重啟mongod服務。一旦開啟了,使用者串連mongod必須指定使用者名稱和密碼。
1、內建角色
MongoDB提供許多內建角色,用於不同層級的訪問資料庫資源。在每個資料庫中都存在內建資料庫使用者角色和資料庫管理員角色
1)資料庫使用者角色
每個資料庫都包含以下角色:
- read:提供讀許可權,除了非系統集合
- readWrite:提供讀寫權限
2)資料庫管理員角色
每個資料庫都包含以下角色:
- dbAdmin:提供schema相關的操作、索引、搜集統計資訊等許可權,不能分配角色。
- dbOwner:這個角色包括readWrite、dbAdmin、userAdmin角色的許可權
- userAdmin:提供修改和建立角色和使用者的許可權。由於該角色能夠分配許可權,包括他們自己,所以間接的提供超級使用者的許可權。
3)叢集管理角色
- clusterAdmin:提供叢集管理的最高許可權,包括clusterManager、clusterMonitor、hostManager角色。此外還有刪除資料庫的許可權
- clusterManager:能夠訪問config和local資料庫的許可權
- clusterMonitor:對於監控工具提供唯讀許可權
- hostManager:提供監控和管理主機的許可權
4)備份和恢複角色
- backup:除了system.profile集合,該角色提供足夠的許可權來使用MongoDB Cloud Manager、Ops Manager、mongodump等工具對所有集合進行備份。
- restore:恢複資料的許可權
5)所有資料庫許可權
- readAnyDatabase:提供讀所有資料庫的許可權
- readWriteAnyDatabase:同readWrite,範圍是所有資料庫。
- userAdminAnyDatabase:同userAdmin,範圍是所有資料庫
- dbAdminAnyDatabase:同dbAdmin,範圍所有資料庫
6)超級角色
7)內部角色
- __system:提供維護資料庫物件的許可權,一般不用分配給使用者。
2、自訂角色
MongoDB提供許多內建角色,當然,如果不滿足需要,你可以建立自己的角色
你可以使用db.createRole()方法建立角色,這些角色被儲存在admin庫的system.roles集合中。
3、基於集合層級的存取控制
基於集合層級存取控制允許DBA基於某些特定集合給使用者指派許可權,也就是使用者只能訪問某些特定的集合。
【存取層級控制執行個體:單機環境】
步驟一:在未啟用存取層級前建立管理使用者,(如果不這樣,一旦開啟了存取控制,你雖然可以進入mongos,但是不具有任何增刪改許可權了):
use admindb.createUser( { user: "myUserAdmin", pwd: "abc123", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] })
步驟二:帶--auth參數重啟mongod服務(即開啟存取層級控制)
mongod --dbpath=/data/27019/db --fork --logpath=/data/27019/log/mongodb.log --port 27019 --auth
步驟三:使用管理員登入並建立一個普通使用者
[[email protected] 27019]# mongo --port 27019 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin" #使用管理員登入use testdb.createUser( #在test庫中建立所屬使用者testUser,雖然該使用者屬於test庫,但是通過角色指派,它也可以對其他資料庫有操作許可權 { user: "testUser", pwd: "12345678", roles: [ { role: "read", db: "children" }, #對children庫有唯讀許可權 { role: "readWrite", db: "test" }, #對test庫有讀寫權限 { role: "readWrite", db: "HashTest" } #對HashTest庫有讀寫權限 ] })
#使用新使用者testUser登入測試[[email protected] 27019]# mongo --port 27019 -u "testUser" -p "12345678" MongoDB shell version: 3.2.0connecting to: 127.0.0.1:27019/test> db.user.insert({"_id":1,"name":"darren"}) #向test庫中插入資料,可以成功WriteResult({ "nInserted" : 1 })> use children #向children庫中插入資料,失敗,因為只有讀的許可權switched to db children> db.user.insert({"_id":1,"name":"darren"})WriteResult({ "writeError" : { "code" : 13, "errmsg" : "not authorized on children to execute command { insert: \"user\", documents: [ { _id: 1.0, name: \"darren\" } ], ordered: true }" }})
> use HashTest
switched to db HashTest
> db.user.insert({"_id":1,"name":"darren"}) #向HashTest庫中插入資料,成功。
WriteResult({ "nInserted" : 1 })
總結:MongoDB一個資料庫需要屬於一個使用者,當一個相同的使用者需要訪問多個資料庫,不需要在每個資料庫中都建立同樣的使用者,可以建立一個專門系統管理使用者的庫,通過角色指派達到這種目的,更加容易維護和管理。
三、加密
1、傳輸加密
你可以用TLS/SSL來加密MongoDB的網路流量,它們能夠確保網路流量僅僅被需要的用戶端讀取。
2、靜態加密
有兩種主要的方法加密待用資料:應用程式層加密和儲存層加密。你可以一起用也可以單獨使用一種。V3.2中為WiredTiger儲存引擎引入新的加密選項,這種特性允許你加密資料檔案,如此一來只有帶有解密鍵的那部分能夠解密和讀取資料。詳細講解請參考官方手冊。
四、審計
MongoDB企業版包括審計功能。審計功能允許管理員和使用者在部署多使用者和應用程式環境時跟蹤系統活動。具體請查閱官方文檔。
五、其他方面安全控制
1、MongoDB配置
確保禁用http狀態介面,預設mongodb是禁用的。
2、網路安全
配置作業系統防火牆控制訪問系統層級或者使用VPN。
1)防火牆規則(liunx)
通過指定防火牆規則,mongodb管理員可以控制哪些主機可以串連到mongodb伺服器上,從而減少mongodb伺服器曝光度,限制風險。
在iptables規則配置分為鏈,這裡主要控制兩個鏈:
這個模式適用於所有到mongod執行個體的單機或者複本集成員主機,目的是只允許應用伺服器串連到mongodb伺服器上:
iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPTiptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
2)VPNs
具體參考文檔。
【九】MongoDB管理之安全性