mongoDB 權限設定 & 使用 Python 連接

原本 mongoDB 就只有自己在用,也沒注意到什麼權限,但自從 Pan 要從我這拿資料後,覺得可怕,只好來研究一下如何設權限。這次的目標很簡單,就是讓 Pan 可以讀取我本地端 mongoDB 上的某一個資料庫(Readonly)。

Step1. 建立一個管理所有帳號的人

adeline@adeline:~$ mongo
MongoDB shell version: 3.0.12
connecting to: test
> use admin
> db.createUser( { user: "superuser", pwd: "yourpwd", roles: [ { role: "root", db: "admin" } ] } )

Roles 這邊可以指定 user 多重身份,但我懶,直接給 root。
完成之後,需要修改 mongod.conf,將登入設定成需要驗證,然後重啟 mongoDB。

adeline@adeline:~$ vim /etc/mongod.conf
----------------------------------------
auth = true

Step2. 建立新使用者(唯讀權限)

進入 mongoDB 之後,先驗證身份才能做事,驗證身份的方法有兩種。第一種是進入 mongoDB 的同時把帳密一起打上:

adeline@adeline:~$ mongo -u "superuser" -p "yourpwd" --authenticationDatabase "admin"

第二種則是先進入 mongoDB 的 admin 資料庫,再驗證身份:

adeline@adeline:~$ mongo
> use admin
> db.auth("superuser", "yourpwd")

完成身份驗證之後,就可以來加入新使用者,步驟跟剛剛建立 root 差不多。輸入使用者的名稱、密碼,以及角色。這邊給 Pan 的角色是對於資料庫 db1有讀取(read)的權限。完成後離開 mongoDB,重啟服務即可。

> db.createUser( { user: "pan", pwd: "panspwd", roles: [ { role: "read", db: "db1" } ] )

mongoDB 給予使用者許多內建權限選擇,如果有其他需求,也可以自訂角色(user-defined role),mongoDB 的官網有詳細的介紹,這邊稍微整理一下:
.Database User Roles(針對操作資料庫資料)
.Database Administration Roles(針對操作特定資料庫)
.Cluster Administration Roles(admin 資料庫中針對操作資料庫群聚)
.Backup and Restoration Roles(admin 資料庫中針對備份及復原)
.All-Database Roles(admin 資料庫中針對操作所有資料庫)
.Superuser Roles(相當於最高權限,可以操作任何資源)
.Internal Role(其實我不太懂這個角色的精髓)

如果要用 Python 連上 mongoDB,只要在連上 mongoDB 後加入帳號密碼資料即可,以下提供完整 code:

# 導入 Package
from pymongo import MongoClient
# 連接 mongoDB
client = MongoClient(<ip>, <port>)
# 驗證身份
client.admin.authenticate(<user_name>, <user_pwd>)
# 操作資料庫(database)、集合(collection)
db = client[<db_name>]
collection = db[<collection_name>]

以上,歡迎指教。