MongoDB安全checklist及最優配置模板

張友東發表於2017-01-09
基於飛天分散式系統和高效能儲存,提供三節點副本集的高可用架構,容災切換,故障遷移完全透明化。並提供專業的資料庫線上擴容、備份回滾、效能優化等解決方案。

最近 MongoDB “贖金事件”鬧得沸沸揚揚,不少公網上裸奔的 MongoDB 中招,有興趣的同學可以看下耗子叔寫的從 MONGODB “贖金事件” 看安全問題,中招的主要原因還是因為使用者的安全意識比較薄弱,部署的 MongoDB 完全沒有任何安全防護,可以通過公網訪問,並且沒有開啟鑑權

MongoDB 官方文件在安全方面做了很多總結,出了一個MongoDB Security Checklist,但從這次中招的規模來看,大部分使用者並沒有認真看過這個文件,這次事件也剛好是一個資料庫安全科普的好機會,希望所有的資料庫使用者都要重視自己的資料安全。

MongoDB 安全 Checklist,使用者可以做的安全措施包括

  • 開啟鑑權 Enable Auth,並給所有需要訪問MongoDB資料庫的使用者配置合適的許可權(許可權最小化原則)
  • 限制網路訪問,只允許從安全的網路環境訪問MongoDB,可以使用系統防火牆,或 MongoDB 自身的配置項bindIp來限制訪問來源
  • 開啟訪問審計,記錄所有的使用者訪問行為,萬一出問題時有據可查
  • 限制MongoDB程式的許可權,儘量建立單獨的使用者來管理MongoDB程式,不要用root帳號啟動
  • 訪問鏈路加密儲存的資料加密,不過絕大部分場景還不需要這麼高的安全級別,實在需要也可以配置上,會對效能有一定影響

為了方便使用者快速進行合理的配置,給大家分享一個阿里雲資料庫MongoDB版的配置模板(為了簡化,稍有改動)。

資料組織,一個mongod程式對應一個工作目錄,包含data、etc、logs 3個目錄,分別儲存資料、配置、以及執行日誌

|-- $mymongo
   |-- data
      -- ***
   |-- etc 
         -- keyfile
         -- mongod.conf
   |-- logs
         -- mongod.pid
         -- mongod.log

mongod.conf內容 (將$mymongo替換成你的工作目錄)

systemLog:
  destination: file
  logAppend: true
  logRotate: rename
  path: $mymongo/logs/mongod.log
  timeStampFormat: iso8601-local
  traceAllExceptions: false
  verbosity: 0
  
processManagement:
  fork: true
  pidFilePath: $mymongo/logs/mongod.pid
  
net:    
  #bindIp: 127.0.0.1
  port: 3001
  http:
    enabled: false
  maxIncomingConnections: 1000
  unixDomainSocket:
    enabled: false

operationProfiling:
  mode: slowOp
  slowOpThresholdMs: 100    
  
security:
  authorization: enabled
  keyFile: $mymongo/etc/keyfile
  javascriptEnabled: false

replication:
  oplogSizeMB: 5120
  replSetName: myreplset
    
storage:
  dbPath: $mymongo/data
  directoryPerDB: true
  syncPeriodSecs: 60
  engine: wiredTiger
  journal:
    enabled: true
    commitIntervalMs: 100
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4

基於上述模板,使用者可以根據自己的實際情況稍加修改,主要關注如下引數

引數 含義 說明
systemLog.verbosity 日誌級別 建議設定為0,如想記錄更多debug資訊,可修改該值為1-5,越大日誌越詳細
net.bindIp 監聽的ip地址列表 預設監聽所有的ip,如果有多塊網路卡,可以選擇性的繫結,以限制不可信的網路訪問
net.port 監聽斷開 預設27017,根據需要定製
net.maxIncomingConnections 最大連線數 根據需要配置,保證系統最大檔案控制程式碼數大於該值(ulimit -n)
operationProfiling.slowOpThresholdMs 慢請求閾值 如無特殊需求,建議使用預設的100ms,超過該值的請求會記錄到對應db的system.profile集合裡
replication.replSetName 複製集名字 強烈建議部署複製集提供服務,名字隨便定製
replication.oplogSizeMB oplog大小 預設為磁碟空間5%,無特殊需求建議保持預設值
security.authorization 是否開啟鑑權 強烈建議開啟
security.keyFile 複製集內部鑑權的keyfile路徑 複製集要開啟鑑權,必須配置keyfile,用於複製整合員間的鑑權
security.javascriptEnabled 是否支援server端js,比如$where、mapreduce需要server端js的支援 如無必要,建議關閉
storage.directoryPerDB 每個db一個單獨的目錄儲存 強烈建議,以充分發揮檔案系統優勢
storage.engine 儲存引擎 強烈建議使用wiredtiger,低成本 + 高效能
storage.wiredTiger.engineConfig.engineConfig wireditger cache大小 預設 max(1, 0.6 * RAM)
storage.journal.enabled 是否開啟journal 強烈建議開啟
storage.journal.commitIntervalMs journal 刷盤間隔 預設100ms,建議保持預設值

上述引數,對於不確定含義或拿不準的引數可以直接使用預設值 (配置項行首加 # 即可註釋掉配置)。

使用上述模板啟動 MongoDB 服務後,使用者可以先通過localhost/127.0.0.1來連線 MongoDB,建立第一個管理使用者,接下來就可以用管理使用者登入做進一步的操作。

要想讓MongoDB發揮最佳的效果,瞭解其各項配置含義來優化配置是非常有必要的,如果想完全免去資料庫運維的煩惱,專注於業務開發,則可直接使用阿里雲資料庫MongoDB版,主要特性包括:

  • 完全相容MongoDB 3.2版本,開啟鑑權、保證資料庫安全
  • 3節點複製集,保證資料高可靠、服務高可用,即將推出分片叢集(MongoDB Sharded Cluster)
  • 提供全量、增量備份功能,即使資料被誤刪,也能恢復到任意時間點
  • 提供資料庫操作審計功能,使用者的所有操作都記錄審計日誌,有據可查
  • 支援VPC環境,支援使用者白名單功能
基於飛天分散式系統和高效能儲存,提供三節點副本集的高可用架構,容災切換,故障遷移完全透明化。並提供專業的資料庫線上擴容、備份回滾、效能優化等解決方案。


相關文章