Dify Sandbox實現文件路徑獲取與Excel數據處理 原創
我集中精力,花2個多小時把Dify Sandbox官方源碼研究了一下,終于理清了Sandbox 執行代碼的邏輯,順便實現了在不修改官方dify-sandbox docker鏡像,用戶上傳文件后路徑的獲取和對Excel文件的數據處理。
話不多說,先看效果。一個有9406條數據的Excel文件瞬間完成了數據處理工作。
下面我來說一下,這個如何實現。
Dify 安裝成功后,會有10個Docker容器,其中docker-sandbox 的作用是用來執行工作流中”代碼“這個節點運行的代碼。這樣就保證了用戶的代碼不會獲取到服務器的文件資源或者執行敏感的系統調用操作,保證了Dify系統和數據安全。
Dify后端工程師Yeuoly,是Dify sandbox的作者,她寫了一篇博客詳細講解了Dify Sandbox通過沙盒運行代碼原理的英文博客,我借助大模型認真研讀了一下。
總結起來,主要使用了兩種技術。
1.系統級隔離: 利用 Docker 的底層技術:Seccomp(安全計算模式)。
在 Linux 上,Docker 是一種常見的系統沙箱解決方案。??Seccomp?
?充當所有訪問系統的嘗試的過濾器。它攔截和控制各種作,包括但不限于文件讀/寫作、系統配置修改、網絡訪問,甚至標準輸入/輸出。這之所以有效,是因為這些作本質上是 (),并且每個作都表示訪問系統的嘗試。
在dify的源碼 docker/volumes/sanbox文件夾下,有個文件config.yaml,可以通過allowed_syscalls參數來控制允許開放哪些系統調用命令,這些命令大約有400個,比如常見的文件的讀寫、文件的執行操作等等。
allowed_syscalls: # please leave it empty if you have no idea how seccomp works
# 基礎文件操作
- 0 # read - 從文件描述符讀取數據
- 1 # write - 向文件描述符寫入數據
- 2 # open - 打開文件
- 3 # close - 關閉文件描述符
- 4 # stat - 獲取文件狀態
- 5 # fstat - 獲取文件描述符狀態
- 6 # lstat - 獲取符號鏈接狀態
- 7 # poll - 等待文件描述符上的事件
- 8 # lseek - 重新定位讀/寫文件偏移量
- 9 # mmap - 將文件或設備映射到內存
- 10 # mprotect - 設置內存區域的保護
- 11 # munmap - 取消內存映射
- 12 # brk - 改變數據段大小
###其它參數請網上自己搜索
2.chroot(更改根目錄)虛擬文件系統
但是上面的Docker Seccomp方案只能允許或者拒絕所有文件的訪問,要么全部允許,要么全部拒絕。這樣就沒法是某些用到的文件單獨訪問了,比如Python庫文件。
所有dify-sandbox又使用了第二個解決方案,在執行代碼進程的時候,使用Linux chroot('/tmp')命令,將代碼所在的/tmp文件夾作為根目錄。也就是代碼只知道它位于/tmp文件夾下面,無法讀取到系統其它文件夾路徑。
在dify-sandbox的源碼中,是這樣實現的,使用的是Go 語言。
Sandbox的沙盒安全原理大致就是這樣,如果我想用代碼獲取到dify用戶剛剛上傳的文件路徑,就必須將用戶上傳文件夾的實際文件夾掛載到sandbox Docker容器中。
這里要非常感謝Awesome-Dify-Workflow這個Github開源項目,讓我找到了File_read.yml 這個Dify工作流。它的實現前提將用戶上傳文件保存路徑app/storage/upload_files文件夾的路徑掛載到sandbox Docker容器的/upload_files文件夾下面,并且要使用作者制作的Docker鏡像替換官方鏡像。
這個作者制作的鏡像權限開的太多,我反而有了安全顧慮,所有想繼續使用官方鏡像完成用戶上傳文件路徑的獲取。這時候對上面chroot命令的理解就派上用場了。
既然執行代碼都只認/tmp文件夾,那直接將app/storage/upload_files文件夾的路徑掛載到/tmp下面就可以了(以python代碼執行為例)。
同時修改sandbox的python庫依賴,添加pandas等Python數據處理庫,來編寫代碼完成Excel文件的處理。
執行 docker compose down 和 docker compose up -d 命令重建Dify Docker容器后,我們將打開Dify,將File_read.yml導入。
修改獲取文件路徑處的代碼,將"/upload_files"改為"/tmp/upload_files",再運行這個工作流便大功告成。也就是文章一開始大家看到的效果。
本文轉載自公眾號九歌AI大模型 作者:九歌AI
原文鏈接:??https://mp.weixin.qq.com/s/8jKGn-k-v3_9kPdbWgQEvQ??
