mongodb 權限操作

基本概念

先說一下關於用戶、驗證和角色的基本概念。

用戶

要在MongoDB中驗證客戶端,必須向MongoDB添加相應的用戶。

添加用戶

添加用戶使用MongoDB的用戶管理接口,此接口提供db.createUser()的方式添加用戶(這裏有坑,網絡上很多關於MongoDB添加用戶的內容還都在使用db.addUser(),這是2.6版本的添加用戶方式)。
假如我們有test數據庫,要爲此數據庫添加用戶,我們可以在mongo shell下使用以下語句:

> db.createUser({
    user: "user1",//用戶名
    pwd: "12345678",//密碼(實際操作中設置密碼要儘量複雜)
    roles: [//權限數組
        {
            role: "readWrite",
            db: "test"//test數據庫的讀寫權限
        }
    ]
})

執行後的返回結果:

這樣我們就爲test數據庫創建了一個擁有讀寫權限的用戶。

驗證

驗證是認證客戶端身份的過程。 當訪問控制(即授權)被啓用時,MongoDB要求所有客戶端對其自身進行認證,以確定其訪問。

開啓驗證

我們剛剛創建了一個用戶,但如果我們是以默認的方式啓動mongod,驗證並沒有生效,那麼我們來停掉mongod服務並在啓動時增加配置項使驗證生效。

通過增加mongod參數來開啓驗證

在啓動mongod的時候增加--auth參數就可以使驗證生效。

mongod --auth
通過修改配置文件來開啓驗證

我們也可以通過修改MongoDB的配置文件來啓用驗證。
在Linux服務器上配置文件一般存放在/etc文件夾中,如果沒有我們就創建一個。

vim /etc/mongodb.conf
# mongodb.conf
# Where to store the data.
dbpath=/var/lib/mongo
#where to log
logpath=/var/log/mongodb/mongod.log
logappend=true
bind_ip = 0.0.0.0
port = 27017
# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true
#fork
fork = true
# Enables periodic logging of CPU utilization and I/O wait
#cpu = true
# Turn on/off security.  Off is currently the default
#noauth = true
#我們把啓用驗證的設置加載這裏
auth = true
#。。。。。。

我只截取了配置文件的一部分,這個配置文件的其他內容我不再贅述了,我們只需要知道怎樣配置開啓驗證。
保存後執行下面的代碼來啓動mongod

mongod -f /etc/mongodb.conf

使用驗證

我們剛剛開啓了驗證,下面兩種方式可以使用剛纔創建的用戶來操作需要驗證訪問的數據庫。

在連接時驗證

使用-u ,-p 和--authenticationDatabase 命令行選項啓動mongo shell:

mongo -uuser1 -p12345678 --authenticationDatabase test

在連接後驗證

通過mongo shell連接MongoDB。

mongo

切換到對應的數據庫。

> use test

然後使用db.auth(<username>, <pwd>)的方式驗證用戶。

>  db.auth('user1', '12345678')

兩種驗證方式均可以使用該用戶操作對應的數據庫。

用戶角色

角色授予對資源執行指定操作的權限,我們在這裏只討論MongoDB的常用內置角色(對我已經足夠了)。

數據庫用戶角色

每個數據庫都包含以下權限:

角色描述
read 提供讀取所有非系統集合以及以下系統集合上的數據的能力:system.indexes,system.js和system.namespaces集合。
readWrite 提供讀取角色的所有權限,並能夠修改所有非系統集合和system.js集合上的數據。

數據庫管理員角色

每個數據庫都包含以下數據庫管理員權限:

角色描述
dbAdmin 提供執行管理任務的能力,例如與結構相關的任務,索引,收集統計信息,此角色不能直接管理用戶和管理用戶角色。
dbOwner 提供對數據庫執行任何管理操作的能力,此角色由readWritedbAdminuserAdmin組合而成。
userAdmin 提供在當前數據庫上創建和修改角色和用戶的功能。

備份和恢復角色

admin數據庫中包括以下用於備份和恢復數據的角色:

角色描述
backup 提供數據備份所需的權限,此用戶可以使用mongodump
restore 提供數據恢復所需的權限,此用戶可以使用mongorestore(只能還原不包含system.profile集合的數據)。

超級用戶角色

下面的角色爲所有資源提供所有權限:

角色描述
root 超級用戶權限,提供對數據庫的全部操作權限。

配置實踐

我對MongoDB的配置思路是建立一個對現有生產數據庫的可讀寫權限的用戶供程序使用,建立一個超級用戶和一個備份還原用戶,每小時對數據庫執行一次備份。這並不是一個推薦的配置方式,只是滿足我當前對數據庫安全的需求。

爲應用程序建立可讀寫用戶

在mongoshell下執行以下命令:

> use test   
> db.createUser({
    user: "user1",//用戶名
    pwd: "12345678",//密碼(實際操作中設置密碼要儘量複雜)
    roles: [//權限數組
        {
            role: "readWrite",
            db: "test"//test數據庫的讀寫權限
        }
    ]
})

建立後修改程序中對MongoDB的連接配置即可測試程序與數據庫的連接。

建立超級用戶

在mongoshell下執行以下命令:

> use admin
> db.createUser({
    user: "su",
    pwd: "12345678",
    roles: [
        {
            role: "root",
            db: "admin"
        }
    ]
})

建立備份還原用戶

在mongoshell下執行以下命令:

> use admin
> db.createUser({
    user: "dbbackup",
    pwd: "12345678",
    roles: [
        {
            role: "backup",
            db: "admin"
        }, {
            role: "restore",
            db: "admin"
        }
    ]
})

配置數據庫定時備份

數據庫備份

數據庫備份我直接從github上搜到了一個備份的腳本,修改腳本中的參數,並修改文件命名方式支持每小時備份。地址在這裏
這裏我們用到了剛剛創建的具有備份和恢復權限的用戶,將其寫入配置文件中:

### Set server settings
HOST="localhost"
PORT="27017" # default mongoDb port is 27017
USERNAME="dbbackup"
PASSWORD="12345678"

配置後執行腳本測試:


執行成功後會在配置好的目錄生成打包的備份文件。

加入定時任務

使用crontab將數據庫備份加入定時任務中,在bash中執行以下語句:

crontab -e

進入crontab的編輯模式,加上每小時執行一次備份的腳本:

0 * * * * /path/to/shell/directory/mongodb-backup.sh

保存後啓動crontab。

service crond start

將crontab加入開機啓動:

chkconfig crond on

過幾個小時再看備份目錄中已經有了打包好的備份文件了,搞定!

恢復數據庫

恢復數據庫這塊兒有一個坑,就是3.2版本的mongorestore參數和2.6版本的不一樣了。網上搜到的大部分恢復數據庫定位備份文件的參數都是--directoryperdb而實際使用時會報錯,後來查看mongorestore幫助文檔才發現變成了--dir。下面是恢復命令:

mongorestore --port 27017 -uuser1 -p12345678 --db test --dir=/path/to/backup/directory/test/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章