1. 程式人生 > >MongoDB限制內網訪問的方法

MongoDB限制內網訪問的方法

自己的部落格中用到了MongoDB作為資料儲存,伺服器用的是阿里雲的,今天阿里雲突然給我發信息說我的MongoDB資料庫沒有設定使用者名稱密碼。。我在自己的電腦上試著登陸了一下mongo client,直接連上了。。。。好吧,趕緊設定一下去。。

首先查看了一下MongoDB的文件,發現mongodb在啟動服務後,在預設情況下,是允許所有IP訪問的,而且沒有密碼。也就是說在任何電腦上,通過以下命令都是可以直接連線我的MongoDB的:

mongo 115.28.143.213

好吧,這個真的好危險,幸虧DB中沒有什麼隱私的資料。。於是我趕緊在網上搜索了一下MongoDB限制訪問的方法,總結來說大概有以下三種方法:

一、限制訪問IP和埠

MongoDB可以限制只允許某一特定IP來訪問,只要在啟動時加一個引數bind_ip即可,或者在/etc/mongodb.conf中新增bind_ip配置,如下:

# 方法一
mongod --bind_ip 127.0.0.1,10.0.133.14

# 方法二
在/etc/mongodb.conf檔案中新增以下內容:
bind_ip = 127.0.0.1,10.0.133.14

這樣之後,MongoDB服務端只有127.0.0.1和10.0.133.14這兩個 IP 可以訪問了。

MongoDB預設的監聽埠是27017,為了安全起見,你可以修改這個監聽埠,避免惡意的連線嘗試。修改方法同樣有兩種,如下:

# 方法一
mongod --bind_ip 127.0.0.1,10.0.133.14 --port 28018

# 方法二
在/etc/mongodb.conf檔案中新增以下內容:
port = 28018

客戶端訪問時不指定埠會連線到預設埠27017。當你修改了MongoDB服務端的埠後,客戶端連線MongoDB時需要指定埠號,如:mongo 10.0.133.14:28018

二、設定使用者名稱和密碼

MongoDB在預設的情況下啟動時是沒有使用者名稱和密碼的驗證的,如果你需要使用密碼驗證功能,可以通過下面兩種方式開啟:

# 啟動mongodb時加上--auth
sudo mongod --auth

# 修改/etc/mongodb.conf配置檔案
# 將auth = True
這一行的註釋去掉,儲存檔案,重啟mongodb即可

,而admin.system.users中儲存了admin使用者的資訊。

MongoDB中的使用者分為 超級使用者(super user) 和普通的 資料庫使用者(database user) :超級使用者存放在admin資料庫中(在MongoDB的初始情況下,admin資料庫預設是空的),這種使用者擁有最大許可權,可以對所有資料庫進行任意操作;資料庫使用者則是存放在另外的資料庫中,這種使用者只能訪問自己的資料庫。所有的使用者資訊都存放在自己資料庫的 system.users 表中。在MongoDB中建立使用者非常簡單,如下:

# 建立Admin使用者
mongo
use admin
db.addUser('super', '123456')

# 建立普通使用者
mongo
use test
db.addUser('test_user', '123456')

以上的建立方式是 基於MongoDB 2.4.x版本 ,最新版的2.6.x中建立使用者的方法會有所不同,具體的方法見MongoDB官方文件: add mongodb user

在MongoDB中,使用者和許可權有以下特性:

1. 資料庫是由超級使用者來建立的,一個數據庫可以包含多個使用者,一個使用者只能在一個數據庫下,不同資料庫中的使用者可以同名;

2. 如果在 admin 資料庫中不存在使用者,即使 mongod 啟動時添加了 --auth引數,此時不進行任何認證還是可以做任何操作;

3. 在 admin 資料庫建立的使用者具有超級許可權,可以對 MongoDB 系統內的任何資料庫的資料物件進行操作;

4. 特定資料庫比如 test1 下的使用者 test_user1,不能夠訪問其他資料庫 test2,但是可以訪問本資料庫下其他使用者建立的資料;

5. 不同資料庫中同名的使用者不能夠登入其他資料庫。比如資料庫 test1 和 test2 都有使用者 test_user,以 test_user 登入 test1 後,不能夠登入到 test2 進行資料庫操作

三、使用Linux IPtables限制IP範圍

這種方法和MongoDB本身沒有關係,而是借用Linux的iptables功能,限制允許訪問MongoDB埠的IP地址,具體的做法如下:

# 拒絕所有訪問27017埠的請求
sudo iptables -I INPUT -p tcp --dport 27017 -j DROP
 
# 允許本地訪問mongo埠
sudo iptables -I INPUT -s 127.0.0.1 -p tcp --dport 27017 -j ACCEPT

sudo iptables-save

OK,這樣就只允許通過本地訪問MongoDB服務了。