目錄
引言
上一篇Mongo安全 之 鑒權(quán)的文章中 我們討論Mongo的鑒權(quán)和權(quán)限控制
這一篇我們將詳細(xì)討論如何打開(kāi)和配置Mongo SSL 即Mongo安全 之 SSL
下一篇Mongo安全 之 拾遺我們還會(huì)討論Mongo安全的其他方面
安裝
在正式開(kāi)始討論SSL之前 我們先搭建Mongo服務(wù) 以驗(yàn)證SSL問(wèn)題
安裝Mongo
上一篇Mongo安全 之 鑒權(quán)中我們介紹了使用Docker安裝Mongo的方法 這里將介紹基于Ubuntu 1604 LTS使用apt包管理器安裝最新Mongo的方法
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
其他系統(tǒng)的安裝方法可以參考Install MongoDB Community Edition
運(yùn)行Mongo
sudo service mongod start
如果想要重啟Mongo服務(wù) 可以使用restart參數(shù)
普通連接
通過(guò)上述安裝和運(yùn)行命令之后 我們就可以訪問(wèn)Mongo了
mongo --host 192.168.56.101
默認(rèn)配置下 除主機(jī)外是無(wú)法訪問(wèn)Mongo服務(wù)的 需要?jiǎng)h除或注釋掉/etc/mongodb.conf中的"bindIp: 127.0.0.1"后重啟Mongo服務(wù) 關(guān)于bindIp的更多介紹 可以參考Mongo安全 之 拾遺
# 切換至auth數(shù)據(jù)庫(kù) 如果沒(méi)有該數(shù)據(jù)庫(kù)則新建
use auth
# 創(chuàng)建collection "users"
db.createCollection("users")
上述連接的Mongo地址192.168.56.101為本文測(cè)試地址 請(qǐng)根據(jù)實(shí)際情況替換成相應(yīng)的Mongo地址
然后 我們打開(kāi)WireShark工具抓取指定網(wǎng)卡的網(wǎng)絡(luò)包
關(guān)于Wireshark的使用教程 請(qǐng)讀者自行搜索參考
接著 我們進(jìn)行插入數(shù)據(jù)庫(kù)的操作
# 向collection "users"插入數(shù)據(jù)
db.users.insert({"email": "test@test.com", "password": "password"})
此時(shí) WireShark抓取的數(shù)據(jù)包 如下圖所示
從圖中我們可以看到 此時(shí)發(fā)送的數(shù)據(jù)都是明文的 這點(diǎn)和HTTP類(lèi)似 因此 才有了下面要討論的SSL
SSL連接
制作證書(shū)
在使用SSL連接之前 我們首先需要制作相關(guān)的證書(shū)
這里 我們使用openssl來(lái)制作和管理自己的證書(shū) 命令如下
sudo openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out mongodb-cert.crt -keyout mongodb-cert.key
sudo cat mongodb-cert.key mongodb-cert.crt > mongodb.pem
sudo openssl req -newkey rsa:2048 -new -x509 -days 365 -nodes -out client-cert.crt -keyout client-cert.key
sudo cat client-cert.key client-cert.crt > client.pem
更新配置
制作完證書(shū)之后 我們需要更新Mongo配置以使用這些證書(shū) 修改/etc/mongod.conf文件中的net內(nèi)容如下
# network interfaces
net:
port: 27017
#bindIp: 127.0.0.1
ssl:
mode: requireSSL
PEMKeyFile: /etc/ssl/mongodb.pem
CAFile: /etc/ssl/client.pem
接著 不要忘記重啟Mongo服務(wù)
sudo service mongod restart
下載證書(shū)
成功配置Mongo服務(wù)之后 我們還需要下載證書(shū)以在客戶(hù)端使用
scp username@192.168.56.101:/etc/ssl/*.pem ~/Downloads
連接數(shù)據(jù)庫(kù)
準(zhǔn)備好Mongo服務(wù)和證書(shū)之后 客戶(hù)端就可以和Mongo服務(wù)建立SSL連接了
mongo --host 192.168.56.101:27017 --ssl --sslPEMKeyFile ~/Downloads/client.pem --sslCAFile ~/Downloads/mongodb.pem
然后 對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作
use auth
db.createCollection("users")
接著 向數(shù)據(jù)庫(kù)插入一條數(shù)據(jù) 同時(shí) 打開(kāi)WireShark進(jìn)行抓包
db.users.insert({"email": "test@test.com", "password": "password"})
此時(shí) 在插入數(shù)據(jù)的時(shí)候 WireShark抓包的網(wǎng)絡(luò)包 如下圖所示
從圖中我們可以看到 此時(shí)發(fā)送的數(shù)據(jù)都是加密后的數(shù)據(jù) 由此SSL配置成功
小結(jié)
SSL作為網(wǎng)絡(luò)開(kāi)發(fā)的標(biāo)準(zhǔn)配置 在開(kāi)發(fā)任何網(wǎng)絡(luò)系統(tǒng)時(shí)都是有必要考慮和添加的
本文配合Nginx配置實(shí)戰(zhàn)中的HTTPS 可以使用最小的代價(jià)(只需要申請(qǐng)相應(yīng)證書(shū)) 實(shí)現(xiàn)最高的安全性
這么劃算的買(mǎi)賣(mài) 還在猶豫什么呢?
參考
更多文章, 請(qǐng)支持我的個(gè)人博客