この記事について
- Trivy-OperatorをminikubeにGitOpsでデプロイする
- minikube環境にデプロイしたnginx:1.16をTrivyでスキャンしてみる
Gitリポジトリのディレクトリ構造
今回はApp Of AppsパターンでTrivyをデプロイするのでGitリポジトリは以下の構成とした。
$ tree .
.
└── manifest
├── apps
│ └── deployment.yaml
└── trivy
├── base
│ └── deployment.yaml
├── kustomization.yaml
└── overlays
└── dev
補足:
- appsフォルダ内にApplication(Argo CDのCRD)としてTrivyを定義
- リポジトリのパスには"manifest/overlays/dev"を指定
- Argo CDのTrivyアプリケーションとしてminikubeへTrivyをデプロイ
マニフェストの生成
helmfile.yaml
helmfileを用いてアプリケーションのテンプレートをHelm ChartからYAML形式で生成するための定義ファイル。
releases:
- name: trivy
namespace: trivy
chart: aqua/trivy-operator
values:
- values.yaml
テンプレートの生成
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm repo update
helmfile template --include-crds > ../../manifest/trivy/base/deployment.yaml
Trivy-Operatorのデプロイ
Argo CD アプリケーションの同期
前述のApp Of AppsパターンによりTrivy-OperatorをArgo CDアプリケーションとして定義したのでArgo CD上でそれを同期することでminikubeにTrivy-Operatorがデプロイされる
脆弱性のスキャン
タイミング
- DeploymentやServiceといったK8sリソースが作成されたとき
- 24時間ごとの再スキャン(report-ttl)
スキャン項目
スキャン項目 | 生成されるレポート | 検出項目の例 |
---|---|---|
コンテナイメージ | VulnerabilityReport | CVE |
レプリカセット定義 | ConfigAuditReport | root権限で実行されるコンテナ |
Scanner Pod
新しいリソースが作成されるとtrivy-operatorによりscan-vulnerabilityreport Podが生成されスキャンが実行される。
% k get pod -n trivy
NAME READY STATUS RESTARTS AGE
scan-vulnerabilityreport-69b8bc55db-2j44z 0/1 Init:0/1 0 5s
trivy-trivy-operator-5c6f7bcfc5-w6qh2 1/1 Running 0 8h
スキャン結果
既知の脆弱性を内包するnginx:1.16をためしにデプロイした。
Vulnerability Report
nginx:1.16のイメージでは40個のCriticalな脆弱性が検出された。
% k get vuln -n nginx -o wide
NAME REPOSITORY TAG SCANNER AGE CRITICAL HIGH MEDIUM LOW UNKNOWN
replicaset-nginx-5778d6df55-nginx library/nginx 1.16 Trivy 72s 40 111 137 132 8
VulnerabilityReportをdescribeすることで検出された脆弱性の詳細を確認できる。
% k describe vuln -n nginx replicaset-nginx-5778d6df55-nginx
Name: replicaset-nginx-5778d6df55-nginx
Namespace: nginx
...
Kind: VulnerabilityReport
...
Artifact:
Repository: library/nginx
Tag: 1.16
Os:
Family: debian
Name: 10.3
Registry:
Server: index.docker.io
Scanner:
Name: Trivy
Vendor: Aqua Security
Version: 0.48.1
Summary:
Critical Count: 40
...
Update Timestamp: 2024-01-06T10:34:24Z
Vulnerabilities:
Fixed Version: 1:1.2.11.dfsg-1+deb10u2
Installed Version: 1:1.2.11.dfsg-1
Last Modified Date: 2023-07-19T00:56:46Z
Links:
Primary Link: https://avd.aquasec.com/nvd/cve-2022-37434
Published Date: 2022-08-05T07:15:07Z
Resource: zlib1g
Score: 9.8
Severity: CRITICAL
Target:
Title: zlib: heap-based buffer over-read and overflow in inflate() in inflate.c via a large gzip header extra field
Vulnerability ID: CVE-2022-37434
Config Audit Report
- ReplicaSetのようなK8sオブジェクトのマニフェストに対するチェックが行われる
% kubectl get configaudit -n nginx -o wide
NAME SCANNER AGE CRITICAL HIGH MEDIUM LOW
replicaset-nginx-5778d6df55 Trivy 26m 0 1 3 11
- VulnerabilityReport同様、ConfigAuditReportをdescribeすることで検出された脆弱性の詳細を確認できる。
% kubectl describe configaudit -n nginx
Namespace: nginx
...
Kind: ConfigAuditReport
Owner References:
...
Name: nginx-5778d6df55
...
...
Report:
Checks:
...
Category: Kubernetes Security Check
Check ID: KSV104
Description: A program inside the container can bypass Seccomp protection policies.
Messages:
container nginx of replicaset nginx-5778d6df55 in nginx namespace should specify a seccomp profile
Severity: MEDIUM
Success: false
Title: Seccomp policies disabled
あとがき
Trivy-Operatorのデプロイにより享受できそうなメリット:
- アクティブなスキャンにより、管理者がK8sクラスタに内在する脆弱性に気づけるようになり、クリティカルな脆弱性が放置されにくくなる
- HIGHやMEDIUMの脆弱性にも目を通すことで計画的ななマニフェストの構成見直しやイメージアップデートの計画に役立つ