3. Mongodb 設定授權訪問
基於Docker部署一個數據庫例項通常比直接在伺服器上安裝資料庫還要簡單,Gevin在開發環境中經常使用基於docker的資料庫服務,docker也漸漸成為Gevin在Linux上安裝MongoDB的首選方式,由於MongoDB預設是不用通過認證就能直接連線的,出於安全考慮,在公網上部署MongoDB時,務必設定authentication機制,以避免類似 “黑客贖金” 問題的發生。
那麼,基於Docker拉起的MongoDB,如何實現通過使用者名稱密碼訪問指定資料庫呢?方法很簡單,但前提是要了解MongoDB授權訪問的機制,參考資料如下:
只要瞭解MongoDB授權訪問機制,直接按下面步驟一步步執行就可以了。
1、建立MongoDB例項
為了少寫幾個命令,Gevin使用Docker Compose來建立MongoDB例項:
version: '2' services: mongo: # restart: always image: mongo:3.2 command: [--auth] ports: - "37017:27017" volumes: - /data/db
執行如下命令:
docker-compose up -d #---------- # Result: #---------- # Creating mongodb_mongo_1 docker-compose ps #---------- # Result: #---------- # Name Command State Ports # -------------------------------------------------------------------------- # mongodb_mongo_1 /entrypoint.sh --auth Up 0.0.0.0:37017->27017/tcp
2、建立使用者管理員
首先要進入MongoDB容器內部,連上MongoDB,並切換到 admin 資料庫,這步可以通過下面命令完成:
docker exec -it mongodb_mongo_1 mongo admin
#----------
# Result:
#----------
# MongoDB shell version: 3.2.12
# connecting to: admin
# 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
然後建立一個user administrator:
db.createUser({
user: 'mongo-admin',
pwd: 'admin-initial-password',
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });
#----------
# Result:
#----------
Successfully added user: {
"user" : "mongo-admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
3、建立訪問指定資料庫的使用者
建立了user administrator後,需要退出mongodb,並重新連線,然後用user administrator 訪問admin資料庫,併為目標資料庫建立目標使用者,其具體步驟如下:
(1)重新連線MongoDB資料庫
退出容器,重新用下面命令進入容器即可:
docker exec -it mongodb_mongo_1 mongo admin
#----------
# Result:
#----------
MongoDB shell version: 3.2.12
connecting to: admin
(2)授權登入admin
db.auth("mongo-admin","admin-initial-password")
(3)建立訪問指定資料庫的使用者
# Step1: switch to the specified database:
use octblog
# Step2: create a user
db.createUser(
{
user: "gevin",
pwd: "gevin",
roles: [ { role: "readWrite", db: "octblog" },
{ role: "readWrite", db: "octblog-log" } ]
}
)
#----------
# Result:
#----------
#Successfully added user: {
# "user" : "gevin",
# "roles" : [
# {
# "role" : "readWrite",
# "db" : "octblog"
# },
# {
# "role" : "readWrite",
# "db" : "octblog-log"
# }
# ]
#}
這一步的目標是為 octblog 這個資料庫建立一個授權訪問使用者,首先要從 admin 資料庫切換到 octblog 資料庫,然後才能為 octblog 新增授權訪問使用者
注:
- 上面所以操作均為user administrator執行的,即第二步建立的 mongo-admin
- user administrator的作用是管理使用者,MongoDB下的每個資料庫,使用者都被它管理,除此外,它基本沒什麼更多許可權做其他事情
- MongoDB沒有通常意義的超級使用者的概念,octblog的授權使用者只能被user administrator建立,而user administrator只能登陸admin資料庫,所以才會有上面(2)、(3)兩步的麻煩。
驗證授權登入
Command:mongo ip:port/db_name -u {user} -p {password}
Example:docker exec -it {containerId} mongo localhost:27017/db_name -u user -p password