1. 程式人生 > >開發基於Django和Websocket的堡壘機

開發基於Django和Websocket的堡壘機

WebSSH有很多,基於Django的Web服務也有很多,使用Paramiko在Python中進行SSH訪問的就更多了。但是通過gevent將三者結合起來,實現通過瀏覽器訪問的堡壘機就很少見了。本文將簡要介紹下我開發的IronFort堡壘機,其詳細內容在我的官方網站liujiangblog.com的視訊教程中。 ## 一、堡壘機概述 百度百科:堡壘機,在一個特定的網路環境下,為了保障網路和資料不受來自外部和內部使用者的入侵和破壞,而運用各種技術手段實時收集和監控網路環境中每一個組成部分的系統狀態、安全事件、網路活動,以便集中報警、及時處理及審計定責。 對於一箇中型以上的公司,當用戶和職員人數較多,公司所屬伺服器也數量較大的情況下,其伺服器上的帳號管理難度將急劇增加,參考下面的圖片: ![](https://img2020.cnblogs.com/blog/1762677/202010/1762677-20201007102132185-570893879.png) 這其中必然存在很多問題,例如: * 使用者、主機、賬號數量太多,工作量大,管理混亂; * 每個人員的許可權和可使用賬號沒有系統管理,等級區分不明; * 使用者直接掌握主機的帳號密碼; * 密碼可能交叉使用; * 離職人員可能還可以使用公司的帳號; * 內部人員可以跳過防火牆,直接使用帳號在機房內訪問; * 內部人員離職前設下木馬或暗門,一段時間後再爆發; * 對人員的訪問記錄、過往操作沒有日誌和審計,缺乏事後追蹤手段; * 其它風險 在執行初期,公司可能採取Excel表格等工具,使用人工管理的方式,靠‘人治’和道德水平約束,但當公司體量逐漸變大的時候,這種方式必然遭到淘汰,於是就出現了堡壘機的概念,如下圖所示: ![](https://img2020.cnblogs.com/blog/1762677/202010/1762677-20201007102138922-1481901131.png) 這種架構帶來如下的好處: * 使用者不能直接訪問遠端主機,而是需要通過堡壘機跳轉; * 使用者不再掌握遠端主機的帳號密碼,只有訪問堡壘機的帳號; * 限制使用者登入遠端主機後的修改密碼能力,不允許修改; * 堡壘機的使用者、遠端主機的使用者、使用者密碼、使用者許可權等等都被統一集中管理,大量節省人工成本; * 使用者在登入堡壘機後所進行的一切操作將被記錄下來,用於後期的行為審計; * 由於沒有遠端主機帳號密碼,即使進入機房也無法直連主機; * 還可以實現批量命令執行、檔案分發等附帶功能; * 其它收益。 堡壘機的核心概念是使用者不再掌握帳號密碼,使用者的行為被記錄用於審計。堡壘機主要針對的是內部網路和內部人員,對於人員流動性較強、體量大、行業風險高的企業需求特別強烈,比如金融行業。 堡壘機已經擁有商業產品,多數以硬體伺服器為載體進行銷售,價格幾十萬不等。也有開源的解決方案,但這些方案有的不是基於瀏覽器,介面不夠友好,日誌記錄困難;有的基於Tornado,並且只能進行簡單的命令執行功能,而公司使用的是Django;更多的情況是與公司需求不一致,需要二次開發,維護和升級困難,等等不一而足。 ‘授人以魚不如授人以漁’,自己掌握了開發堡壘機的核心技能,就可以快速、方便、靈活的針對公司具體需求進行定製開發,既為公司節省了購置硬體經費,又利於維護升級。 ## 二、 IronFort堡壘機體系架構 IronFort堡壘機的體系架構如下圖所示: ![](https://img2020.cnblogs.com/blog/1762677/202010/1762677-20201007102144025-2132067434.png) 一個完整的通訊過程如下: 1. 使用者通過使用支援HTML5的瀏覽器,在HTTP的基礎上,向堡壘機發送websocket請求; 1. 堡壘機上使用gevent接收websocket請求並轉發給Django; 1. Django接收請求後,呼叫paramiko建立與遠端主機的ssh通道; 1. 遠端主機執行使用者的命令後,通過ssh返回資料給Django; 1. Django通過gevent以websocket的形式返回給使用者瀏覽器; 1. 使用者瀏覽器使用term.js外掛模擬Linux終端,顯示遠端主機返回的結果。 核心機制就是這樣,下面我們來看下開發過程。 ## 三、開發簡介 ### 1. 專案建立 堡壘機本身通常是佈置在Linux主機上的,比ubuntu16.04,對外以HTTP的形式提供服務。 首先需要建立虛擬環境,並安裝Python3.6以及Django2.0,不再贅述。 使用`django-admin startproject`和`python manage.py startapp app_name`分別建立專案和app。 此時,可以嘗試執行Django服務,可以看到歡迎介面。 ### 2. ORM模型 任何一個Web專案都必須在深入分析專案需求的情況下,首先設計好ORM模型,也就是資料庫的表結構。 IronFort中設計了六個模型,分別是: * 遠端主機 * 遠端主機使用者 * 遠端主機繫結的使用者 * 堡壘機使用者 * 堡壘機使用者組 * 日誌 這裡需要提醒的是: * 每個遠端主機賬戶可以繫結多個遠端主機,兩者實際是多對多的關係; * 堡壘機使用者不能直接繫結遠端主機; * 堡壘機使用者繫結的實際是一個主機+主機賬戶的物件; * 考慮賬戶是否啟用或者被經用的enabled屬性; * 考慮某些欄位的unique_together屬性; 關於模型設計,每個人有每個人的需求和想法,這其中有很多坑和需要注意的地方,限於篇幅,無法展開論述。在我的個人網站liujiangblog.com的視訊教程中有詳細的講解。 模型設計好了,可以同時註冊Django的admin後臺。然後makemigrations、migrate和createsuperuser,重啟伺服器後就可以在admin中建立測試用例了,如下圖所示: ![](https://img2020.cnblogs.com/blog/1762677/202010/1762677-20201007102220027-591607157.jpg) ### 3. url和路由 url的設計並不複雜,沒有太多的複雜頁面,下面是專案中使用的一些url: ```python from django.contrib import admin from django.urls import path, re_path from fort import views urlpatterns = [ path('admin/', admin.site.urls), path('', views.login), path('login/', views.login), path('logout/', views.logout), path('index/', views.index), path('log/', views.get_log), pat