Trivy でコンテナイメージ、IaC、Dockerfile リポジトリをセキュリティスキャン

概要

Trivy を利用してコンテナのセキュリティチェックを行いたい。

  • Trivy v0.38 (2023/03/11)

公式リポジトリ。

公式ドキュメント。

【WIP】Trivy コマンドまとめ

スキャン対象とチェック項目でコマンドが異なる。

コマンドスキャン対象チェック項目
trivy configIaCファイル ( Terraform )
Dockerfile
Misconfigurations
trivy imageコンテナイメージ
(イメージ内のファイル、メタデータ)
Vulnerabilities
Misconfigurations
Secrets
Licenses
trivy fsファイルシステムVulnerabilities
Misconfigurations
Secrets
Licenses
S
trivy repoリモートリポジトリVulnerabilities
Misconfigurations
Secrets
Licenses
[WIP] trivy rootfs
[WIP] trivy aws
[WIP] trivy k8s

Trivy 準備

Mac なら brew で入る。

brew install trivy

もしくは docker で。

docker run aquasec/trivy

Trivy CLI 使い方

設定不備チェック ( Misconfiguration )

ファイルスキャンし、設定不備を発見する。

trivy config コマンドで IaC, Dockerfile 両方をスキャン可能。

WIP : IaC ファイル

IaC ファイルを静的解析して設定不備をチェックすることが可能
対象は Terraform, CloudFormation, Helm など。 CSPM/KSPM として利用可能。

下記は Terraform ファイルをスキャンした場合の結果。
16 件テストし、14 の FAILURES(大量に出力されたため一部省略)。

$ trivy config . | head -n 50
2023-03-01T08:31:29.382+0900	INFO	Misconfiguration scanning is enabled
2023-03-01T08:31:29.949+0900	INFO	Detected config files: 14

modules/alb/main.tf (terraform)
===============================
Tests: 16 (SUCCESSES: 2, FAILURES: 14, EXCEPTIONS: 0)
Failures: 14 (UNKNOWN: 0, LOW: 4, MEDIUM: 0, HIGH: 4, CRITICAL: 6)

HIGH: Application load balancer is not set to drop invalid headers.
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Passing unknown or invalid headers through to the target poses a potential risk of compromise.

By setting drop_invalid_header_fields to true, anything that doe not conform to well known, defined headers will be removed by the load balancer.

See https://avd.aquasec.com/misconfig/avd-aws-0052
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 modules/alb/main.tf:8-22
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   8 ┌ resource "aws_lb" "for_webserver" {
   9 │   name               = "webserver-alb"
  10 │   internal           = false
  11 │   load_balancer_type = "application"
  12 │
  13 │   security_groups = [
  14 │     aws_security_group.alb.id
  15 │   ]
  16 └
  ..

ALB で HIGH: Application load balancer is not set to drop invalid headers. と指摘。
無効なヘッダーを叩き落としてないため、drop_invalid_header_fields = true を追加。

Terraformを修正し再度スキャン。
FAILURES が 14 -> 12 と減った。

$ trivy config . | head -n 50
2023-03-01T08:34:17.463+0900	INFO	Misconfiguration scanning is enabled
2023-03-01T08:34:18.016+0900	INFO	Detected config files: 14

modules/alb/main.tf (terraform)
===============================
Tests: 15 (SUCCESSES: 3, FAILURES: 12, EXCEPTIONS: 0)
Failures: 12 (UNKNOWN: 0, LOW: 4, MEDIUM: 0, HIGH: 2, CRITICAL: 6)

trivy config . と実行した場合、同じアラートが重複して出力される(2023/04/17)

trivy config . --severity=CRITICAL
2023-04-17T08:41:15.060+0900	INFO	Misconfiguration scanning is enabled
2023-04-17T08:41:15.593+0900	INFO	Detected config files: 1

modules/alb/alb.tf (terraform)

Tests: 5 (SUCCESSES: 3, FAILURES: 2, EXCEPTIONS: 0)
Failures: 2 (CRITICAL: 2)

CRITICAL: Listener for application load balancer does not use HTTPS.
════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Plain HTTP is unencrypted and human-readable. This means that if a malicious actor was to eavesdrop on your connection, they would be able to see all of your data flowing back and forth.

You should use HTTPS, which is HTTP over an encrypted (TLS) connection, meaning eavesdroppers cannot read your traffic.

See https://avd.aquasec.com/misconfig/avd-aws-0054
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 modules/alb/alb.tf:56
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  53   resource "aws_lb_listener" "http" {
  ..
  56 [   protocol          = "HTTP"
  ..
  66   }
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────


CRITICAL: Listener for application load balancer does not use HTTPS.
════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Plain HTTP is unencrypted and human-readable. This means that if a malicious actor was to eavesdrop on your connection, they would be able to see all of your data flowing back and forth.

You should use HTTPS, which is HTTP over an encrypted (TLS) connection, meaning eavesdroppers cannot read your traffic.

See https://avd.aquasec.com/misconfig/avd-aws-0054
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 modules/alb/alb.tf:56
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  53   resource "aws_lb_listener" "http" {
  ..
  56 [   protocol          = "HTTP"
  ..
  66   }
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

ファイル・フォルダを指定し実行すれば、重複されない。

trivy config modules/ --severity=CRITICAL
2023-04-17T08:41:07.467+0900	INFO	Misconfiguration scanning is enabled
2023-04-17T08:41:07.996+0900	INFO	Detected config files: 1

alb/alb.tf (terraform)

Tests: 4 (SUCCESSES: 3, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (CRITICAL: 1)

CRITICAL: Listener for application load balancer does not use HTTPS.
════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
Plain HTTP is unencrypted and human-readable. This means that if a malicious actor was to eavesdrop on your connection, they would be able to see all of your data flowing back and forth.

You should use HTTPS, which is HTTP over an encrypted (TLS) connection, meaning eavesdroppers cannot read your traffic.

See https://avd.aquasec.com/misconfig/avd-aws-0054
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 alb/alb.tf:56
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
  53   resource "aws_lb_listener" "http" {
  ..
  56 [   protocol          = "HTTP"
  ..
  66   }
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Dockerfile

Dockerfile をスキャンした場合。

$ trivy config .
2023-03-01T08:13:54.040+0900	INFO	Misconfiguration scanning is enabled
2023-03-01T08:13:54.538+0900	INFO	Detected config files: 1

Dockerfile (dockerfile)

Tests: 24 (SUCCESSES: 23, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

LOW: Add HEALTHCHECK instruction in your Dockerfile
═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
You shoud add HEALTHCHECK instruction in your docker container images to perform the health check on running containers.

See https://avd.aquasec.com/misconfig/ds026
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────

LOW: Add HEALTHCHECK instruction in your Dockerfile とヘルスチェックがないとの結果。

Dockle の結果とは観点が異なる。

脆弱性チェック ( Vulnerability )

コンテナイメージを対象としたスキャン。

OS/言語パッケージ

コンテナイメージを対象にスキャンする。OS/言語の脆弱性をチェックできる。

$ trivy image aquasec/trivy
2023-03-02T07:33:35.108+0900	INFO	Vulnerability scanning is enabled
2023-03-02T07:33:35.108+0900	INFO	Secret scanning is enabled
2023-03-02T07:33:35.108+0900	INFO	If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-03-02T07:33:35.108+0900	INFO	Please see also https://aquasecurity.github.io/trivy/v0.37/docs/secret/scanning/#recommendation for faster secret detection
2023-03-02T07:33:46.879+0900	INFO	Detected OS: alpine
2023-03-02T07:33:46.879+0900	INFO	Detecting Alpine vulnerabilities...
2023-03-02T07:33:46.882+0900	INFO	Number of language-specific files: 1
2023-03-02T07:33:46.882+0900	INFO	Detecting gobinary vulnerabilities...

aquasec/trivy (alpine 3.17.1)

Total: 21 (UNKNOWN: 0, LOW: 0, MEDIUM: 8, HIGH: 13, CRITICAL: 0)

┌────────────┬────────────────┬──────────┬───────────────────┬───────────────┬─────────────────────────────────────────────────────────────┐
│  Library   │ Vulnerability  │ Severity │ Installed Version │ Fixed Version │                            Title                            │
├────────────┼────────────────┼──────────┼───────────────────┼───────────────┼─────────────────────────────────────────────────────────────┤
│ git        │ CVE-2023-23946 │ HIGH     │ 2.38.3-r1         │ 2.38.4-r0     │ git: git apply: a path outside the working tree can be      │
│            │                │          │                   │               │ overwritten...                                              │
│            │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2023-23946                  │
│            ├────────────────┼──────────┤                   │               ├─────────────────────────────────────────────────────────────┤
│            │ CVE-2023-22490 │ MEDIUM   │                   │               │ git: data exfiltration with maliciously crafted repository  │
│            │                │          │                   │               │ https://avd.aquasec.com/nvd/cve-2023-22490

シークレットスキャン ( Secret Scan )

AWS アクセキー、GCP サービスアカウント、 Github トークンなどのチェックも可能。

ローカルファイル指定。 --scanners secret を指定しないと vulnerability スキャンもされる。

trivy fs ./ --scanners secret --skip-files .envrc

リモートリポジトリを指定。

trivy repo https://github.com/runble1/next-ecs-terraform --scanners secret

ライセンススキャン ( License Scanning )

ライセンスチェックも可能。

Filesystem

ファイルシステムを対象としたスキャン。

OS /言語パッケージ

ローカルにあるファイルシステムを対象にスキャンする。OS/言語の脆弱性をチェックできる。

以下は Next.js プロジェクトをチェックした結果。node_modules がない状態だとチェックされなかった。

$ trivy fs .
2023-03-02T07:40:33.626+0900	INFO	Vulnerability scanning is enabled
2023-03-02T07:40:33.626+0900	INFO	Secret scanning is enabled
2023-03-02T07:40:33.626+0900	INFO	If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-03-02T07:40:33.626+0900	INFO	Please see also https://aquasecurity.github.io/trivy/v0.37/docs/secret/scanning/#recommendation for faster secret detection
2023-03-02T07:40:33.728+0900	INFO	Number of language-specific files: 2
2023-03-02T07:40:33.728+0900	INFO	Detecting yarn vulnerabilities...
2023-03-02T07:40:33.731+0900	INFO	Detecting npm vulnerabilities...

node_modules/uri-js/yarn.lock (yarn)

Total: 14 (UNKNOWN: 0, LOW: 3, MEDIUM: 3, HIGH: 7, CRITICAL: 1)

┌──────────────────────┬─────────────────────┬──────────┬───────────────────┬────────────────────────────┬──────────────────────────────────────────────────────────────┐
│       Library        │    Vulnerability    │ Severity │ Installed Version │       Fixed Version        │                            Title                             │
├──────────────────────┼─────────────────────┼──────────┼───────────────────┼────────────────────────────┼──────────────────────────────────────────────────────────────┤
│ ansi-regex           │ CVE-2021-3807       │ HIGH     │ 3.0.0             │ 3.0.1, 4.1.1, 5.0.1, 6.0.1 │ nodejs-ansi-regex: Regular expression denial of service      │
│                      │                     │          │                   │                            │ (ReDoS) matching ANSI escape codes                           │
│                      │                     │          │                   │                            │ https://avd.aquasec.com/nvd/cve-2021-3807                    │
│                      │                     │          ├───────────────────┤                            │                                                              │
│                      │                     │          │ 4.1.0             │                            │                                                              │
│                      │                     │          │                   │                            │                                                              │
│                      │                     │          │                   │                            │                                                              │

イメージスキャン時に比べて、OSパッケージ分少ない。

Git リポジトリ (Github/Gitlab)

Git リポジトリに対するスキャンも実行可能 (Vulnerabilities, Misconfigurations, Secrets, Licenses)。
非同期的なチェックに利用できる。

パブリックリポジトリへのスキャンには Token が不要。

$ trivy repo <your private GitHub repo URL>

プライベートリポジトリへのスキャンには Token が必要。

$ export GITHUB_TOKEN="your_private_github_token"
$ trivy repo <your private GitHub repo URL>

Vulnerabilities

package-lock.json などを参照し、脆弱性のチェックを行う。
同様に Secrets のチェックも行ってくれる。

$ trivy repo https://github.com/runble1/next-ecs-terraform
2023-03-15T14:52:07.145+0900	INFO	Vulnerability scanning is enabled
2023-03-15T14:52:07.145+0900	INFO	Secret scanning is enabled
2023-03-15T14:52:07.145+0900	INFO	If your scanning is slow, please try '--scanners vuln' to disable secret scanning
2023-03-15T14:52:07.145+0900	INFO	Please see also https://aquasecurity.github.io/trivy/v0.38/docs/secret/scanning/#recommendation for faster secret detection
Enumerating objects: 95, done.
Counting objects: 100% (95/95), done.
Compressing objects: 100% (88/88), done.
Total 95 (delta 16), reused 50 (delta 0), pack-reused 0
2023-03-15T14:52:07.854+0900	INFO	Number of language-specific files: 1
2023-03-15T14:52:07.854+0900	INFO	Detecting npm vulnerabilities...

ブランチを指定してのスキャンも可能。

$ trivy repo --branch <branch-name> <repo-name>

Misconfigurations

IaC ファイルと Dockerfile を参照し、設定不備チェックを行える。

$ trivy repo https://github.com/runble1/next-ecs-terraform  --scanners config | head -n 50
2023-03-15T14:49:10.680+0900	INFO	Misconfiguration scanning is enabled
Enumerating objects: 95, done.
Counting objects: 100% (95/95), done.
Compressing objects: 100% (88/88), done.
Total 95 (delta 16), reused 50 (delta 0), pack-reused 0
2023-03-15T14:49:12.421+0900	INFO	Detected config files: 9

nextjs-docker/Dockerfile (dockerfile)
=====================================
Tests: 24 (SUCCESSES: 23, FAILURES: 1, EXCEPTIONS: 0)
Failures: 1 (UNKNOWN: 0, LOW: 1, MEDIUM: 0, HIGH: 0, CRITICAL: 0)

LOW: Add HEALTHCHECK instruction in your Dockerfile
═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════
You shoud add HEALTHCHECK instruction in your docker container images to perform the health check on running containers.

See https://avd.aquasec.com/misconfig/ds026
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────



resource/modules/alb/main.tf (terraform)

json 形式でファイルに出力する。

$ trivy repo https://github.com/runble1/next-ecs-terraform  \
--scanners config \
--format json \
--output ./result.txt

severity を HIGH と CRITICAL のみに制御する。

$ trivy repo https://github.com/runble1/next-ecs-terraform  \
--scanners config \
--severity HIGH,CRITICAL

ライセンス

以下のコマンドでもチェックできる。

$ trivy repo --scanners license https://github.com/runble1/next-ecs-terraform
2023-03-15T14:48:08.100+0900	INFO	License scanning is enabled
Enumerating objects: 95, done.
Counting objects: 100% (95/95), done.
Compressing objects: 100% (88/88), done.
Total 95 (delta 16), reused 50 (delta 0), pack-reused 0

参考

Overview - Trivy
A Simple and Comprehensive Vulnerability Scanner for Containers and other Artifacts, Suitable for CI

コメント

タイトルとURLをコピーしました