Engineering · 2 min read
NetworkPolicy:鎖住沒密碼的前門
CDP 沒有密碼,socat 又對整個 cluster 敞開。一條 NetworkPolicy 限制 ingress 只放行 API Pod,再加上兩個要小心的坑。
風險
socat 聽 0.0.0.0:9222,接受 cluster 裡任何 Pod 的連線。CDP 沒有密碼。任何 Pod 連上來就能控制 Chrome:導航網址、讀取頁面內容、執行 JavaScript、使用付費 proxy 的憑證。
修復
一條 NetworkPolicy 限制 ingress,只放行 render-api:
spec:
podSelector:
matchLabels:
app: render-chrome
ingress:
- from:
- podSelector:
matchLabels:
app: render-api
ports:
- port: 9222
這條規則告訴 Kubernetes:只有標籤 render-api 的 Pod 能連到 Chrome 的 9222 port。其他全擋。
兩個坑:
- 共用 cluster 的名稱衝突。 dev 和 staging 在同一個 cluster 時,兩邊的部署都建立同名的 NetworkPolicy。第二個覆蓋第一個。用環境前綴命名:
dev-chrome-devtools-ingress。 - CNI 必須支援。 Calico、Cilium、GKE 預設都可以。Flannel 不行。Policy 會套用,但 traffic 照樣通過。
CDP 沒有密碼。socat 對所有人敞開。NetworkPolicy 是唯一的門鎖。
參考來源:
Related: 看打開這扇門的 socat 接線員、路由到 Chrome 的 Headless Service,或回到系列總覽。