📚

trivyでローカルのコンテナイメージはスキャンできるのか?

2024/07/28に公開

結論

できます。

本記事のキモは実行時に渡している--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 が出てきます。

https://github.com/aquasecurity/trivy/issues/1506
https://github.com/aquasecurity/trivy/discussions/4270

コメントによれば、常に Docker Hub からイメージを pull しようとするため、 UNAUTHORIZED になる。と指摘があります。

https://github.com/aquasecurity/trivy/discussions/4270#discussioncomment-5858203

私の場合でも、同じエラーメッセージが出ています。

この時点で、ローカルのコンテナイメージのスキャンはサポートしていないんだなと思い込んでしまいました。

しかし実際は異なり、ちゃんとサポートしています。

https://github.com/aquasecurity/trivy/discussions/4270#discussioncomment-7011080

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 をオプションで指定してあげれば、ローカルイメージもスキャン可能でした。

ちゃんと公式ドキュメントを読もう

ちゃんと公式ドキュメントのトラブルシューティングに書いてありました。

https://aquasecurity.github.io/trivy/v0.53/docs/references/troubleshooting/

trivy troubleshooting

私はコンテナイメージスキャンのページだけを見て満足していたのです。
ちゃんとドキュメントを読まなけらならないなとN回目の反省をしました。

補足: trivyとは?

Trivyは、多用途なセキュリティスキャナーであり以下の機能と特徴を備えているOSSです。

スキャン対象 (ターゲット):

  • コンテナイメージ
  • ファイルシステム
  • リモートのGitリポジトリ
  • 仮想マシンイメージ
  • Kubernetesクラスター
  • AWSリソース

検出可能なセキュリティ問題 (スキャナー):

  • OSパッケージとソフトウェア依存関係の脆弱性(SBOM)
  • 既知の脆弱性(CVEs)
  • IaC(Infrastructure as Code)の問題とミスコンフィギュレーション
  • 機密情報および秘密情報の漏えい
  • ソフトウェアライセンスの問題

https://aquasecurity.github.io/trivy/v0.53/

国産のセキュリティプラットフォームである yamory もコンテナイメージスキャンには trivy を利用しているようで、
trivyのスキャン結果を独自で用意している脆弱性データベースと照合して検知しているようです。

Discussion