安全性
概述
Neotask 採用以安全性為優先的架構設計。Gateway 預設綁定至 localhost,所有敏感資料在靜態時加密,代理程式執行可以在隔離容器中沙盒化。
網路安全
預設回送
Gateway 只監聽 127.0.0.1(localhost),除非您明確更改綁定模式。預設情況下無外部網路暴露。
驗證
所有 WebSocket 連接都需要驗證:
- 令牌驗證, 不記名令牌(UUID 或自訂字串)
- 密碼驗證, Bcrypt 雜湊密碼
- 受信任代理, 來自反向代理的預驗證標頭
- 本機信任, 回送連接隱式受信任
遠端存取安全
對於遠端存取,推薦的方法是 Tailscale VPN 或 SSH 隧道, , 永遠不要將 Gateway 直接暴露於網際網路。
裝置配對
配對如何運作
每個連接至 Gateway 的用戶端都必須配對:
- 裝置呈現其身份(指紋 + 公鑰)
- Gateway 發出配對挑戰(nonce)
- 裝置用其私鑰簽署 nonce
- 您透過 UI 核准裝置
- Gateway 為未來的連接發出裝置令牌
信任模型
- 本機裝置(回送)為了方便起見自動核准
- 非本機裝置需要明確核准
- 裝置令牌儲存在本機,在重新連接時重複使用
- 裝置可以隨時撤銷
加密
靜態資料
- AES-256-GCM, 所有令牌、密鑰和 API 金鑰在靜態時加密
- 機器衍生金鑰, 加密金鑰透過 scrypt 從裝置身份衍生
- 無明文儲存, 令牌永遠不以明文儲存
傳輸中的資料
- TLS, 用於 API 通訊的 HTTPS
- WSS, 用於 Gateway 連接的 WebSocket Secure(使用 Tailscale Serve 或反向代理時)
- HMAC 簽名, 帶有 nonce 和時間戳記的請求完整性
沙盒
基於 Docker 的隔離
代理程式命令執行可以在 Docker 容器中沙盒化:
- 每代理程式設定檔, 每個代理程式可以有自己的沙盒設定
- 資源限制, 可設定的 CPU、記憶體和超時限制
- 網路隔離, 容器可以與網路隔離
- 檔案系統限制, 代理程式只能存取其工作空間
- 自訂映像, 使用安裝了特定工具的預建映像
沙盒範圍
| 範圍 | 說明 |
|---|---|
| 每工作階段 | 每個工作階段使用全新容器 |
| 每代理程式 | 每個代理程式的持久容器 |
| 共享 | 跨代理程式的共享容器 |
工作空間存取
沙盒化代理程式可以存取其工作空間目錄(掛載至容器中),但無法存取工作空間外的主機檔案系統。
執行核准
控制代理程式可以在節點和 Gateway 主機上執行哪些命令:
模式
| 模式 | 說明 |
|---|---|
| Allowlist | 只有預先核准的命令才能執行 |
| Ask | 未知命令提示使用者核准 |
| Full | 無限制(謹慎使用) |
每節點設定
每個節點(macOS、無頭主機)都有自己的執行核准設定,儲存在本機。您可以允許特定二進位檔(例如 /usr/bin/docker、/usr/local/bin/terraform),同時封鎖其他所有內容。
提升模式
某些操作需要直接在 Gateway 主機上執行(而非在沙盒中)。提升模式:
- 受代理程式設定中明確權限的管控
- 只在 Gateway 主機上可用
- 預設停用
- 透過日誌記錄可審計
安全審計
內建安全審計檢查:
- 設定檔案權限(應為 600)
- 工作階段檔案權限
- Node.js 版本(安全修補)
- 明文密鑰偵測
- 外掛允許清單驗證
- 開放網路介面審計
- 驗證設定完整性
獲得許可後,審計可以自動修復許多問題。
最佳做法
- 將 Gateway 保持在回送上, 使用 Tailscale 或 SSH 進行遠端存取
- 啟用沙盒, 在 Docker 容器中執行代理程式命令
- 使用執行允許清單, 限制代理程式可以在節點上執行哪些命令
- 設定驗證令牌, 即使對於回送,也始終設定令牌驗證
- 審查代理程式權限, 盡可能使用最小工具設定檔
- 保持 Neotask 更新, 更新包含安全修補
- 定期審計, 執行安全審計以發現設定錯誤
- 限制外掛載入, 只安裝受信任的外掛