Trivy の「VM image scanning」を使うと AWS の Amazon Machine Image (AMI) や Amazon Elastic Block Store (Amazon EBS) スナップショットに対してセキュリティスキャンを実行できる❗️サーバーにエージェントをセットアップする必要がなく(エージェントレス),スキャンのために Amazon EC2 インスタンスを一時的に起動する必要もなく,便利だ〜 \( 'ω')/
ドキュメントにも書いてあるけど現在はまだ EXPERIMENTAL
として提供されているため,今後仕様変更になる可能性はある🔥
さっそく試す
Trivy v0.45.0 を使ってさっそく試す❗️
$ trivy --version Version: 0.45.0
今回は検証用の Amazon EC2 インスタンス(Amazon Linux 2023 AMI)で 9/16 に取得した Amazon EBS スナップショットに対して Trivy の VM image scanning を実行する.Amazon EBS スナップショットの場合は trivy vm ebs:xxx
コマンド・AMI の場合は trivy vm ami:xxx
コマンドを使う.実行時間はそれなりに長かったけど,少し待つと結果が表示された👏
snap-xxxxxxxxxxxxxxxxx
: MEDIUM 8件 🛑etc/ssh/ssh_host_ecdsa_key
: HIGH 1件 🛑etc/ssh/ssh_host_ed25519_key
: HIGH 1件 🛑
$ trivy vm ebs:snap-xxxxxxxxxxxxxxxxx (中略) snap-xxxxxxxxxxxxxxxxx (amazon 2023 (Amazon Linux)) Total: 8 (UNKNOWN: 0, LOW: 0, MEDIUM: 8, HIGH: 0, CRITICAL: 0) ┌──────────────┬────────────────┬──────────┬────────┬────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ ├──────────────┼────────────────┼──────────┼────────┼────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ kernel │ CVE-2023-21264 │ MEDIUM │ fixed │ 6.1.49-69.116.amzn2023 │ 6.1.52-71.125.amzn2023 │ In multiple functions of mem_protect.c, there is a possible │ │ │ │ │ │ │ │ way to acc... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-21264 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-2430 │ │ │ │ │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring │ │ │ │ │ │ │ │ cause denial of service... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2430 │ ├──────────────┼────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ kernel-tools │ CVE-2023-21264 │ │ │ │ │ In multiple functions of mem_protect.c, there is a possible │ │ │ │ │ │ │ │ way to acc... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-21264 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-2430 │ │ │ │ │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring │ │ │ │ │ │ │ │ cause denial of service... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2430 │ ├──────────────┼────────────────┤ │ ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ libgcc │ CVE-2023-4039 │ │ │ 11.3.1-4.amzn2023.0.3 │ 11.4.1-2.amzn2023.0.2 │ -fstack-protector fails to guard dynamic stack allocations │ │ │ │ │ │ │ │ on ARM64 │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-4039 │ ├──────────────┤ │ │ │ │ │ │ │ libgomp │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├──────────────┤ │ │ │ │ │ │ │ libstdc++ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├──────────────┼────────────────┤ │ ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ libxml2 │ CVE-2023-39615 │ │ │ 2.10.4-1.amzn2023.0.3 │ 2.10.4-1.amzn2023.0.4 │ crafted xml can cause global buffer overflow │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-39615 │ └──────────────┴────────────────┴──────────┴────────┴────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────┘ etc/ssh/ssh_host_ecdsa_key (secrets) Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0) HIGH: AsymmetricPrivateKey (private-key) ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ Asymmetric Private Key ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── etc/ssh/ssh_host_ecdsa_key:1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 [ -----BEGIN OPENSSH PRIVATE KEY-----********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY----- 2 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── etc/ssh/ssh_host_ed25519_key (secrets) Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0) HIGH: AsymmetricPrivateKey (private-key) ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ Asymmetric Private Key ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── etc/ssh/ssh_host_ed25519_key:1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 [ -----BEGIN OPENSSH PRIVATE KEY-----***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY----- 2 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
スキャナー(スキャン対象)
Trivy の VM image scanning は「4種類」のスキャナーをサポートしている.
- Vulnerabilities (
vuln
) ✔️ デフォルト - Misconfigurations (
config
) - Secrets (
secret
) ✔️ デフォルト - Licenses (
license
)
デフォルトで実行されるスキャナーは Vulnerabilities と Secrets で,もしスキャン速度を速くするなら --scanners vuln
オプションを指定するべし!と書いてあった.
If your scanning is slow, please try '--scanners vuln' to disable secret scanning
vuln
に限定して再度実行してみる💡
$ trivy vm --scanners vuln ebs:snap-xxxxxxxxxxxxxxxxx (中略) snap-xxxxxxxxxxxxxxxxx (amazon 2023 (Amazon Linux)) Total: 8 (UNKNOWN: 0, LOW: 0, MEDIUM: 8, HIGH: 0, CRITICAL: 0) ┌──────────────┬────────────────┬──────────┬────────┬────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ ├──────────────┼────────────────┼──────────┼────────┼────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ kernel │ CVE-2023-21264 │ MEDIUM │ fixed │ 6.1.49-69.116.amzn2023 │ 6.1.52-71.125.amzn2023 │ In multiple functions of mem_protect.c, there is a possible │ │ │ │ │ │ │ │ way to acc... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-21264 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-2430 │ │ │ │ │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring │ │ │ │ │ │ │ │ cause denial of service... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2430 │ ├──────────────┼────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ kernel-tools │ CVE-2023-21264 │ │ │ │ │ In multiple functions of mem_protect.c, there is a possible │ │ │ │ │ │ │ │ way to acc... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-21264 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-2430 │ │ │ │ │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring │ │ │ │ │ │ │ │ cause denial of service... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2430 │ ├──────────────┼────────────────┤ │ ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ libgcc │ CVE-2023-4039 │ │ │ 11.3.1-4.amzn2023.0.3 │ 11.4.1-2.amzn2023.0.2 │ -fstack-protector fails to guard dynamic stack allocations │ │ │ │ │ │ │ │ on ARM64 │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-4039 │ ├──────────────┤ │ │ │ │ │ │ │ libgomp │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├──────────────┤ │ │ │ │ │ │ │ libstdc++ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├──────────────┼────────────────┤ │ ├────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ libxml2 │ CVE-2023-39615 │ │ │ 2.10.4-1.amzn2023.0.3 │ 2.10.4-1.amzn2023.0.4 │ crafted xml can cause global buffer overflow │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-39615 │ └──────────────┴────────────────┴──────────┴────────┴────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────┘
CVE を減らす
次に Amazon EBS スナップショットを取得した Amazon EC2 インスタンスで dnf upgrade --releasever=2023.2.20230920
コマンドを実行した.そしてもう一度 Amazon EBS スナップショットを取得してから Trivy の VM image scanning を実行したところ該当する CVE が減っていた✌
snap-xxxxxxxxxxxxxxxxx
: MEDIUM 2件 🛑
$ trivy vm --scanners vuln ebs:snap-xxxxxxxxxxxxxxxxx (中略) snap-xxxxxxxxxxxxxxxxx (amazon 2023 (Amazon Linux)) Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 2, HIGH: 0, CRITICAL: 0) ┌─────────┬────────────────┬──────────┬────────┬────────────────────────┬────────────────────────┬─────────────────────────────────────────────────────────────┐ │ Library │ Vulnerability │ Severity │ Status │ Installed Version │ Fixed Version │ Title │ ├─────────┼────────────────┼──────────┼────────┼────────────────────────┼────────────────────────┼─────────────────────────────────────────────────────────────┤ │ kernel │ CVE-2023-21264 │ MEDIUM │ fixed │ 6.1.49-69.116.amzn2023 │ 6.1.52-71.125.amzn2023 │ In multiple functions of mem_protect.c, there is a possible │ │ │ │ │ │ │ │ way to acc... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-21264 │ │ ├────────────────┤ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ CVE-2023-2430 │ │ │ │ │ missing lock in io_uring/msg_ring.c for IOPOLL in io_uring │ │ │ │ │ │ │ │ cause denial of service... │ │ │ │ │ │ │ │ https://avd.aquasec.com/nvd/cve-2023-2430 │ └─────────┴────────────────┴──────────┴────────┴────────────────────────┴────────────────────────┴─────────────────────────────────────────────────────────────┘
Vulnerabilities (vuln
) 以外のスキャナーも試す
Misconfigurations (config
)
--scanners config
オプションはドキュメントに以下のように書かれていて特に使う必要性はなさそうだった.
It is supported, but it is not useful in most cases.
実際に実行しても Detected config files: 0
で何も検出されなかった.
$ trivy vm --scanners config ebs:snap-xxxxxxxxxxxxxxxxx
Secrets (secret
)
デフォルトで有効化されている --scanners secret
オプションは AWS のアクセスキーや GitHub の Personal Access Tokens (PAT) などの存在を検出できる.以下のドキュメントに詳しく載っていて,細かくカスタマイズできるようになっている👌
ドキュメントの Recommendation に載っているけど,--skip-dirs
オプションを使ってスキャン範囲を狭めることで Secrets のスキャン速度を速くできる.Secrets の実行時間は結構長く,実際に使うときには必要になりそう.
$ trivy vm --scanners secret ebs:snap-xxxxxxxxxxxxxxxxx (中略) etc/ssh/ssh_host_ecdsa_key (secrets) Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0) HIGH: AsymmetricPrivateKey (private-key) ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ Asymmetric Private Key ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── etc/ssh/ssh_host_ecdsa_key:1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 [ -----BEGIN OPENSSH PRIVATE KEY-----********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY----- 2 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── etc/ssh/ssh_host_ed25519_key (secrets) Total: 1 (UNKNOWN: 0, LOW: 0, MEDIUM: 0, HIGH: 1, CRITICAL: 0) HIGH: AsymmetricPrivateKey (private-key) ═══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════ Asymmetric Private Key ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── etc/ssh/ssh_host_ed25519_key:1 ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 1 [ -----BEGIN OPENSSH PRIVATE KEY-----***********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************-----END OPENSSH PRIVATE KEY----- 2 ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Licenses (license
)
--scanners license
オプションを指定するとライセンスに関するリスクを検出できる.以下のドキュメントに詳しく載っていて,細かくカスタマイズできるようになっている👌
特にオプションは指定せず実行すると大量に(466件も)出力される❗️1個1個ライセンスを確認するのは大変だから自動的に一覧を取得できるのは便利〜
$ trivy vm --scanners license ebs:snap-xxxxxxxxxxxxxxxxx (中略) OS Packages (license) Total: 466 (UNKNOWN: 466, LOW: 0, MEDIUM: 0, HIGH: 0, CRITICAL: 0) ┌─────────────────────────────────┬──────────────────────────────────────────────────────────────┬────────────────┬──────────┐ │ Package │ License │ Classification │ Severity │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┼────────────────┼──────────┤ │ acl │ GPLv2+ │ Non Standard │ UNKNOWN │ ├─────────────────────────────────┤ │ │ │ │ acpid │ │ │ │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ │ alternatives │ GPLv2 │ │ │ ├─────────────────────────────────┤ │ │ │ │ amazon-chrony-config │ │ │ │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ │ amazon-cloudwatch-agent │ MIT │ │ │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ (中略) ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ │ yum │ GPLv2+ │ │ │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ │ zip │ BSD │ │ │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ │ zlib │ zlib and Boost │ │ │ ├─────────────────────────────────┼──────────────────────────────────────────────────────────────┤ │ │ │ zstd │ BSD and GPLv2 │ │ │ └─────────────────────────────────┴──────────────────────────────────────────────────────────────┴────────────────┴──────────┘
仕組み
最後に Trivy の VM image scanning の仕組みに関して調べたことをまとめておく📝 まず Aqua Blog の記事「Trivy Now Scans Amazon Machine Images (AMIs)」に Trivy でどのように AMI や Amazon EBS スナップショットに対してスキャンを実行しているのかという仕組みが詳しく載っている.Trivy では Amazon EC2 インスタンスの中にエージェントをセットアップする必要はなく,直接ボリュームのブロックを取得してスキャンをしているとのこと💡
そして,Trivy ドキュメントでは以下のアクションに対して権限が必要と書いてあった.よって Amazon EBS スナップショットのボリュームから直接ブロックを取得するために「EBS Direct API」を使っていて良い感じ❗️逆に言えば,実行時間がそれなりに長くなってしまうのはこういう背景があるからだと思う(あくまで予想).
ec2:DescribeImages
ebs:ListSnapshotBlocks
ebs:GetSnapshotBlock
関連情報
Aqua の YouTube に Trivy の VM image scanning をリリースしたときの紹介動画が公開されていた👀
今後
今後は AMI もしくは Amazon EBS スナップショットを取得したら自動的に Trivy を実行する仕組みを考えたくて,今のところ Amazon EventBridge で以下のドキュメントを参考に EC2 AMI State Change (available)
もしくは EBS Volume Notification (available)
をトリガーして Amazon ECS Task もしくは AWS CodeBuild で Trivy を実行するのはどうかな〜なんて考えているところ \( 'ω')/ プロトタイプを構築したらまたまとめるぞー