上文已經基本完成了環境的搭建,prometheus可以以https的方式從node_exporter和cAdvisor上pull到數據,訪問grafana時也可以以https的方式訪問,安全性得到了一定的保障,但還存在一些問題,本節將繼續完善
一、分析與改進
目前架構為
VM1和VM2分別開啟兩端口向外暴露,在LB上開四個端口分別去對應VM1/VM2上的端口,
由prometheus去連接LB上的四個端口,從而獲取監控數據。
但是,LB上做的是NAT端口轉發,任何IP都可以去連接這個四個端口,並且無身份驗證,因此增加了安全風險
所以需要在LB上設定,僅可以運行prometheus的IP訪問這四個端口
可以訪問 https://LBIP:18008 https://LBIP:19101檢查是否可以訪問
【問題】在LB上無法限定某個特定IP訪問,因此需要借助NSG來實現
新方案
先介紹一下AZURE上的NSG:
NSG是網絡安全組,VM和網絡的連接、不同子網間的通信均可以通過NSG進行限制,介於VM 和 LB/NAT之間
我們可以利用NSG來對從LB來的流量做限定
應用到本方案中:為VM1/VM2添加NSG,NSG會對LB上任何端口轉發來的流量做限定
在NSG上開啟只允許某個特定IP訪問VM1/VM2上的指定端口即可實現。
二、實現步驟
1、在VM1/VM2所在的資源組中創建一個NSG
2、在NSG中添加 允許80和443端口的入站規則,保證原來的網站可以正常訪問
3、將VM1/VM2的網卡關聯到新創建的NSG中
4、檢查LB上的NAT入站規則的端口,18008/19101/28008/29101
5、在新創建的NSG上創建入站規則,只允許特定IP訪問VM1/VM2的特定端口
6、檢查prometheus是否可以連接node_exporter和cAdvisor
登陸grafana查詢各個節點狀態
顯示1證明連接正常
再去用其他任何IP訪問:
https://LBIP:19101
https://LBIP:18008
https://LBIP:29101
https://LBIP:28008
訪問失敗表示成功!
7、收尾
檢查prometheus server的NSG對外開放了哪些端口,最終只允許開放443端口,其余端口一律禁止!
【總結】
以上與prometheus相關的所有組件均是以http協議傳輸的,大大降低了它的安全性,為解決這個問題使用了如下方法:
1、prometheus與node_exporter和cAdvisor之間的數據傳輸使用了stunnel,先將收集到的數據轉成https,然后再傳輸。
2、grafana默認是http,使用nginx生成https的站點,當用戶訪問443端口時自動跳轉到grafana上
由於LB不支持對特定IP的限定,因此增加了NSG對特定IP做限定,這樣一來,有且僅有prometheus server 可以訪問使得安全性有進一步增強
最后,我理解的正確的部署場景應當是:
業務機VM1/VM2和prometheus server三台虛機在一個NSG中,這三個虛機組成了一個局域網,外界是無法直接訪問其中任何一台的,只能通過Load Balance跳轉,然后在Load Balance上開一個端口用於以https的方式訪問grafana,由於prometheus node_exporter cAdvisor在局域網中,因此數據傳輸不存在安全性問題,這樣就可以不對http做轉換了。