コンテナイメージ脆弱性管理ツールのKubeClarityを試してみる
KubeClarity とは
KubeClarityとはKubernetes環境におけるセキュリティ管理を支援するオープンソースツールです。 具体的にはKubernetes上に存在するコンテナイメージのSBOMを生成し、SBOMを元に脆弱性スキャンを行います。 そしてスキャン結果をWeb UI上で見ることができます。
SBOMの生成にはデフォルトではSyftが使用され、SBOMに対しての脆弱性スキャンにはGrypeがデフォルトで使用されます。
SBOMの生成には他にもCyclonedx-gomod、Trivyが選択可能で、SBOMに対しての脆弱性スキャンは他にもDependency-Track、Trivyが選択可能です。
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を使ってみてください。