👮
KubernetesのマニフェストをCIで検査する方針を考える
このエントリーは 3-shake Advent Calendar 2022 17日目の記事です。
概要
以下の気持ちでKubernetesのマニフェストを検査するツールを選定しました。
- ベストプラクティスに則りたい
- 細かなレビューの手間を省きたい
- セキュリティリスクを排除したい
- 保守するのが大変なので出来るだけ自分でポリシーは書きたくない。書くとしても書きやすい方法で記述したい
検査ツールの選定
以下のツールからカテゴリ別に選定することにしました。
- スキーマ検査
- kubeval
- kubeconform
- セキュリティ・推奨設定
- バージョンチェック
- その他
- conftest
- https://github.com/open-policy-agent/conftest
- Regoを用いて独自に設定ファイル(yaml、jsonなど)の検査ができます
- 既存ツールではカバーしきれない場合に利用
- kubevious
- https://github.com/kubevious/kubevious
- クラスタの構成や設定が見れるグラフィカルなUIを提供
- 設定エラーの検出
- 独自の検査項目を追加できます
- 依存関係を表示し変更による連鎖的な影響を確認できます
- CIで使用するようなツールではないです
- conftest
結論
まず、結論として一通り調べた結果は以下になりました。
各ツールの概要については結論の後に記述してあります。
スキーマ検査
- kubeconformを採用
- 理由
- kubevalの方が優れている点を見つけることができず、後述しますがkubeconformはkubevalの正当進化版に位置するツールだと思います
セキュリティ・推奨事項
Argo Rolloutsを利用してない場合
- kicsを採用
- 理由
- 他ツールのほとんどの検査項目を包括しており網羅率が最も高いです
- kics単体でRegoで独自に検査したい項目を追加できconftestが不要です
- そして、以下の点からconftestよりも使いやすいです
- Metadataを記述できる
- テストしやすい
- Kubernetesのマニフェストを検査するための汎用的な関数が定義済み
- そして、以下の点からconftestよりも使いやすいです
Argo Rolloutsを利用している場合
- trivyを採用
- 理由
- kicsはArgo Rolloutsに対応してない項目が多々あります
- 検査はワークロードリソース周りが中心なので、Rolloutリソースが無視されると検査する意味が薄れます
- trivyもArgo Rolloutsに対応していませんが、簡単にRolloutにも検査を走らせられるようにできます
- セキュリティ関連の網羅率がArgo Rolloutsも検査可能なツールの中で一番高いです
- kubernetesのドキュメントのPodセキュリティの標準に書かれていることは網羅されています
- 推奨設定に関しては検査してくれないので、別途で独自に定義する必要があります
- polarisと併用することを考えましたが、重複していない項目の数が少ないので見送りました
- kicsと同様にtrivy単体でRegoで独自に検査したい項目を追加できconftestが不要です
- kicsはArgo Rolloutsに対応してない項目が多々あります
バージョンチェック
- セキュリティ・推奨事項でtrivyを採用している場合はtrivyを採用
- 理由
- kube-secやkicsは十分に検査できないです
- plutoは独自の検査バージョンを容易に追加できますが、trivyもRegoが書ければ同じことができます
- 理由
- セキュリティ・推奨事項でtrivyを採用していない場合はplutoを採用
- 理由
- バージョンチェックのためだけにtrivyを採用するのは重いので、十分に検査できかつ独自の検査バージョンを容易に追加できるplutoが良いかと思います
- 理由
各検査ツールについて
スキーマ検査
kubeval
- https://github.com/instrumenta/kubeval
- Kubernetes OpenAPIの仕様から生成されたスキーマを使用して検証
- 複数のバージョンのKubernetesのスキーマを検証可能
- 例えば、spec.containers[*].securityContextで指定すべき値がspec.securityContextで指定されていることを検出できます
kubeconform
- https://github.com/yannh/kubeconform
- kubevalに触発されて作成されており、kubevalに準拠しているが改良が加えられています
- 高性能
- 並列処理
- キャッシュ
- リモートとローカルの両方のスキーマを扱えます
- CRDの検証が可能
- オフラインで検証の可能
- 自動更新されるKubernetesのJSONのスキーマを利用します
- 最新のKubernetesのスキーマが保証されます
- スキーマはkubevalのものをフォークして使用しているが、GitHub Actionを使って毎日自動更新されるようになっています
- 下記のJSONをPythonスクリプトで整形しています
- https://raw.githubusercontent.com/kubernetes/kubernetes/master/api/openapi-spec/swagger.json
- https://github.com/yannh/kubernetes-json-schema/
- 高性能
- kubevalと同じくあくまでもOpenAPIの仕様に基づいて検証しているので、エラーを確実にカバーできるわけではないです
セキュリティ・推奨事項
kubesec
- https://github.com/controlplaneio/kubesec
- 検査項目
- Argo Rolloutsも対象
- Admission Controllerで検査可能
kube-linter
- https://github.com/stackrox/kube-linter
- 検査項目
- Argo Rolloutsは対象外
- 無視する検査項目を指定できます
- 検査項目を独自に定義可能
kube-score
- https://github.com/zegl/kube-score
- 検査項目
- Argo Rolloutsは対象外
- 無視する検査項目を指定できます
polaris
- https://github.com/FairwindsOps/polaris
- Fairwinds Ops, Inc のOSS
- https://www.fairwinds.com/polaris
- Enterprise版もあります
- 検査項目
- 種類
- 約22項目
- Argo Rolloutsも対象
- 無視する検査項目を指定できます
- 検査項目を独自に定義可能
- Admission Controllerで検査可能
trivy
-
Aqua Security Software LtdのOSS
-
ソフトウェアの脆弱性の包括的なスキャナー
- OSパッケージ(Alpine、RHEL、CentOSなど)の脆弱性の検出
- 言語固有のパッケージ(Bundler、Composer、npm、yarnなど)の脆弱性の検出
- TerraformやKubernetesなどのIaCファイルのセキュリティリスクのある設定の検出
-
1つの機能としてkubernetesマニフェストの検査があります
-
検索項目
- ポリシーはRegoで記述されていて defsec で管理されています
- 約90項目
- Pod Security Standards(PSS)やCISベンチマークに加えて信頼されたcontainer registryを利用しているかなどを検査します
- セキュリティ系以外は別で補う必要があります
-
Argo Rolloutsは対象外
- https://github.com/aquasecurity/defsec/blob/master/internal/rules/policies/kubernetes/lib/kubernetes.rego
- 判定のコードが関数として独立しているので、そこをオーバライドのようなことをすればRolloutも検査可能です
- 下記のファイルをpoliciesディレクトリに配置して引数で指定し実行します
package lib.kubernetes is_controller { kind = "Rollout" }
$ trivy conf —policy policies rollout.yaml
-
検査項目を独自に定義可能
- Regoで記述できるため、trivyを採用する場合はconftestが不要になります
- https://aquasecurity.github.io/trivy/v0.35/docs/misconfiguration/custom
- 加えて、conftestにはない有用な機能があります
- https://aquasecurity.github.io/trivy/v0.35/docs/misconfiguration/comparison/conftest
- Policy Metadata
- ポリシーの情報を細かく記述できます
- id、title、type、severity、description、url、recommended_actions
- Regoの言語仕様上、ポリシーが複数に分かれてしまうことがありますが、Metadataのおかげでグルーピングができて出力結果が見やすいです
kics
- https://github.com/Checkmarx/kics
- Checkmarx LtdのOSS
- セキュリティの脆弱性、コンプライアンスの問題、インフラの誤った設定の検出ができます
- https://docs.kics.io/latest
- Supported Platforms
- Kubernetes
- Terraform
- Ansible
- ...
- 検査項目(Kubernetes)
- Argo Rolloutsを対象にしていない項目が多々あります
- kindを指してコードが書かれています
- 検査項目を独自に定義可能
- https://docs.kics.io/latest/creating-queries
- conftest、trivyと同様にRegoでポリシーを記述できます
- conftestではできないMetadataの定義も可能です
- また、ポリシーのテストを簡単にわかりやすく実施できます
- OPA/Rego自体にポリシーをテストする機能があるので、どのツールを選択してもテスト自体を行うことは可能です
- ただ、kicsの場合は、テストコードを用意するのではなく成功と失敗のサンプルファイルとそれに対応する結果をjsonで定義するだけでテストできます
- trivyの場合のテストコード
- kicsの場合のテストコード(ファイル群)
- 汎用的な関数が定義されており、記述がしやすいです
- 導入方法
- Github Actions
- Gitlab CI
バージョンチェック
目的としては非推奨なapiVersionの検出です。
KubernetesのバージョンアップではカジュアルにapiVersionが非推奨になります。
apiVersionの修正は容易ですが修正対象を見つけることが少々面倒です。
api-serverのエラーに頼ろうとすると予期せぬapiVersionの変換が行われる可能性があります。
pluto
- https://github.com/FairwindsOps/pluto
- Fairwinds Ops, Inc のOSS
- 検査できるapiVersionの一覧
- 独自の検査バージョンを追加できます
trivy
- https://github.com/aquasecurity/trivy
- いち検索項目としてバージョンのチェックが備わっています
- 検査できるapiVersionの一覧
- Regoで記述すれば独自の検査バージョンを追加できます
kube-score
- https://github.com/zegl/kube-score
- いち検索項目としてバージョンのチェックが備わっています
- plutoやtrivyと比べると検査するapiVersionが少ないです
- https://github.com/zegl/kube-score/blob/master/score/stable/stable_version.go
- Deployment
- StatefulSet
- DaemonSet
- CronJob
- PodDisruptionBudget
- Ingress
- IngressClass
kics
- https://github.com/Checkmarx/kics
- いち検索項目としてバージョンのチェックが備わっています
- plutoやkube-scoreと違ってk8sのバージョンを指定できない
- plutoやtrivyと比べると検査するapiVersionが少ないです
- https://github.com/Checkmarx/kics/blob/master/assets/queries/k8s/object_is_using_a_deprecated_api_version/query.rego
- Deployment
- ReplicaSet
- StatefulSet
- DaemonSet
- Ingress
- IngressClass
- NetworkPolicy
- Role
- RoleBinding
- ClusterRole
- ClusterRoleBinding
まとめ
本記事は社内向けに半年以上前に執筆していたものを、ところどころ古い部分を修正して公開しているので、修正漏れがあるかもしれないのでその際はご一報ください🙇
今回はCIで検査する目的で選定したので言及してないですが、trivyにはoperatorがあり秋季インターンでインターン生が検証してくれているのでぜひ見てみてください!
Discussion