概要
Trivy を利用してコンテナのセキュリティチェックを行いたい。
- Trivy v0.38 (2023/03/11)
公式リポジトリ。
公式ドキュメント。
【WIP】Trivy コマンドまとめ
スキャン対象とチェック項目でコマンドが異なる。
コマンド | スキャン対象 | チェック項目 |
trivy config | IaCファイル ( 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
コメント