當前位置:
首頁 > 最新 > 網易樂得RDS系列:網頁終端大揭秘!

網易樂得RDS系列:網頁終端大揭秘!

為了便於管理資料庫,樂得RDS為高許可權用戶提供了基於網頁的終端(web terminal),可以直接登錄資料庫所在的伺服器來執行操作系統命令。本篇文章就來給列位看官說道一下我們是怎麼實現這個功能的。

在最初開發階段,我們曾使用wetty來實現web terminal功能。wetty是使用Node.js和websockets開發的一個開源網頁終端,調用了純JavaScript寫的chromeOS的終端模擬器(hterm),在性能上比較有保證。但是在使用過程中,我們發現wetty存在以下幾個問題:

1

不支持同時SSH到多台伺服器。從安全形度考慮,我們只允許在一台中心伺服器A上對外提供wetty的服務(A上運行的wetty本身可以通過SSH連接到其他的資料庫伺服器)。此時如果有用戶想要登錄資料庫伺服器B和資料庫伺服器C,就需要在A的不同埠上啟動兩個wetty服務端,分別連接到B和C;並且此時需要以A上的兩個wetty服務埠來區分B、C的連接,依靠前置的nginx根據url參數來做動態轉發,實現起來比較複雜。

2

不自帶安全認證。假設在中心伺服器A上開啟服務埠1234之後,在任何擁有A:1234訪問許可權的機器上使用瀏覽器就能進入wetty提供的終端,因為wetty本身不提供任何訪問控制。並且由於上一條所說,A可能會同時開放多個服務埠,更是增加了風險。

3

沒有連接檢測機制。一旦啟動wetty服務端,無論有沒有用戶訪問,都會一直保持到目標機器的SSH連接,這對資源也是一種浪費。雖然可以在應用層實現用戶連接檢測的機制,但是感覺還是不靠譜。

由於以上幾點原因,尤其是對安全問題的擔憂,推動我們繼續去尋找可以替代的產品。在搜集了更多的資料後,我們發現了一個比較理想的解決方案——Gate One。

Gate One是一個開源的、基於web的終端模擬器,擁有強大的插件系統,功能上比較全面。除了解決了上述的三個問題之外,它還額外提供了一些比較實用的功能,例如顯示圖片和pdf、圖形化的提示信息、記錄和回放用戶操作、ssh key管理等。官方文檔的支持也比較好。

廢話不多說,擼起袖子干。

安裝

1

依賴:python 2.7+ or 3.2+,tornado 2.2+

源碼:git clone https://github.com/liftoff/GateOne.git

安裝:cd GateOne; python setup.py install

驗證:whereis gateone

配置

2

默認的配置文件放在/etc/gateone/conf.d下,涉及修改的有以下幾個文件:

10server.conf

Gate One的主設置文件,在官方文檔http://liftoff.github.io/GateOne/About/configuration.html列出了具體的參數的用途。RDS由於前端有用nginx做https服務,這裡把」disable_ssl」改為ture,在「origins」里添加RDS應用伺服器的ip以允許來自應用的連接,設置「port」為」8001」。

20authentication.conf

Gate One支持包括的認證方式包括api, cas, google, ssl, pam等,把GateOne嵌入到別的應用中時需要使用api的方式。在RDS中就使用了這種方式在視圖層做認證,實現方式會在後面講到。此處把「auth」改為」api」,即只有經過api認證後才可以進入Gate One的界面。

30api_keys.conf

使用api認證需要配置key:secret密鑰對,如果還沒有這個文件,可以使用gateone --new_api_key命令來自動生成,裡面會包含隨機密鑰對。

至此Gate One的配置就差不多改完,可以使用service gateone start或者gateone命令啟動gateone伺服器了。

嵌入RDS

3

首先需要在view里生成api的token:

這裡注意upn是RDS根據想要連接的伺服器按照規則生成的用戶名,當一個新的upn連接到Gate One之後會在/var/lib/gateone/users下建立以upn命名的目錄,裡面保存了此用戶的session、日誌文件以及最重要的.ssh目錄;如果已經存在這個upn目錄,就會使用已有的這些信息。為了方便標識,RDS中upn的命名方式是user@ip,這樣在.ssh目錄下先成ssh秘鑰對並把公鑰加入到想要連接的資料庫伺服器的賬號的authorizied_keys之後,一旦RDS用戶在網頁進入Gate One執行SSH,就會使用此upn下的密鑰進行連接。

前台載入Gate One的js代碼:

前台從view接收到的變數除了valid_json_auth_object這個令牌之外,還有ssh_url和location。ssh_url是用來設置進入Gate One之後自動連接的ssh連接串,例如「ssh://mysql@10.11.12.13:22」,這樣就可以避免用戶手動輸入;location這個參數就比較關鍵,它用來保證不同的RDS用戶即使同時登錄同一台目標伺服器也不至於出現「串台」的異常:因為這些RDS用戶的令牌里會有相同的upn,不設置location就會使得多個用戶都訪問此upn用戶的location=「default」終端,出現看到一樣的終端的情況。另外可以看到此處並沒有出現Gate One伺服器的ip和8001服務埠,這是因為已經在RDS的前置Nginx里配置了把/gateone的訪問請求路由到真正的地址的相關參數,此處不再贅述。最後,有一部分代碼是放在GateOne.Base.superSandbox中執行的,大家查看官方文檔就可以找到這麼做的原因。

* 成功訪問後執行top命令 *

可能遇到的情況

4

api token驗證失敗

說明到Gate One服務的網路是通的,需要去檢查下後台返回的令牌是否有錯誤。

ssh登錄失敗

出現ssh配置不當導致的無法連接,一般是許可權問題。

參考資料:

官方文檔:http://liftoff.github.io/GateOne/

應用嵌入Gate One:https://www.jianshu.com/p/b8123a8178de

Ngixn配置:https://laucyun.com/135bc31db22920069ec1ac3e2fbe038a.html


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 樂得DBA 的精彩文章:

TAG:樂得DBA |