trivyでローカルのコンテナイメージはスキャンできるのか?
結論
できます。
本記事のキモは実行時に渡している--docker-host unix://$HOME/.rd/docker.sock
です。
> trivy image --list-all-pkgs --ignore-unfixed --docker-host unix://$HOME/.rd/docker.sock mutao/sample
2024-07-28T18:05:10+09:00 WARN "--list-all-pkgs" is only valid for the JSON format, for other formats a list of packages is automatically included.
2024-07-28T18:05:10+09:00 INFO Need to update DB
2024-07-28T18:05:10+09:00 INFO Downloading DB... repository="ghcr.io/aquasecurity/trivy-db:2"
50.23 MiB / 50.23 MiB [--------------------------------------------------------------------------------------------------------------------------] 100.00% 7.67 MiB p/s 6.7s
2024-07-28T18:05:18+09:00 INFO Vulnerability scanning is enabled
2024-07-28T18:05:18+09:00 INFO Secret scanning is enabled
2024-07-28T18:05:18+09:00 INFO If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2024-07-28T18:05:18+09:00 INFO Please see also https://aquasecurity.github.io/trivy/v0.53/docs/scanner/secret#recommendation for faster secret detection
2024-07-28T18:05:18+09:00 INFO Detected OS family="amazon" version="2 (Karoo)"
2024-07-28T18:05:18+09:00 INFO [amazon] Detecting vulnerabilities... os_version="2" pkg_num=237
2024-07-28T18:05:18+09:00 INFO Number of language-specific files num=0
mutao/sample (amazon 2 (Karoo))
Total: 0 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
なぜローカルのコンテナイメージをスキャンできるか疑問に思ったか?
ある日、コンテナイメージの脆弱性対応をしていて、以下のエラーに遭遇しました。
trivy image -f=json --list-all-pkgs --ignore-unfixed hoge:latest
2024-07-26T14:59:28+09:00 INFO Vulnerability scanning is enabled
2024-07-26T14:59:28+09:00 INFO Secret scanning is enabled
2024-07-26T14:59:28+09:00 INFO If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2024-07-26T14:59:28+09:00 INFO Please see also https://aquasecurity.github.io/trivy/v0.53/docs/scanner/secret#recommendation for faster secret detection
2024-07-26T14:59:30+09:00 FATAL Fatal error image scan error: scan error: unable to initialize a scanner: unable to initialize an image scanner: unable to find the specified image "hoge:latest" in ["docker" "containerd" "podman" "remote"]: 4 errors occurred:
* docker error: unable to inspect the image (hoge:latest): Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
* containerd error: containerd socket not found: /run/containerd/containerd.sock
* podman error: unable to initialize Podman client: no podman socket found: stat podman/podman.sock: no such file or directory
* remote error: GET https://index.docker.io/v2/library/hoge/manifests/latest: UNAUTHORIZED: authentication required; [map[Action:pull Class: Name:library/hoge Type:repository]]
unix socket が指定のPATHに見つからないと言っていますね。
ぱっと見よくある、 docker daemon を起動していない場合のエラーメッセージに似ています。
私の場合、Rancher Desktop を利用していて docker command も正常に機能する状況でした。
なので、 trivy の issue をいくつか見てみることにしました。
すると... 以下のようなローカルのコンテナイメージに対してのスキャンをサポートしていないようなことを示唆する issue や discussion が出てきます。
コメントによれば、常に Docker Hub からイメージを pull しようとするため、 UNAUTHORIZED
になる。と指摘があります。
私の場合でも、同じエラーメッセージが出ています。
この時点で、ローカルのコンテナイメージのスキャンはサポートしていないんだなと思い込んでしまいました。
しかし実際は異なり、ちゃんとサポートしています。
docker.sock の PATH を指定するとよい。とのコメントがあります。
私はローカルでのコンテナ環境を Rancher Desktop を利用して構築しています。
Rancher Desktop では、 docekr.sock は $HOME/.rd/docker.sock
に存在します。
一方、Docker Desktop では、 /var/run/docker.sock
に存在し、trivyもデフォルトでこちらを見ているようです。
そのため Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
というエラーが発生していたわけです。
なので --docker-host unix://$HOME/.rd/docker.sock
をオプションで指定してあげれば、ローカルイメージもスキャン可能でした。
ちゃんと公式ドキュメントを読もう
ちゃんと公式ドキュメントのトラブルシューティングに書いてありました。
私はコンテナイメージスキャンのページだけを見て満足していたのです。
ちゃんとドキュメントを読まなけらならないなとN回目の反省をしました。
補足: trivyとは?
Trivyは、多用途なセキュリティスキャナーであり以下の機能と特徴を備えているOSSです。
スキャン対象 (ターゲット):
- コンテナイメージ
- ファイルシステム
- リモートのGitリポジトリ
- 仮想マシンイメージ
- Kubernetesクラスター
- AWSリソース
検出可能なセキュリティ問題 (スキャナー):
- OSパッケージとソフトウェア依存関係の脆弱性(SBOM)
- 既知の脆弱性(CVEs)
- IaC(Infrastructure as Code)の問題とミスコンフィギュレーション
- 機密情報および秘密情報の漏えい
- ソフトウェアライセンスの問題
国産のセキュリティプラットフォームである yamory もコンテナイメージスキャンには trivy を利用しているようで、
trivyのスキャン結果を独自で用意している脆弱性データベースと照合して検知しているようです。
Discussion