コンテナイメージ脆弱性管理ツールのKubeClarityを試してみる

KubeClarity とは

KubeClarityとはKubernetes環境におけるセキュリティ管理を支援するオープンソースツールです。 具体的にはKubernetes上に存在するコンテナイメージのSBOMを生成し、SBOMを元に脆弱性スキャンを行います。 そしてスキャン結果をWeb UI上で見ることができます。

SBOMの生成にはデフォルトではSyftが使用され、SBOMに対しての脆弱性スキャンにはGrypeがデフォルトで使用されます。

SBOMの生成には他にもCyclonedx-gomodTrivyが選択可能で、SBOMに対しての脆弱性スキャンは他にもDependency-TrackTrivyが選択可能です。

Trivy Operatorとの違い

似たようなツールとしてTrivy Operatorがあります。 Trivy OperatorもKubernetes上のコンテナイメージの脆弱性スキャンを自動で行ってくれるツールですが、Web UIがないという問題があります。 またTrivy Operatorは脆弱性スキャン結果をKubernetesのカスタムリソースとして保存しますが、KubeClarityはDB内に保存します。

Web UIがあるというのは非常に魅力的なので今回KubeClarityを試してみました。

方法インストール

今回はEKS上にインストールしてみました。

まずはeksctlを使ってEKSクラスタを作成します。

eksctl create cluster --name my-k8s --version 1.29 --nodegroup-name my-standard-workers --node-type t3.medium --nodes 2 --nodes-min 2 --nodes-max 2

次にOICDプロバイダーを作成します。

eksctl utils associate-iam-oidc-provider --cluster my-k8s --approve

KubeClarityは脆弱性情報の保存にDBを使います。KubeClarityがPostgreSQL Podを立ててくれますが、PersistentVolumeリソースが必要となります。 今回はPersistentVolumeリソースのストレージとしてEBSを使います。 もしEKS on Fargateをお使いの場合はEBSを選ぶことができずEFSを使うことになります。 (もしとりあえず動かしたいというだけならkubeclarity-kubeclarity-postgresql StatefuleSetのvolumeClaimTemplatesを消してemptyDirを使うようにすればEBS/EFSなしで動きます)

EKSからEBSを簡単に作成するために、Amazon EBS CSI ドライバーアドオンをEKSにインストールします。 アドオンをインストールする前に、アドオンが使うIAM RoleとServiceAccountを作成します。

eksctl create iamserviceaccount --name ebs-csi-controller-sa --namespace kube-system --cluster my-k8s --role-name "AmazonEKS_EBS_CSI_DriverRole" --role-only --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --approve

Amazon EBS CSI DriverアドオンをEKSにインストールします。 先ほど作成したIAM Roleを指定するのがポイントです。

eksctl create addon --name aws-ebs-csi-driver --cluster my-k8s --service-account-role-arn arn:aws:iam::アカウントID:role/AmazonEKS_EBS_CSI_DriverRole --force

アドオンがインストールされたことを確認します。

eksctl get addon  --cluster my-k8s
NAME            VERSION         STATUS  ISSUES  IAMROLE                             UPDATE AVAILABLE    CONFIGURATION VALUES
aws-ebs-csi-driver  v1.32.0-eksbuild.1    ACTIVE  0  arn:aws:iam::アカウントID:role/AmazonEKS_EBS_CSI_DriverRole
# EBS CSI DriverのPodが作成され、Runningになっていることを確認
kubectl get pod -n kube-system | grep ebs
ebs-csi-controller-76bd8c75-48zb5   6/6     Running   0          2m9s
ebs-csi-controller-76bd8c75-vkwbt   6/6     Running   0          2m9s
ebs-csi-node-gk27q                  3/3     Running   0          2m9s
ebs-csi-node-qptkt                  3/3     Running   0          2m9s

そしてhelmを使ってKubeClarityをインストールします。

helm repo add kubeclarity https://openclarity.github.io/kubeclarity

helm show values kubeclarity/kubeclarity > values.yaml

helm install --values values.yaml --create-namespace kubeclarity kubeclarity/kubeclarity -n kubeclarity

最後にKubeClarity関連のPodが正常に起動していることを確認します。

kubectl get pod -n kubeclarity
NAME                                                    READY   STATUS    RESTARTS   AGE
kubeclarity-kubeclarity-8499c4b89-k684s                 1/1     Running   0          3m13s
kubeclarity-kubeclarity-grype-server-7655bb8cc4-t8bhl   1/1     Running   0          3m13s
kubeclarity-kubeclarity-postgresql-0                    1/1     Running   0          3m12s

kubeclarity-kubeclarity-postgresql-0 Podが上手く起動しない場合は、PersistentVolume関連が原因なので、PersistentVolumeリソースやPersistentVolumeClaimリソースを確認してください。

kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                                   STORAGECLASS   VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-86f96475-b774-4806-98d3-cb0b68f9bd87   8Gi        RWO            Delete           Bound    kubeclarity/data-kubeclarity-kubeclarity-postgresql-0   gp2            <unset>                          52m

kubectl get pvc -n kubeclarity
NAME                                        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   VOLUMEATTRIBUTESCLASS   AGE
data-kubeclarity-kubeclarity-postgresql-0   Bound    pvc-86f96475-b774-4806-98d3-cb0b68f9bd87   8Gi        RWO            gp2            <unset>                 52m

機能、画面

インストールが終わったら、port forwardをして、

kubectl port-forward -n kubeclarity svc/kubeclarity-kubeclarity 9999:8080

http://localhost:9999 にアクセスすれば、KubeClarityの画面にアクセスできます。

まだコンテナイメージの脆弱性のスキャンがされていないので、No dataになっています。

コンテナイメージの脆弱性のスキャンをしてみます。左のメニューのRuntime Scanを選択します。

右上のSTART SCANをクリックすると、コンテナイメージの脆弱性のスキャンが開始されます。

開始するとscannerから始まるJobが生成されるのが分かります。 高速な脆弱性のスキャンをうたっているだけあって、スキャンはすぐに終わります。

kubectl get job -A
NAMESPACE     NAME                                                              COMPLETIONS   DURATION   AGE
kube-system   scanner-aws-ebs-csi-driver-cc8a87b7-0a19-4189-accd-96f2701d6967   0/1           1s         1s
kube-system   scanner-aws-network-policy-agent-26360aa8-8ed5-4af8-bf9a-a0a88e   0/1           3s         3s
kube-system   scanner-csi-attacher-45791186-ff68-4f5f-b6c0-20fcb4c6d473         0/1           2s         2s
kube-system   scanner-csi-node-driver-registrar-74381e91-0154-4e13-9b5a-2858c   0/1           1s         1s
kube-system   scanner-csi-provisioner-d4a9bb29-63b3-48f6-aacd-93083cda8394      0/1           2s         2s
kube-system   scanner-csi-snapshotter-775dafbc-51d9-48bf-8b1b-227a406bf907      0/1           2s         2s
kube-system   scanner-livenessprobe-e788ac28-c1a6-401c-9bf7-9637c3ab5a11        0/1           2s         2s
kubeclarity   scanner-curl-d56c1896-76e3-4458-b04a-31f5ea927cd7                 0/1           3s         3s
kubeclarity   scanner-grype-server-af023988-edb6-48a0-b482-aa9325941dd2         0/1           1s         1s
kubeclarity   scanner-kubeclarity-9a7e4d21-f680-41ac-baf0-5f740ccfb97b          0/1           2s         2s

kubectl get pod -A | grep scanner
kube-system   scanner-aws-network-policy-agent-26360aa8-8ed5-4af8-bf9a-aq5xbb   1/1     Terminating         0          14s
kube-system   scanner-coredns-caeeedce-278b-4361-b60b-82e00b34d087-7jc5r        1/1     Running             0          4s
kube-system   scanner-csi-attacher-45791186-ff68-4f5f-b6c0-20fcb4c6d473-4hd8t   1/1     Terminating         0          13s
kube-system   scanner-csi-node-driver-registrar-74381e91-0154-4e13-9b5a-5rm7h   1/1     Terminating         0          12s
kube-system   scanner-csi-provisioner-d4a9bb29-63b3-48f6-aacd-93083cda8379qf7   0/1     Terminating         0          13s
kube-system   scanner-csi-snapshotter-775dafbc-51d9-48bf-8b1b-227a406bf9h6v4r   0/1     Terminating         0          13s
kubeclarity   scanner-curl-d56c1896-76e3-4458-b04a-31f5ea927cd7-hfbmt           1/1     Terminating         0          14s
kubeclarity   scanner-grype-server-af023988-edb6-48a0-b482-aa9325941dd2-srszs   0/1     ContainerCreating   0          12s
kubeclarity   scanner-kubeclarity-sbom-db-f02478c3-9e91-45f4-b205-e61ff7w7rh5   1/1     Running             0          6s
kubeclarity   scanner-postgresql-aed65e35-bef9-4d98-9017-b72572583864-gmqrm     1/1     Running             0          2s

ちなみに、コンテナイメージの脆弱性のスキャンのスケジュール実行をすることもできます。 左のメニューからRuntime Scan画面に行き、右上のSchedule scanをおすと、スケジュール設定ができます。

脆弱性スキャンが終わったらこのようにProgressが100%になります。

Dashboard画面にいきますと、検知された脆弱性情報が表示されます。

こちらはApplications画面。 実行されているPodごとの脆弱性情報を見ることができます。

Podの脆弱性詳細画面です。

こちらはApplications Resources画面です。コンテナイメージごとの脆弱性情報を見ることができます。

こちらはPackages画面です。コンテナイメージに含まれているパッケージやライブラリごとの脆弱性情報を見ることができます。

こちらはVulnerabilities画面です。CVEごとにみることができます。 またCVEでの検索もできます。

脆弱性(CVE)詳細画面です。 脆弱性(CVE)についての説明やリンクが載っているのが嬉しいですね。

まとめ

EBSを使うのでEBSのスナップショット/リストアを考えないといけなく、その点は面倒ですが、 Web UIはとても見やすくて使いやすく出来ていました。 世の中を騒がす脆弱性が見つかった場合、うちのシステムは大丈夫なんだっけ?と調査が面倒になりますが、KubeClarityを入れていればWeb UI上から簡単にCVEを指定して脆弱性を検索できるのでとても有用そうですね。

業務ではTrivy Operatorを使っていますが、KubeClarityに乗り換えてもいいなと感じました。

ぜひみなさんもKubeClarityを使ってみてください。