Trivyを使って脆弱性をスキャンする

DevOps

概要

Trivyはコンテナイメージやローカルディレクトリに依存するライブラリとOSパッケージの脆弱性を迅速かつ効果的に検出するOSSツールです。使い方は簡単で、開発プロセスにすぐに組み込むことができるのが特徴です。

インストール方法

Homebrewを使用したインストール

MacのユーザーはHomebrewを通じてインストールすることが可能です。

brew install aquasecurity/trivy/trivy

Dockerイメージを使用したインストール

Dockerを使用している場合、以下のコマンドでイメージを取得します。

docker pull aquasec/trivy

使用方法

Trivyでスキャン可能な対象は多岐にわたります。以下は主なスキャン対象とその方法です。

コンテナイメージのスキャン

脆弱性を含むdockerイメージに対してtrivy imageコマンドでスキャンを実行します。具体的なコマンドは以下の通りです。
以前の記事でも使用した、snykが公開する脆弱性を含むイメージをスキャン対象とします。

$ trivy image docker-goof --severity CRITICAL
2023-08-13T17:26:36.716+0900    INFO    Vulnerability scanning is enabled
2023-08-13T17:26:36.717+0900    INFO    Secret scanning is enabled
2023-08-13T17:26:36.717+0900    INFO    If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-08-13T17:26:36.717+0900    INFO    Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection
2023-08-13T17:26:36.764+0900    INFO    Detected OS: debian
2023-08-13T17:26:36.764+0900    INFO    Detecting Debian vulnerabilities...
2023-08-13T17:26:36.833+0900    INFO    Number of language-specific files: 2
2023-08-13T17:26:36.833+0900    INFO    Detecting gobinary vulnerabilities...
2023-08-13T17:26:36.835+0900    INFO    Detecting node-pkg vulnerabilities...

docker-goof (debian 11.6)

Total: 24 (CRITICAL: 24)
(省略)

Node.js (node-pkg)

Total: 18 (CRITICAL: 18)
(省略)

このコマンドは、コンテナに含まれるファイルの脆弱性とベースイメージの脆弱性を検出します。

ローカルディレクトリのスキャン

ローカルディレクトリに対する脆弱性スキャンはtrivy fsコマンドを使用します。
こちらもsnykが公開する脆弱性を含むプロジェクトをスキャン対象とします。

$ trivy fs ./nodejs-goof --severity CRITICAL
2023-08-13T17:33:13.467+0900    INFO    Vulnerability scanning is enabled
2023-08-13T17:33:13.467+0900    INFO    Secret scanning is enabled
2023-08-13T17:33:13.467+0900    INFO    If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-08-13T17:33:13.467+0900    INFO    Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection
2023-08-13T17:33:13.550+0900    INFO    To collect the license information of packages in "package-lock.json", "npm install" needs to be performed beforehand
2023-08-13T17:33:13.611+0900    INFO    Number of language-specific files: 1
2023-08-13T17:33:13.611+0900    INFO    Detecting npm vulnerabilities...

package-lock.json (npm)

Total: 26 (CRITICAL: 26)
(省略)

リモートリポジトリのスキャン

リモートリポジトリに対するスキャンはtrivy repoコマンドで実行できます。

$ trivy repo https://github.com/snyk-labs/nodejs-goof.git --severity CRITICAL
2023-08-13T17:37:55.491+0900    INFO    Vulnerability scanning is enabled
2023-08-13T17:37:55.491+0900    INFO    Secret scanning is enabled
2023-08-13T17:37:55.491+0900    INFO    If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-08-13T17:37:55.491+0900    INFO    Please see also https://aquasecurity.github.io/trivy/v0.44/docs/scanner/secret/#recommendation for faster secret detection
Enumerating objects: 695, done.
Counting objects: 100% (695/695), done.
Compressing objects: 100% (506/506), done.
Total 695 (delta 358), reused 498 (delta 177), pack-reused 0
2023-08-13T17:37:58.059+0900    INFO    To collect the license information of packages in "package-lock.json", "npm install" needs to be performed beforehand
2023-08-13T17:37:58.118+0900    INFO    Number of language-specific files: 1
2023-08-13T17:37:58.118+0900    INFO    Detecting npm vulnerabilities...

package-lock.json (npm)

Total: 26 (CRITICAL: 26)
(省略)

IaC (Infrastructure as Code) のスキャン

IaCに対するスキャンもサポートしており、以下のようなコマンドで実行できます。
こちらもsnykが公開する脆弱性を含むIaCコードをスキャン対象とします。

$ trivy config ./infrastructure-as-code-goof/terraform/s3/unencrypted_s3_bucket.tf --severity HIGH,CRITICAL
2023-08-13T17:58:42.402+0900    INFO    Misconfiguration scanning is enabled
2023-08-13T17:58:42.768+0900    INFO    Detected config files: 2

unencrypted_s3_bucket.tf (terraform)

Tests: 28 (SUCCESSES: 5, FAILURES: 23, EXCEPTIONS: 0)
Failures: 23 (HIGH: 23, CRITICAL: 0)

(省略)

備考

デフォルトでは、trivyが脆弱性を検知してもexit codeは0になります。脆弱性の検知に応じてexit codeを1にしたい場合、以下のようにオプションを付与することができます。

$ trivy fs ./nodejs-goof --exit-code 1 --severity CRITICAL

まとめ

Trivyは、多岐にわたる対象に対して脆弱性スキャンを実行することができる強力なセキュリティツールです。開発プロセスに組み込んで早期にセキュリティリスクを発見し、安全なプロダクト開発を実現しましょう。この記事がどなたかの参考になれば幸いです。

参考

コメント