# Jenkins & neuvector scan ## 事前準備 - [x] 已安裝好 jenkins ## neuvector scan pipeline * 先在 node 上建立目錄 ``` $ sudo mkdir /var/neuvector ``` ## 撰寫 pipeline script * 此方法只能在 rke 上執行 * 在 jenkins 上透過 pipeline script 執行 ```! pipeline { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod spec: containers: - name: p1 securityContext: privileged: true image: docker:latest command: - sleep args: - infinity volumeMounts: - mountPath: /var/run/docker.sock name: docker-sock - mountPath: /var/neuvector name: neuvector-volume volumes: - name: docker-sock hostPath: path: /var/run/docker.sock - name: neuvector-volume hostPath: path: /var/neuvector ''' defaultContainer 'p1' } } stages { stage('Version') { steps { sh 'docker version' } } stage ('Dockerfile') { steps { sh '''echo 'FROM quay.io/cooloo9871/alpine RUN apk update && apk upgrade && apk add --no-cache nano sudo wget curl \ tree elinks bash shadow procps util-linux coreutils binutils findutils grep && \ mkdir -p /opt/www && echo "let me go" > /opt/www/index.html CMD ["/bin/bash"] ' > Dockerfile ''' } } stage ('Build image') { steps { sh 'docker build -t andy .' } } stage ('Show image') { steps { sh 'docker images' } } stage('Scan image') { steps { sh 'docker run --name neuvector.scanner --rm -e SCANNER_REPOSITORY=andy -e SCANNER_TAG=latest -e SCANNER_LICENSE=license -v /var/run/docker.sock:/var/run/docker.sock -v /var/neuvector:/var/neuvector neuvector/scanner' } } } } ``` ``` $ docker run --name pod -d --privileged=true -v /run/podman/podman.sock:/run/podman/podman.sock quay.io/podman/stable:v4.1.0 sleep infinity ``` * 已可在 rke2 上執行 * 透過指定 nodeName 在指定節點上運行 ``` pipeline { agent { kubernetes { yaml ''' apiVersion: v1 kind: Pod spec: containers: - name: p1 securityContext: privileged: true image: docker.io/library/docker:dind volumeMounts: - mountPath: /var/neuvector name: neuvector-volume nodeName: cilium-m1 volumes: - name: neuvector-volume hostPath: path: /var/neuvector ''' defaultContainer 'p1' } } stages { stage ('Dockerfile') { steps { sh '''echo 'FROM quay.io/cooloo9871/alpine RUN apk update && apk upgrade && apk add --no-cache nano sudo wget curl CMD ["/bin/bash"] ' > /opt/Dockerfile ''' } } stage ('Build image') { steps { sh 'docker build -t andy /opt' } } stage ('Show image') { steps { sh 'docker images' } } stage('Scan image') { steps { sh 'docker run --rm -e SCANNER_REPOSITORY=andy -e SCANNER_TAG=latest -e SCANNER_LICENSE=license -v /var/neuvector:/var/neuvector -v /var/run/docker.sock:/var/run/docker.sock docker.io/neuvector/scanner' } } } } ``` ## 查看 repoert * 在 host 上查看 `scan_result.json` ``` $ cat /var/neuvector/scan_result.json ``` ## Jenkins 安裝 `NeuVector Vulnerability Scanner` plugin ### 事前準備 在同一個叢集上 - [x] 已安裝好 jenkins - [x] 已安裝好 neuvector ### Jenkins 安裝 plugin * 登入 jenkins -> 管理 Jenkins -> Plugins -> Availabe Plugins * 搜尋 `NeuVector Vulnerability Scanner` * 點選安裝  ### Jenkins 設定 * 管理 Jenkins -> System -> NeuVector Vulnerability Scanner > NeuVector Controller REST API URL :`https://neuvector-svc-controller.cattle-neuvector-system.svc.cluster.local:10443` > NeuVector Username: admin > NeuVector Password: admin - [x] Skip TLS certificate check * 設定完後點選 test  * 設定 scanner image 存放位置,如果是使用 docker hub 的 image,帳號密碼可以不用輸入  * 設定要 scan 的 registry 位置 > docker hub 位置: `https://registry.hub.docker.com`  ### 創建流程 * 新增作業 -> 建置 Free-Style 軟體專案 -> Build Steps -> NeuVector Vulnerability Scanner   * save 後點選 `馬上建置` 執行流程 * 如果使用 NeuVector Vulnerability Scanner plugin 的方式產生 report,report 會按照這個格式呈現 `NeuVectorReport_<pipeline-name>_<job-number>-1.json`  * Standalone Scanner - 以獨立模式執行 Jenkins 掃描是掃描管道中影像漏洞的一種輕量級方法。掃描程式是動態呼叫的,無需安裝控制器設定。在將映像推送到註冊表之前對其進行掃描時,這一點尤其有用。它也不限制同時執行多少個掃描任務。 - 為了在獨立模式下執行漏洞掃描,Jenkins 外掛程式需要將掃描鏡像拉到運行代理程式的主機上,因此需要在 NeuVector 外掛程式設定頁面輸入 NeuVector Scanner 註冊表 URL、鏡像儲存庫以及必要的憑證。 掃描結果也可以提交給控製程序,並用於存取控制功能。在這種情況下,您需要設定一個控制器,並在 NeuVector 外掛程式設定頁面中指定如何連接到控制器。 ## 使用 pipeline 掃描 * 也需要安裝 NeuVector Vulnerability Scanner plugin * 創建 pipeline script 並貼上以下內容  * controllerEndpoin 以及 registrySelection 就是在 管理 Jenkins 設定的全域名稱 * 使用 controller & scanner 模式要將 `standaloneScanner` 設為 false ``` pipeline { agent { // kubernetes represent the machine name. kubernetes { yaml ''' apiVersion: v1 kind: Pod spec: containers: - name: docker image: docker:dind command: ["/bin/sh", "-c"] args: ["dockerd & sleep infinity"] securityContext: privileged: true runAsUser: 0 #imagePullSecrets: # - name: my-dockerhub-secret ''' } } stages { stage('docker pull') { steps { // run the docker we declare above container('docker') { script { neuvector controllerEndpointUrlSelection: 'demo', registrySelection: 'harbor', repository: 'library/nginx', scanTimeout: 10, standaloneScanner: true, tag: 'latest' } } } } } } ``` * 掃描成功後也是可以查看報告  ## 檢視 report * 根據 report 可以看到這個 image 有哪些 cve  * 而在下面可以根據這個 cve 名稱找到是哪個套件影響的 * source 欄位所表示的涵義是指軟體組件的來源是誰,以下為例 `glibc/libc6` 這個套件就是由 ubuntu:24.04 來的  ## 參考連結 https://open-docs.neuvector.com/5.2/scanning/build/jenkins#detailed-configuration-for-the-jenkins-plugin https://blog.neuvector.com/article/image-scanning-jenkins ###### tags: `工具`
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up