近期負(fù)責(zé)運(yùn)維研發(fā)的工作衅檀,前段時(shí)間研究了一下WebSocket和Linux下偽終端的功能谎倔,主要目的是一直在思考,如何實(shí)現(xiàn)WebConsole功能起宽,讓公司的同事能夠基于瀏覽器能夠安全的登錄到公司的服務(wù)器洲胖,并與公司的安全體系一起,實(shí)現(xiàn)權(quán)限可管理的坯沪、安全性有保證的Web端的shell的功能绿映。
WebConsole簡介
理論上來說應(yīng)該叫做WebShell,它是一種以網(wǎng)頁形勢存在的一種命令執(zhí)行環(huán)境腐晾,也可以成為一種網(wǎng)頁后門叉弦。
WebShell因?yàn)楹唵我子茫砸环矫娉3S糜诜?wù)器管理藻糖,可以方便管理員淹冰、站長甚至于程序員方便的登錄到服務(wù)器,進(jìn)行必要的操作和維護(hù)巨柒,但是另外一方面它常常容易被入侵者利用樱拴,從而達(dá)到控制服務(wù)器的目的柠衍。
目前常用的WebShell有Gateone、WebSSH2晶乔、shellinabox等等珍坊,產(chǎn)品很多。
如何實(shí)現(xiàn)偽終端
偽終端的實(shí)現(xiàn)原理正罢,可以參考 Linux偽終端一文阵漏,在該文中進(jìn)行了詳細(xì)的原理和代碼講解。這里我們也簡要描述一下:
實(shí)現(xiàn)步驟:
- open /dev/ptmx
- 生成ptsname:調(diào)用ioctl(fd, syscall.TIOCGPTN, &n)翻具,這里會(huì)得到當(dāng)前終端編號履怯,終端名格式為:/dev/pts/?
- 清除slave PTY lock:調(diào)用ioctl(f.Fd(), syscall.TIOCSPTLCK, &u)
- 啟動(dòng)/bin/bash進(jìn)程,并把進(jìn)程的輸入輸出綁定到偽終端中
這樣/bin/bash進(jìn)程的輸入和輸出裆泳,都在PTS上進(jìn)行叹洲, 而前文我們分析過,PTS與PTM形成了一種雙向管道的模式工禾。
PTM輸出 ---> PTS輸入
PTS輸出 ---> PTM輸入
WebSocket實(shí)現(xiàn)WebConsole
WebSocket是很通用的技術(shù)疹味,這里就不做過多的描述,可以參考一下WebSocket Helloworld!這篇文章帜篇。
有了前面的鋪墊,我們很容易基于WebSocket來實(shí)現(xiàn)WebConsole了诫咱,具體的架構(gòu)圖如下所示:
在瀏覽器端笙隙,需要嵌入xterm.js插件,實(shí)現(xiàn)對終端的輸入輸出支持能力坎缭,通過Websocket連接到后端服務(wù)后竟痰,在服務(wù)端把連接升級為WebSocket連接,并創(chuàng)建一個(gè)終端管理模型與一個(gè)/bin/bash進(jìn)程
- 把終端管理模型的PTY Slave端的輸入輸出綁定到/bin/bash的輸入輸出中
- 把WebSocket連接的輸入輸出與PTY Master的輸出輸入綁定
這樣一個(gè)WebConsole的雛形就完成了掏呼。
實(shí)現(xiàn)安全可靠的WebConsole
從web上訪問shell功能坏快,如何授權(quán),并且保證系統(tǒng)安全性是一個(gè)需要深入考慮的問題憎夷。像上面那樣莽鸿,僅僅通過http提供服務(wù)支持,系統(tǒng)無法保證安全性拾给。所以要做以下幾個(gè)方面的考慮:
- 認(rèn)證 : 基于公司的登錄體系
- 授權(quán) : 基于授權(quán)開通用戶的服務(wù)器
- 網(wǎng)絡(luò)安全: 基于公司內(nèi)網(wǎng)體系/內(nèi)部防火墻
- 審計(jì):通過日志記錄登錄用戶執(zhí)行的所有命令
具體細(xì)節(jié)設(shè)計(jì)到一些公司安全方面的事宜祥得,這里不便深入分析,有興趣的朋友可以按照以上思路自己去實(shí)現(xiàn)蒋得。