Snyk integrates with Kubernetes

身為DevOps工程師
7 min readFeb 10, 2023

--

Snyk能夠支援與Kubernetes進行整合,針對Kubernetes內部運行的Container images做掃描。

附上一張原廠的架構圖

https://docs.snyk.io/scan-containers/kubernetes-workload-and-image-scanning/kubernetes-integration-overview/kubernetes-integration-architecture-diagram

安裝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的權限

主要負責三件事情

  1. 從container registries 去Pull Image並將Image拆解讀取其中的資訊 e.g. image tag, image name。
  2. 拆解Image的各層layers,解析其中的Dependencies。並回傳workload metadata(Kubernetes configuration)。
  3. 傳送解析的結果到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相關的資訊

測試

  1. 把原本的nginx pod刪掉,不會自動從Snyk Project上刪除。
  2. 新建立一個deployment: nginx:1.14.2,也不會自動新增進來,要重新去Kubernetes Integrations import。
  3. 測試修改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的功能還不太完整。

References:

https://docs.snyk.io/scan-containers/kubernetes-workload-and-image-scanning/kubernetes-integration-features/automatic-import-deletion-of-kubernetes-workloads-projects

--

--

身為DevOps工程師

目前在蓋亞資訊擔任DevOps Consultant。最近才從後端的世界轉成投向DevOps的懷抱,目前專注在Kubernetes, GitLab, DevSecOps的學習中。