文件 v0.1.7

存取控制

本頁說明 go-pve-qemu 的三層防護:CORS 來源限制、ALLOW_IPS 白名單,以及每台 VM 的狀態與鎖定檢查。

第一層:CORS

所有請求經過 CORS 中介層:

Origin 回應
私有 IP(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16),且與伺服器所在 /24 子網相同 Access-Control-Allow-Origin 回傳該 Origin
其他來源 不設定 Access-Control-Allow-Origin
無 Origin(curl、伺服器端呼叫) 不受影響

伺服器子網取自第一個非 loopback、私有網段的 IPv4 介面;找不到時以 192.168.0.* 計。允許的方法為 GET、POST、OPTIONS,OPTIONS 預檢直接回 204。

CORS 只約束瀏覽器,不是身分驗證。

第二層:ALLOW_IPS

所有寫入端點(install、start、stop、shutdown、reboot、destroy、set/*)先比對來源 IP:

ALLOW_IPS 行為
0.0.0.0 全部放行
192.168.0.10,192.168.0.20 只放行列出的 IP
未設定或空字串 全部拒絕

來源 IP 取自 Gin 的 c.ClientIP()。服務未設定受信任代理,Gin 預設會採用 X-Forwarded-For/X-Real-IP 標頭,因此 API 直接對外時,用戶端可偽造來源 IP;請只在受控網段內開放此服務。

被拒絕時的回應:

端點類型 回應
同步端點 403 this IP is not allowed to perform this action
SSE 端點 200,內容為一行 data: {"message": "...this IP is not allowed to perform this action"}

查詢端點(health、list、status)不檢查 ALLOW_IPS。

第三層:VM 狀態與停用清單

需要指定 VM 的寫入端點會以 pvesh get /cluster/resources 與 .go_qemu_disabled 檢查目標 VM:

檢查 失敗回應
VM 在停用清單中 400 this IP is not allowed to be controlled
要求執行中但 VM 已停止 400 VM is not running
要求停止但 VM 執行中 400 VM is running
叢集資料或停用清單讀取失敗 500 failed to get VM list: ...
要求 VM 執行中 要求 VM 停止
stop、shutdown、reboot start、destroy、set/cpu、set/memory、set/disk、set/node

SSE 端點的檢查失敗同樣以一行 data: 回傳錯誤訊息。

EN