Dockerコンテナの脆弱性管理
さて今度はDocker。
ぐぐるとvulsでコンテナを検索する方法というのもヒットするのですが、現状docを見ると、「廃止したので、trivy別途使ってね」とあります。
https://vuls.io/docs/ja/tutorial-scan-docker-image.html
後日、訂正。
https://vuls.io/docs/ja/usage-scan.html
Vulsは「コンテナ」をスキャンすることはできるみたいです。
上記の記載は、Vulsはコンテナの雛形になる「イメージ」のスキャンはしない、という意味でしょうか。
(結果をtrivyから取り込む機能はあるようですが)
逆に、trivyはイメージのスキャンはできるけど、コンテナのスキャンはしない、と。
なるほど。。
用途によってコンテナとイメージとどっちがアクセスしやすいかや、コンテナとイメージで差分が出る運用をしているかでどちらを使うか目利きですね。
とりあえずこの記事ではTrivyしか選択肢がないと思ってまとめていたので、そのまままとめます。
Trivyを使ってみる
https://github.com/aquasecurity/trivy
基本上記の公式サイトのinstall手順通りに実施で、ハマったりはしませんでした。
まずは一回実行してみる
コンテナで導入する方法をとりましたが、今回
こんな感じに出力されます。
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image --scanners=vuln ubuntu
2023-04-22T10:46:06.017Z INFO Vulnerability scanning is enabled
2023-04-22T10:46:06.913Z INFO Detected OS: ubuntu
2023-04-22T10:46:06.913Z INFO Detecting Ubuntu vulnerabilities...
2023-04-22T10:46:06.917Z INFO Number of language-specific files: 0
ubuntu (ubuntu 22.04)
=====================
Total: 19 (UNKNOWN: 0, LOW: 19, MEDIUM: 0, HIGH: 0, CRITICAL: 0)
┌──────────────┬────────────────┬──────────┬──────────────────────────┬───────────────┬─────────────────────────────────────────────────────────────┐
│ Library │ Vulnerability │ Severity │ Installed Version │ Fixed Version │ Title │
├──────────────┼────────────────┼──────────┼──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ bash │ CVE-2022-3715 │ LOW │ 5.1-6ubuntu1 │ │ bash: a heap-buffer-overflow in valid_parameter_transform │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-3715 │
├──────────────┼────────────────┤ ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ coreutils │ CVE-2016-2781 │ │ 8.32-4.1ubuntu1 │ │ coreutils: Non-privileged session can escape to the parent │
│ │ │ │ │ │ session in chroot │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2016-2781 │
├──────────────┼────────────────┤ ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ gpgv │ CVE-2022-3219 │ │ 2.2.27-3ubuntu2.1 │ │ gnupg: denial of service issue (resource consumption) using │
│ │ │ │ │ │ compressed packets │
│ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2022-3219 │
├──────────────┼────────────────┤ ├──────────────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
きれいに出してくれるんですけど、逆にスクリプトとかでは食えない形式ですね。。
出力フォーマット選べないか、見てみます。
公式サイトやgitより、-hしてしまうほうがわかりやすかったです。
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image -h
...
-f, --format string format (table, json, template, sarif, cyclonedx, spdx, spdx-json, github, cosign-vuln) (default "table")
...
みっけ。
$ docker run -v /var/run/docker.sock:/var/run/docker.sock -v $HOME/Library/Caches:/root/.cache/ aquasec/trivy image --scanners=vuln --format json ubuntu
出力は省略します。
後でvulsの結果と一緒に、CVEベースでソートするスクリプト作っておくことにしましょう。
使ってみての所感
特に問題なく、今回の用途ではコンテナ分はtrivyで調査するようにしようと思います。
一応、備忘をいくつか。
コンテナの「イメージ」を調査するツールである。
調査するのはコンテナ「イメージ」であり、実施祭に動いているコンテナを見るわけではない点は、一応注意でしょうか。
運用フェイズに入っていればコンテナの構成=イメージの構成でまず問題ないとは思うのですが、もしコンテナ生成後に追加でパッケージを入れる、という使い方をする場合は、要注意。
OSの標準パッケージで導入している分以外のパッケージの脆弱性は見てくれない
これはVulsと一緒ですね。
コンテナでソフトを使う場合、ソフトのメインの部分は都度コンパイルしていたりと、OSの標準レポジトリ配布のパッケージを使うことはまずありませんので、メインのソフトはCPEを調べておいて、一括でVulsで検索でしょうか。
有償版のdocにはtrivyをVuls側から駆動するというような記載も見かけましたが、深堀はしてません。
CVE情報はどのように更新している?
CVE情報をどの時点でダウンロードしているのかが調べきれてません。
うっかり古いDBをそのまま使っていて、脆弱性を見落として、となるとなんともです。
今回はワンショットで調査してそれっきりになる予定ですが、長期的に使うなら、更新方法をきちんと整理しておかないといけないですね。。
ゴミコンテナがたくさん残る、、
docker型で実行する場合、実行時に-rmをつけないと、実行済みのゴミコンテナが大量に出来上がります。。
rmつけ忘れたら、以下で定期的にお掃除ですね。。
$ docker ps -a -f ancestor=aquasec/trivy --format "{{.ID}}" | xargs docker rm
まとめ
dockerコンテナの脆弱性調査はtrivyで行こうと思います。