MongoDB數據庫高并發商業實踐優化·運行優化之不可使用root賬戶進行MongoDB運行-優雅草卓伊凡
引言
關于最近優雅草卓伊凡發布關于MongoDB的內容是由于我們的甲方上線了一個很老的產品,但是他的用戶量極大,并且還有各種人搞事情,不斷的來GJ,上線剛開始還能勉強撐著,但是隨著用戶量急劇上升,包括他們的收入訂單各方面,以及請求次數的規模及上升,老古董即便是java +spring +redis 配 cdn 加靈活帶寬都抗不住問題,而且上線后出問題后都很復雜,這核心有一點就是數據庫,MongoDB 我們的版本是3.4.0 而云數據庫也就是騰訊云買900多元一月 基礎的云MongoDB數據庫都是需要最低4.4版本的,這個可就難了,我們版本太老 ,升級的復雜度不亞于重構,于是在這個環境下我們測試環境已經安排在重構,但是生產環境頂著壓力做優化,既然是做優化那么在這么老版本的情況下就有很多挑戰,很慶幸在我們技術同事以及技術總監卓伊凡的帶領下在7月23日終于得到了突破進展,中途有特別多的問題,由卓伊凡拆分一一記錄和學習,讓我們對數據的深度理解也非常有幫助,在過程中我們積累了很多知識可以逐步細化消化。
Loaded: loaded (/etc/systemd/system/mongod.service; enabled; preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Wed 2025-07-23 21:38:10 CST; 1s ago
Docs: What is MongoDB? - Database Manual - MongoDB Docs
Process: 238158 ExecStart=/opt/mongodb-3.4.0/bin/mongod —config /opt/mongodb-3.4.0/mongo.conf (code=exited, status=217/USER)
Main PID: 238158 (code=exited, status=217/USER)
CPU: 690us
在那天我們發現有不正常運行,檢查了MongoDB 的運行狀態。
由于在教科書中有寫到我們不能用root帳號運行也會造成頻繁掉線的問題,這就不得詳細講了
在生產環境中,禁止使用 root 用戶運行 MongoDB 是一項重要的安全最佳實踐。以下從安全風險、權限管理、故障排查和性能影響四個方面詳細闡述原因:
一、安全風險:為什么不能用 root 運行 MongoDB?
1. 權限提升攻擊風險
- 任意文件讀寫:若 MongoDB 被攻擊(如通過注入漏洞),root 權限的進程可直接訪問/修改系統文件(如
/etc/passwd
、SSH 密鑰)。 - 持久化后門:攻擊者可利用 root 權限在系統啟動腳本中植入后門,實現持久控制。
2. 最小權限原則失效
- MongoDB 僅需讀寫數據目錄和日志文件的權限,root 權限遠超實際需求。
- 遵循 最小權限原則(Least Privilege)可降低單點故障的影響范圍。
3. 防御縱深缺失
- 若 MongoDB 被攻破,普通用戶權限的進程最多只能影響數據目錄,而 root 權限將導致整個系統淪陷。
二、權限管理:為什么需要專用用戶?
1. 文件所有權隔離
- 專用用戶(如
mongodb
)確保數據文件(/data/mongodb
)和配置文件(/opt/mongodb-3.4.0
)的所有權清晰。 - 避免與其他服務(如 MySQL、Nginx)的文件權限沖突。
2. 進程隔離
- systemd 可基于用戶限制資源使用(如
LimitNOFILE
、MemoryMax
):
[Service]
User=mongodb
Group=mongodb
LimitNOFILE=64000
MemoryMax=8G # 限制 MongoDB 最大內存使用
3. 審計追蹤
- 專用用戶便于日志審計:
# 查看 mongodb 用戶的所有操作
sudo ausearch -ua mongodb
三、故障排查:為什么 root 會掩蓋問題?
1. 權限錯誤被隱藏
- root 用戶可繞過文件權限檢查,導致配置錯誤(如錯誤的目錄權限)在測試階段不暴露,上線后普通用戶無法啟動服務。
2. 系統資源競爭
- root 進程可能無限制占用系統資源(如內存、文件描述符),導致其他服務崩潰。
- 專用用戶可通過
ulimit
限制資源使用:
# 編輯 /etc/security/limits.conf
mongodb hard nofile 64000
mongodb soft nofile 64000
其實這里 也存在一個文件描述 頻繁導致掉線也解決的一個問題,我們單獨一篇來講。
我們這個地方 也是修改了
四、性能影響:使用專用用戶會變慢嗎?
1. 無直接性能損耗
- 進程權限本身不影響 MongoDB 性能,但錯誤的權限配置可能間接導致問題:
-
- 例如,root 用戶創建的文件可能被 MongoDB 用戶(如
mongodb
)拒絕訪問,觸發頻繁的權限檢查。
- 例如,root 用戶創建的文件可能被 MongoDB 用戶(如
2. 資源限制優化性能
- 通過
systemd
限制 MongoDB 內存使用可避免系統 OOM(Out of Memory):
[Service]
MemoryMax=32G # 適用于 64GB 系統,防止 MongoDB 耗盡內存
3. 權限與磁盤 I/O
- 專用用戶確保文件權限一致性,避免因權限問題導致的磁盤 I/O 性能下降。
五、最佳實踐:如何正確配置專用用戶?
1. 創建專用用戶和組
sudo groupadd -r mongodb
sudo useradd -r -g mongodb -d /data/mongodb -s /bin/false mongodb
2. 設置正確的文件權限
sudo chown -R mongodb:mongodb /data/mongodb
sudo chown -R mongodb:mongodb /opt/mongodb-3.4.0
3. 配置 systemd 服務文件
[Service]
User=mongodb
Group=mongodb
WorkingDirectory=/data/mongodb
ExecStart=/opt/mongodb-3.4.0/bin/mongod --config /opt/mongodb-3.4.0/mongo.conf
這就不得不提到我之前寫的蜻蜓I即時通訊 水銀版搭建方法中有關于數據庫的啟動,因此這里非常不嚴謹
這個就非常的不對,
六、對比實驗:root vs 專用用戶的差異
指標 | root 用戶 | 專用用戶 |
文件權限沖突 | 高(可能覆蓋系統文件) | 低(僅訪問數據目錄) |
系統安全風險 | 極高(權限提升攻擊) | 低(最小權限原則) |
故障排查復雜度 | 高(權限錯誤被掩蓋) | 低(權限問題直接暴露) |
資源隔離能力 | 無(可能耗盡系統資源) | 有(可通過 systemd 限制) |
審計追蹤可行性 | 困難(與系統操作混淆) | 容易(專用用戶日志清晰) |
七、總結:為什么必須使用專用用戶?
- 安全層面:降低權限提升攻擊風險,遵循最小權限原則。
- 管理層面:實現進程隔離、文件權限清晰和審計追蹤。
- 故障排查:避免權限錯誤被隱藏,提高問題定位效率。
- 性能影響:正確配置下無負面影響,反而可通過資源限制優化性能。
建議:立即將 MongoDB 服務從 root 用戶遷移至專用用戶,并通過 systemd
確保服務以正確用戶身份運行。
我們做到了最終 是以MongoDB 運行。