今日は、Dockerコンテナイメージをスキャンする方法を学びます。
はじめに
トリビー (トライ triのように発音されます gger、 vy en vyのように発音されます )は、コンテナイメージ、ファイルシステム、Gitリポジトリの脆弱性、および構成の問題に対するシンプルで包括的なスキャナーです。 Trivyは、OSパッケージ(Alpine、RHEL、CentOSなど)および言語固有のパッケージ(Bundler、Composer、npm、yarnなど)の脆弱性を検出します。
さらに、Trivyは、Terraform、Dockerfile、KubernetesなどのInfrastructure as Code(IaC)ファイルをスキャンして、デプロイメントを攻撃のリスクにさらす可能性のある構成の問題を検出します。 Trivyは使いやすいです。バイナリをインストールするだけで、スキャンする準備が整います。
機能
- 包括的な脆弱性検出
- OSパッケージ(Alpine Linux、Red Hat Universal Base Image、Red Hat Enterprise Linux、CentOS、AlmaLinux、Rocky Linux、CBL-Mariner、Oracle Linux、Debian、Ubuntu、Amazon Linux、openSUSE Leap、SUSE Enterprise Linux、Photon OSおよびDistroless)
- 言語固有のパッケージ (Bundler、Composer、Pipenv、Poetry、npm、yarn、Cargo、NuGet、Maven、Go)
- 構成ミスの検出(IaCスキャン)
- さまざまな組み込みポリシーがすぐに使用可能で提供されます
- Kubernetes、Docker、Terraformなどが間もなく登場します
- カスタムポリシーをサポートする
- さまざまな組み込みポリシーがすぐに使用可能で提供されます
- 高精度
- 複数のターゲットをサポートする
- コンテナイメージ、ローカルファイルシステム、リモートgitリポジトリ
インストール
CenTOSについて
- そのリポジトリからCentOSにTrivyをインストールするので、trivyのリポジトリを追加してから、次のようにインストールします。
echo -e "\n[trivy]\nname=Trivy repository\nbaseurl=https://aquasecurity.github.io/trivy-repo/rpm/releases/\$releasever/\$basearch/\ngpgcheck=0\nenabled=1" | sudo tee -a /etc/yum.repos.d/kubernetes.repo
sudo yum -y install trivy
- またはRPMソースからtrivyをインストールする場合は、最新のTrivyリリースを入手して実行する必要があります:
wget https://github.com/aquasecurity/trivy/releases/download/v0.23.0/trivy_0.23.0_Linux-64bit.rpm
sudo yum localinstall ./trivy_0.23.0_Linux-64bit.rpm
Ubuntuの場合
- リポジトリから
sudo apt-get install wget apt-transport-https gnupg lsb-release
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key | sudo apt-key add -
echo deb https://aquasecurity.github.io/trivy-repo/deb $(lsb_release -sc) main | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update
sudo apt-get install trivy
- Debianソースから、CentOSで行ったように、最新のTrivyリリースも入手してから、以下のコマンドを実行する必要があります。
wget https://github.com/aquasecurity/trivy/releases/download/v0.23.0/trivy_0.23.0_Linux-64bit.deb
sudo apt install ./trivy_0.23.0_Linux-64bit.deb
ArchLinuxの場合|Manjaro
pikaur -Sy trivy-bin
OR
yay -Sy trivy-bin
Trivyを使用する
ファイルシステムとgitリポジトリのスキャン
- トリビー ファイルシステム(ホストマシン、仮想マシンイメージ、解凍されたコンテナイメージファイルシステムなど)をスキャンできます。
trivy fs /home/glassfish/
- Gitリポジトリをtrivyでスキャンするには
trivy repo https://github.com/aquasecurity/trivy
コンテナイメージのスキャン
- 画像を一覧表示する
docker images
- トリビーでスキャンする
trivy image httpd
DockerfileでTrivyを適用
trivyを含めることができます Dockerfile イメージを構築するときにすべてをスキャンします。
例:
- trivyを含むDockerfileを作成します
vim Dockerfile
- 以下を追加します:
FROM alpine:3.7
RUN apk add curl \
&& curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin \
&& trivy filesystem --exit-code 1 --no-progress /
- イメージを作成します。
[root@unixcop ~]# docker build -t scanned-image .
Sending build context to Docker daemon 244.6MB
Step 1/2 : FROM alpine:3.7
3.7: Pulling from library/alpine
5d20c808ce19: Pull complete
Digest: sha256:8421d9a84432575381bfabd248f1eb56f3aa21d9d7cd2511583c68c9b7511d10
Status: Downloaded newer image for alpine:3.7
---> 6d1ef012b567
Step 2/2 : RUN apk add curl && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin && trivy filesystem --exit-code 1 --no-progress /
---> Running in 7f2b8771050d
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.7/community/x86_64/APKINDEX.tar.gz
(1/4) Installing ca-certificates (20190108-r0)
(2/4) Installing libssh2 (1.9.0-r1)
(3/4) Installing libcurl (7.61.1-r3)
(4/4) Installing curl (7.61.1-r3)
Executing busybox-1.27.2-r11.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 6 MiB in 17 packages
aquasecurity/trivy info checking GitHub for latest tag
aquasecurity/trivy info found version: 0.23.0 for v0.23.0/Linux/64bit
aquasecurity/trivy info installed /usr/local/bin/trivy
2022-02-12T11:47:49.846Z INFO Need to update DB
2022-02-12T11:47:49.846Z INFO Downloading DB...
2022-02-12T11:48:24.761Z INFO Detected OS: alpine
2022-02-12T11:48:24.761Z INFO Detecting Alpine vulnerabilities...
2022-02-12T11:48:24.789Z INFO Number of language-specific files: 0
2022-02-12T11:48:24.789Z WARN This OS version is no longer supported by the distribution: alpine 3.7.3
2022-02-12T11:48:24.789Z WARN The vulnerability detection may be insufficient because security updates are not provided
7f2b8771050d (alpine 3.7.3)
===========================
Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 2)
+------------+------------------+----------+-------------------+---------------+---------------------------------------+
| LIBRARY | VULNERABILITY ID | SEVERITY | INSTALLED VERSION | FIXED VERSION | TITLE |
+------------+------------------+----------+-------------------+---------------+---------------------------------------+
| musl | CVE-2019-14697 | CRITICAL | 1.1.18-r3 | 1.1.18-r4 | musl libc through 1.1.23 has |
| | | | | | an x87 floating-point stack |
| | | | | | adjustment imbalance, related... |
| | | | | | -->avd.aquasec.com/nvd/cve-2019-14697 |
+------------+ + + + + +
| musl-utils | | | | | |
| | | | | | |
| | | | | | |
| | | | | | |
+------------+------------------+----------+-------------------+---------------+---------------------------------------+
The command '/bin/sh -c apk add curl && curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin && trivy filesystem --exit-code 1 --no-progress /' returned a non-zero code: 1
[root@unixcop ~]#
上に示したように、trivyはビルド中にDockerfileに含まれるイメージの脆弱性をスキャンしました。
- 次の方法で重大度で脆弱性をフィルタリングすることもできます:
trivy image --severity HIGH,CRITICAL httpd:latest
上に示したように、重大度と重大度が高い場合にのみ結果をフィルタリングしました。
- コンテナの内側からコンテナをスキャンします
docker run --rm -it nginx \
&& curl -sfL https://raw.githubusercontent.com/aquasecurity/trivy/master/contrib/install.sh | sh -s -- -b /usr/local/bin \
&& trivy fs /
結論
以上です
このガイドでは、ファイルシステムとgitリポジトリに加えて、Trivyを使用してDockerコンテナイメージの脆弱性をスキャンする方法を説明しました。
ありがとう