Snyk integrates with Kubernetes
Snyk能夠支援與Kubernetes進行整合,針對Kubernetes內部運行的Container images做掃描。
附上一張原廠的架構圖
安裝Snyk Controller with Helm資源要求
- 最少有50GB emptyDir
requests
- CPU: 250m
- Memory: 400Mi
limits
- CPU: 1
- Memory: 2Gi
新增helm repo
helm repo add snyk-charts <https://snyk.github.io/kubernetes-monitor> --force-update
建立snyk monitor namespace
kubectl create namespace snyk-monitor
開啟Integrations — Kubernetes
切換到Web的Snyk Platform(https://snyk.io/)頁面,登入後點擊左邊列表的Integrations,會看到Container orchestrators底下有Kubernetes的標誌
點下去後會顯示目前還沒enable kubernetes
點擊Connect後,可以從UI上看到Integration ID。
請記下這段Integration ID等下會需要用到。
新增Secret — snyk-monitor
kubectl create secret generic snyk-monitor -n snyk-monitor \\
--from-literal=dockercfg.json={} \\
--from-literal=integrationId=<Integration ID>
💡 Integration ID可以從Snyk→Integrations→Kubernetes上的齒輪看到
</aside>
安裝Snyk controller
💡 安裝於K8s中,對K8s workloads與container registries 有read-only的權限
主要負責三件事情
- 從container registries 去Pull Image並將Image拆解讀取其中的資訊 e.g. image tag, image name。
- 拆解Image的各層layers,解析其中的Dependencies。並回傳workload metadata(Kubernetes configuration)。
- 傳送解析的結果到Snyk Platform上做分析
helm upgrade --install snyk-monitor snyk-charts/snyk-monitor \\
--namespace snyk-monitor \\
--set clusterName="Cluster_Name"
新增Workloads
點擊Integrations→Kubernetes,就可以看到K8s中的Resource。
勾選想要掃描的資源後,點擊右上角的 Add selected workloads。就可以新增到Dashboard呈現。
新增完成後,就可以在Projects列表中看到
點擊進去後,可以看到Workload與Image相關的資訊
測試
- 把原本的nginx pod刪掉,不會自動從Snyk Project上刪除。
- 新建立一個deployment: nginx:1.14.2,也不會自動新增進來,要重新去Kubernetes Integrations import。
- 測試修改deployment→nginx的base image tag,會不會自動刷新
剛刪除完畢,並沒有自動刷新。
放置一個晚上試試看,早上來發現還是沒刷新。
直接手動刷新試試看,點選右邊的Retry last import
Image Tag修改成了latest
自動Import與Deletion
目前處於beta階段,不保證每一個Pod都會被自動新增與刪除。
要試用的話,需要更新helm chart的value。
我們直接把舊版的snyk-controller砍掉,重新裝一個新的試試。
在Snyk Platform上,被砍掉snyk-controller的K8s Project仍然會存在。
Uninstall
helm uninstall -n snyk-monitor snyk-monitor
Install
helm upgrade --install snyk-monitor snyk-charts/snyk-monitor \\
--namespace snyk-monitor \\
--set clusterName="Cluster_Name" \\
--set policyOrgs={Orgs_ID}
目前測試起來,我有一個沒有正常Running的Deployment,就沒辦法被自動import。
將Deployment的Image從
nginx:latest → busybox → Tomcat → nginx:stable
目前沒有 busybox, nginx:stable沒有被自動的import進去。busybox沒有穩定的Running,感覺在deployment的Pod沒有正常運行時會比較容易發生沒有自動import的情況。
測試刪除nginx-deployment
觀察了十分鐘,都沒有自動刪除掉。感覺Auto的功能還不太完整。