Trivy-OperatorでKubernetesクラスタに潜む脆弱性をスキャンする!

GitOps

この記事について

  • 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がデプロイされる
file

脆弱性のスキャン

タイミング

  • 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の脆弱性にも目を通すことで計画的ななマニフェストの構成見直しやイメージアップデートの計画に役立つ

リンク

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