docker scan
Trivy(推薦使用)
clair
針對上述解決方案,我們調查了 Trivy
、Claire
、Anchore Engine
、Quay
、Docker hub
和 GCR
等幾種掃描工具,從不同維度進行對比。(來源於網路)
本文主要介紹下 docker scan
和 Trivy
構建映象的整個流水線
Jenkins 或者 gitlab Runner整合
docker scan
Trivy
映象倉庫定期掃描
執行時,在映象拉取到主機節點,啟動時掃描映象漏洞,禁止映象執行。
ImagePolicyWebhook
docker scan
是 docker
官方推出來的外掛。
使用之前需要安裝此外掛
yum install docker-scan-plugin
獲取當前安裝的版本
docker scan --accept-license --version
Version: v0.12.0
Git commit: 1074dd0
Provider: Snyk (1.790.0 (standalone))
在使用 docker scan
之前,我們需要登入我們的 dockerhub
使用者,否則掃描不了。
[root@ops-111-111 ~]# docker scan hello-world
Docker Scan relies upon access to Snyk, a third party provider, do you consent to proceed using Snyk? (y/N)
y
failed to get DockerScanID: You need to be logged in to Docker Hub to use the scan feature.
If you are not using Docker Desktop, either
- use the "docker login" CLI command with a username and password. Note this will not work if
2FA is required or if SSO enforcement is enabled on Docker Hub; or
- use the "docker login" CLI command with a username and Personal Access Token. This requires
a token to be generated in advance.
If you are using Docker Desktop: login via the UI or whale menu
登入
[root@ops-111-111 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: djxslp
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@ops-111-111 ~]# docker scan hello-world
Testing hello-world...
Package manager: linux
Project name: docker-image|hello-world
Docker image: hello-world
Platform: linux/amd64
✔ Tested hello-world for known vulnerabilities, no vulnerable paths found.
Note that we do not currently have vulnerability data for your image.
For more free scans that keep your images secure, sign up to Snyk at https://dockr.ly/3ePqVcp
免費掃描限制為10/月。
Trivy
是 漏洞、設定錯誤、Secret
等 全面且多功能的安全掃描器。
阿里雲映象倉庫,映象雲安全掃描引擎也預設提供
Trivy
掃描引擎
支援掃描
wget https://github.com/aquasecurity/trivy/releases/download/v0.38.1/trivy_0.38.1_Linux-64bit.deb
apt install trivy_0.38.1_Linux-64bit.deb
範例命令
trivy image python:3.4-alpine
trivy image -s HIGH python:3.4-alpine # 指定漏洞等級
trivy k8s --report summary cluster # 掃描叢集
注意下載 DB
是比較慢的,如果我們有對應的梯子,可以用的話最好使用梯子。 我這邊是通過我電腦的 Clash
監聽的埠,然後我伺服器設定 http 和 https 代理。
2023-03-29T10:10:09.318+0800 INFO Need to update DB
2023-03-29T10:10:09.318+0800 INFO DB Repository: ghcr.io/aquasecurity/trivy-db
2023-03-29T10:10:09.318+0800 INFO Downloading DB...
臨時使用代理
export http_proxy="http://http_proxy:7890"
export https_proxy="http://http_proxy:7890"
trivy image -s MEDIUM,HIGH,CRITICAL test-demo --timeout 30m
結果
Total: 752 (MEDIUM: 688, HIGH: 61, CRITICAL: 3)
┌──────────────────────────┬──────────────────┬──────────┬───────────────────────┬──────────────────────────┬──────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
├──────────────────────────┼──────────────────┼──────────┼───────────────────────┼──────────────────────────┼──────────────────────────────────────────────────────────────┤
│ audit-libs │ CVE-2015-5186 │ MEDIUM │ 2.8.1-3.el7 │ │ Audit: log terminal emulator escape sequences handling │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2015-5186 │
├──────────────────────────┼──────────────────┤ ├───────────────────────┼──────────────────────────┼──────────────────────────────────────────────────────────────┤
│ bash │ CVE-2012-6711 │ │ 4.2.46-30.el7 │ │ bash: heap-based buffer overflow during echo of unsupported │
│ │ │ │ │ │ characters │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2012-6711 │
│ ├──────────────────┤ │ ├──────────────────────────┼──────────────────────────────────────────────────────────────┤
│ │ CVE-2019-9924 │ │ │ 4.2.46-34.el7 │ bash: BASH_CMD is writable in restricted bash shells │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-9924 │
Java (jar)
==========
Total: 14 (MEDIUM: 2, HIGH: 10, CRITICAL: 2)
┌─────────────────────────────────────────────────┬────────────────┬──────────┬───────────────────┬──────────────────────────────────────────────────────┬─────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
├─────────────────────────────────────────────────┼────────────────┼──────────┼───────────────────┼──────────────────────────────────────────────────────┼─────────────────────────────────────────────────────────────┤
│ │ CVE-2019-10247 │ MEDIUM │ │ 9.2.28.v20190418, 9.3.27.v20190418, 9.4.17.v20190418 │ jetty: error path information disclosure │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2019-10247 │
├─────────────────────────────────────────────────┼────────────────┼──────────┤
具體的操作可以檢視 k8s
官方檔案: ImagePolicyWebhook。
其中我們可以看到需要呼叫到第三方的webhook
, 是存在一個kainlite/kube-image-bouncer:ImagePolicyWebhook 和 GenericAdmissionWebhook Kubernetes 入場控制器的簡單端點 (github.com) 元件。 這個元件實現的內容就是判斷我們當前的映象是否為 latest
的映象。 是返回 "allowed": false
我們其實是可以對於這個元件進行改造,增加一些客製化化的內容, 比如去呼叫一些介面獲取對應的映象的安全掃描結果,如果掃描結果是pass 的話,就可以部署,否則的話,就不允許部署。