2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

コンテナイメージ署名検証だけじゃない!Kyvernoの機能を整理してみよう

2
Posted at

はじめに

先日AWS SignerについてのLTをしてきました。

AWS Signerとは何か?については以下をご覧ください。

AWS Signer.png

このLTでは、署名の検証にKyvernoというOSSを使用しています。
LTの中でも紹介しましたが、このKyvernoというのはかなり多機能なポリシーエンジンで、コンテナイメージ検証の他、リソース制約やラベル検証など多くの機能を有しています。

Kyverno.png

本ブログでは、Kyvernoにどういった機能があるかを整理していきます。

Kyverno

Kyvernoとは

改めてKyvernoとは、Kubernetesで使用可能なポリシーエンジンで、YAML形式でルールを記載することができます。
Kubernetes Admission Webhookとして動作するため、クラスタへのリソース登録・更新・削除のタイミングにポリシーを適用できます。

なお、KyvernoはCNCF(Cloud Native Computing Foundation)のGraduatedプロジェクトです。GraduatedはCNCFのプロジェクトステージの中で最も成熟したステージを示すものであり、本番利用に耐えうるような信頼性が高いとされています。

CNCFのプロジェクト成熟度レベル

本記事のサンプルコードは、執筆時点で広く使われている"ClusterPolicy"形式(JMESPath記法)で記載しています。

ただし、Kyverno v1.17(2026年2月リリース)より"ClusterPolicy"および"Policy"は非推奨(Deprecated)となり、CEL(Common Expression Language)記法を使った新しいポリシータイプ("ValidatingPolicy"など)への移行が推奨されています。2026年中に削除予定とアナウンスされているため、新規で書く場合はCEL記法を選ぶことをおすすめします。

以下も併せてご覧ください。
参考: Kyverno 公式 Migration to CEL Guide

Kyvernoの主な機能

Kyvernoには大きく分けて以下の機能があります。

VerifyImages(署名検証)

コンテナイメージの署名を検証してくれます。LTではこの機能をメインで紹介しました。

信頼できる署名が付与されていないコンテナイメージのデプロイを拒否することができ、サプライチェーン攻撃などへの対策として非常に有効です。

AWS Signerとの組み合わせでは、"kyverno-notation-aws"というプラグインを使ってEKS上でこれを実現しています。詳細はLT資料をご覧ください。

VerifyImages(本章)とValidate(次章)について、日本語だとどちらも「検証」ですが、役割が異なります。

  • VerifyImages:コンテナイメージのデジタル署名を検証します。ECRなどのコンテナレジストリに問い合わせて「誰が署名したか」を確認してくれるため、マニフェストの内容検証とは仕組みが異なります。
  • Validate:KubernetesリソースのYAMLの内容を検証します。「latestタグが使われていないか」「必須ラベルがあるか」といったマニフェスト上のルールチェックをしてくれます。

Validate(検証)

リソースが特定のルールを満たしているかを検証します。満たしていない場合はデプロイを拒否することができます。

例えば、以下のようなことが実現できます。

  • "latest"タグのコンテナイメージのデプロイ拒否
  • セキュリティコンテキストの設定強制(root実行の禁止など)
  • 必須ラベルが設定されていないリソースの拒否
# 例: latestタグのコンテナイメージを拒否するポリシー
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: disallow-latest-tag
spec:
  validationFailureAction: Enforce
  rules:
    - name: require-image-tag
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "イメージタグの指定は必須です。"
        pattern:
          spec:
            containers:
              - image: "*:*"
    - name: validate-image-tag
      match:
        any:
          - resources:
              kinds:
                - Pod
      validate:
        message: "latestタグの使用は禁止されています。"
        pattern:
          spec:
            containers:
              - image: "!*:latest"

Mutate(変換)

リソースの内容を自動的に変換・補完してくれます。

例えば、以下のようなことが実現できます。

  • リソース作成時に自動でラベルやアノテーションを付与
  • デフォルト値の自動設定(リソース制約など)
  • サイドカーコンテナの自動注入
# 例: Podに自動でラベルを付与するポリシー
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-labels
spec:
  rules:
    - name: add-team-label
      match:
        any:
          - resources:
              kinds:
                - Pod
      mutate:
        patchStrategicMerge:
          metadata:
            labels:
              managed-by: kyverno

Generate(生成)

あるリソースの作成をトリガーに、別のリソースを自動生成してくれます。

例えば、以下のようなことが実現できます。

  • Namespace作成時に、デフォルトのNetworkPolicyやRBACリソースを自動生成
  • ConfigMapやSecretの自動コピー(他Namespaceへの配布)
# 例: Namespace作成時にNetworkPolicyを自動生成するポリシー
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: add-networkpolicy
spec:
  rules:
    - name: default-deny
      match:
        any:
          - resources:
              kinds:
                - Namespace
      generate:
        apiVersion: networking.k8s.io/v1
        kind: NetworkPolicy
        name: default-deny-ingress
        namespace: "{{request.object.metadata.name}}"
        synchronize: true
        data:
          spec:
            podSelector: {}
            policyTypes:
              - Ingress

Cleanup(クリーンアップ)

TTL(Time To Live)ベースでリソースを自動削除してくれます。

例えば、以下のようなことが実現できます。

  • テスト用Podを一定時間後に自動削除
  • 古くなったリソースの自動クリーンアップ
# 例: 作成から1時間後にPodを削除するポリシー
apiVersion: kyverno.io/v2beta1
kind: CleanupPolicy
metadata:
  name: cleanup-old-pods
spec:
  match:
    any:
      - resources:
          kinds:
            - Pod
          selector:
            matchLabels:
              temporary: "true"
  conditions:
    any:
      - key: "{{ time_since('', '{{ target.metadata.creationTimestamp }}', '') }}"
        operator: GreaterThanOrEquals
        value: 1h
  schedule: "*/5 * * * *"

Kyvernoのモード

"validationFailureAction"の設定によって、ポリシー違反時の挙動を変えることができます。

モード 挙動
"Enforce" ポリシー違反のリソースを拒否する
"Audit" ポリシー違反を記録するが、拒否はしない

最初は"Audit"モードで運用して既存リソースへの影響を確認し、問題がなければ"Enforce"に切り替えるというアプローチがよさそうですね。

おわりに

Kyvernoの機能を整理してみました。

Kyvernoはコンテナイメージ検証だけでなく、検証/変換/生成/クリーンアップと幅広い機能を持つポリシーエンジンです。「Kubernetes上でこういう制御をしたいな...」と思ったとき、Kyvernoで解決できるケースは多そうです。

近日、実際に各機能を試してみた記事も投稿予定ですので、お楽しみに~~!

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?