2016-04-30 56 views
2

我正在開發一個平臺,用戶可以在其中創建自己的「小部件」,小部件基本上是js片段(將來也會有html和css) 。沙盒由在服務器上運行的用戶編寫的node.js腳本

問題是,即使用戶不在網站上,他們也必須運行,所以基本上我的服務將不得不安排那些用戶腳本隨時運行。

我想弄清楚哪個是「沙箱」腳本的最佳方式,我首先想到的是在Docker內部自己的進程上運行的想法之一,所以讓我們說用戶管理以某種方式進入外殼它將是一個虛擬機,並希望他會被鎖定在裏面。

我不是一個Docker專家,所以我甚至不確定這是否合理,反正會產生另一個問題,即紡織數百個碼頭運行一個簡單的JavaScript代碼段。

是否有任何「安全」的方式來做到這一點?也許在空範圍上運行腳本,並以某種方式刪除對「require」方法的訪問?

另一個要求是在腳本超時後終止它。

編輯: - 發現他們在其中的腳本,並運行它創建的腳本在運行容器的圖像此相關stackexchange link

回答

1

這可以通過碼頭工人來完成,您將創建一個碼頭工人的形象。

你甚至可以很容易地創建一個基於官方node.js docker鏡像的通用鏡像,並在運行時傳遞用戶自定義文件,運行它們,保存輸出,然後完成。這種方法很好,因爲只有一個圖像需要維護,而且它使設置變得簡單。

傳入數據的最佳方式是在容器上創建卷裝入,並且每次將用戶目錄裝入容器中的相同位置。

例如,假設您的主機具有這樣的目錄結構。

/users/ 
    aaron/ 
    bob/ 
    chris/ 

然後,當您運行容器時,您只需更改卷裝入。

docker run -v /users/aaron:/user/ myimagename/myimage 
docker run -v /users/bob:/user/ myimagename/myimage 

我不知道輸出會是什麼,但你可以把它寫在容器內/用戶/輸出和輸出將被存儲在用戶的輸出目錄。

就超時而言,您可以編寫一個簡單的腳本來查看docker ps,如果它運行的時間超過極限,docker會停止容器。

因爲一切都在一個容器中運行,所以可以一次運行多個並且它們彼此隔離並與主機隔離。

+0

你會提出任何我應該真正關注的設置嗎? 例如,假設用戶從node.js獲取shell,我怎麼能確定他不會「擺脫docker」和「擁有」我的主機? – kroe

+0

沒有已知的安全漏洞,用戶可以用最新的內核和最新的docker版本打破容器。只要你保持碼頭和你的內核更新,任何已知的漏洞都可以迅速修復,因爲這對很多人來說都是一個大問題。 –

+0

用戶只需上傳一個javascript並運行在一個節點進程上。 所以我想我可以以某種方式刪除對「系統方法」的訪問權限,所以他希望不會碰到文件系統或緩衝區溢出的東西? – kroe

相關問題