最近serverless和faas的文章不少,各大雲廠商都在推廣,看着人手癢癢,無奈業務開發沒有使用雲服務,而是使用了內部k8s集羣。因此決定本身搭建faas。說來容易,說幹就幹!javascript
其實內部早就開始了,一直想寫篇文章,無奈業務太忙,總算抽了點時間分享下。java
怎樣實現將任意一個函數成爲一個接口node
不管是函數仍是接口本質上是想通的,都有輸入
和輸出
。 接口的請求做爲函數的輸入,函數的輸出做爲接口的返回值,完美!chrome
函數怎麼運行呢?瀏覽器
還好nodejs自己實現了本身的VM,很開心的把代碼丟給vm來運行,great!安全
打住!你覺得這就解決問題了嗎?bash
node官方明確指出,請不要使用VM
運行不信任的代碼,你的同事的代碼可信嗎?來自大佬的發問。less
網上找了一圈發現這行代碼,你的服務就掛掉了,這怎麼能夠?函數
new vm.Script('this.constructor.constructor("return process")().exit()')
複製代碼
相信社區的力量是偉大的,又發現了VM2
,如獲至寶,正如他的官方slogan那樣ui
vm2 is a sandbox that can run untrusted code with whitelisted Node's built-in modules. Securely!
大佬跑過來問,你相信他是安全就必定安全嗎?跑到issue裏面一看,而後一試,此次還好服務沒掛,可是彷佛無響應
了
const {VM} = require('vm2');
new VM({timeout:1}).run(`
function main(){
while(1){}
}
複製代碼
畢竟已經立了flag了,難道要食鹽
了嗎?忍痛也要把它解掉。
歸根結底,沙盒不安全,即便是VM2,也不能確信他必定安全,怎麼破?
ie瀏覽器常常崩潰,到了chrome就好不少了,爲何呢?對,沒錯,就是多進程模型。
舉個例子: 進程就像一套房子,線程是房間,房間着火房子沒了, 多進程是多套房子,毀了一套還有地方住。
咱們最終的方案就是將用戶不安全的代碼
隔離在子進程中。
VMBox
是獨立實現的管理函數運行的進程池,支持函數互相調用,而且完美的解決了死循環的問題。
若是對VMBox
關心的同窗能夠持續關注進展哦,後面會考慮將核心開源!
目前內部實現的功能