如何在 Ubuntu 16.04 上保護 MongoDB
在本文中,我們將學習如何在 Ubuntu 16.04 上保護 Mongo DB。在以前的版本中,Mongo DB 容易受到自動化漏洞利用的攻擊,因為預設情況下沒有啟用身份驗證,任何使用者都可以與資料庫互動,建立、讀取、修改和銷燬資料庫及其內容,這是因為 Mongo DB 守護程序預設情況下可以監聽所有介面。
啟用身份驗證並新增管理員使用者
這個問題在 Mongo DB 3.x 版本之後的最新版本中得到了緩解,但是,身份驗證預設情況下仍然是停用的,因此任何使用者都可以完全訪問資料庫。為了保護它,我們將建立一個管理員使用者並啟用身份驗證,並使用管理員使用者測試身份驗證。
新增管理員使用者
要新增管理員使用者,我們首先需要連線到 Mongo shell。
$ mongo
當我們開啟 Mongo DB shell 時,它會顯示許多警告,表明資料庫未啟用訪問控制,並且對資料庫和配置的讀寫訪問不受限制。
Output: MongoDB shell version v3.4.4 connecting to: MongoDB://127.0.0.1:27017 MongoDB server version: 3.4.4 Welcome to the MongoDB shell. For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] 2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] ** WARNING: Using the XF S filesystem is strongly recommended with the WiredTiger storage engine2017-05-16T12:33:46.819+0530 I STORAGE [initandlisten] ** See http://d ochub.mongodb.org/core/prodnotes-filesystem 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: Access contr ol is not enabled for the database. 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** Read and wri te access to data and configuration is unrestricted. 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/ mm/transparent_hugepage/enabled is 'always'. 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** We suggest set ting it to 'never' 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** WARNING: /sys/kernel/ mm/transparent_hugepage/defrag is 'always'. 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] ** We suggest set ting it to 'never' 2017-05-16T12:33:46.850+0530 I CONTROL [initandlisten] >
由於沒有限制管理員帳戶使用者名稱,因為許可權級別來自變數 userAdminAnyDatabase。資料庫管理員儲存憑據。
我們將選擇我們選擇的使用者名稱,並確保使用以下命令選擇安全密碼。
> use admin. switched to db admin
切換資料庫後,我們將建立一個管理員使用者。
> db.createUser( ... { ... user: "DBAdmin", ... pwd: "DBAdmin'sSecurePassword", ... roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] ... } ... ) Output: Successfully added user: { "user" : "DBAdmin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } >
由於我們建立了一個名為 DBAdmin 的管理員使用者,並設定了安全密碼。
我們剛剛建立了一個管理員使用者,但在我們啟用 Mongo DB 配置中的身份驗證之前,它不會被要求。
為 MongoDB 啟用身份驗證
我們需要在位於 /etc 的配置檔案 mongod.conf 中啟用身份驗證,並重新啟動 Mongo DB 守護程序。
現在,我們將編輯 mongod.conf 檔案,並在 $security 部分進行修改。
$ sudo vi /etc/mongod.conf
配置檔案如下所示
# mongod.conf # for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/ # Where and how to store data. storage: dbPath: /var/lib/mongodb journal: enabled: true # engine: # mmapv1: # wiredTiger: # where to write logging data. systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log # network interfaces net: port: 27017 bindIp: 127.0.0.1 #processManagement: #security: #operationProfiling: #replication: #sharding: ## Enterprise-Only Options:
我們需要刪除 security 前面的註釋 (#) 以啟用該部分,並且我們需要新增授權設定,如下所示。
#processManagement − security − authorization − “enabled” #operationProfiling − #replication − #sharding −
請注意,security 行沒有空格,authorization 行必須以兩個空格開頭。將這些行新增到配置檔案後,我們需要重新啟動 mongod 守護程序。
以下是重新啟動 MongoDB 服務的命令:
$ sudo systemctl restart mongod
重新啟動服務後,我們可以使用以下命令檢查 MongoDB 服務的狀態:
$ sudo systemctl status mongod Output: mongod.service - High-performance, schema-free document-oriented database Loaded: loaded (/lib/systemd/system/mongod.service; disabled; vendor preset: enabled) Active: active (running) since Tue 2017-05-16 12:52:09 IST; 48s ago Docs: https://docs.mongodb.org/manual Main PID: 3281 (mongod) Tasks: 20 Memory: 33.3MCPU: 734ms CGroup: /system.slice/mongod.service └─3281 /usr/bin/mongod --quiet --config /etc/mongod.conf May 16 12:52:09 ubuntu-16 systemd[1]: Started High-performance, schema-free document-oriented database.
驗證 MongoDB 上的身份驗證
首先,讓我們在沒有任何憑據的情況下連線到 MongoDB。
$ mongo Output: MongoDB shell version v3.4.4 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.4 >
現在,我們可以看到過去顯示的所有警告訊息都已解決,現在我們將透過嘗試連線到測試資料庫來測試身份驗證。
> show dbs 2017-05-16T12:56:17.306+0530 E QUERY [thread1] Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }", "code" : 13, "codeName" : "Unauthorized" } : _getErrorWithCode@src/mongo/shell/utils.js:25:13 Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1 shellHelper.show@src/mongo/shell/utils.js:769:19 shellHelper@src/mongo/shell/utils.js:659:15 @(shellhelp2):1:1
我們可以看到,在沒有身份驗證的情況下,我們無法建立或使用資料庫,現在退出 shell 並嘗試使用身份驗證。
驗證管理員使用者訪問許可權
現在,嘗試使用管理員使用者身份驗證連線到管理員資料庫。以下是使用使用者身份驗證連線到資料庫的命令:
$ mongo -u DBAdmin -p --authenticationDatabase admin MongoDB shell version v3.4.4 Enter password: connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.4 >show dbs admin 0.000GB local 0.000GB >
在本文中,我們學習瞭如何透過新增管理員使用者並啟用身份驗證來保護 Mongo DB,因為預設設定下 Mongo DB 未啟用使用者身份驗證,任何使用者都可以建立、刪除和修改資料庫。