コンテンツにスキップ

Wallarm Dockerイメージ署名の検証

WallarmはDockerイメージ用の公開鍵に署名し、共有しています。これにより、イメージの信頼性を検証し、改竄されたイメージやサプライチェーン攻撃などのリスクを軽減できます。本記事では、Wallarm Dockerイメージの署名検証手順を説明します。

署名済みイメージの一覧

Wallarmは以下のDockerイメージに署名しています。

必要条件

Wallarm Dockerイメージの信頼性を担保するため、署名および検証にはCosignを使用します。

Dockerイメージの署名検証を実施する前に、ローカルマシンまたはCI/CDパイプライン内にCosignコマンドラインユーティリティをインストールしてください。

Dockerイメージ署名検証の実行

Dockerイメージ署名を検証するには、以下のコマンドを実行してください。なお、WALLARM_DOCKER_IMAGEの値は特定のイメージタグに置き換えてください。

export WALLARM_DOCKER_IMAGE="wallarm/ingress-controller:4.6.2-1"
cosign verify --key https://repo.wallarm.com/cosign.pub $WALLARM_DOCKER_IMAGE

出力には、イメージのダイジェストを含むdocker-manifest-digestオブジェクトが表示されます。例:

[{"critical":{"identity":{"docker-reference":"index.docker.io/<WALLARM_DOCKER_IMAGE>"},
"image":{"docker-manifest-digest":"<HASH_ALGORITHM>"},"type":"cosign container image signature"},
"optional":{"Bundle":{"SignedEntryTimestamp":"<VALUE>","Payload":{"body":"<VALUE>",
"integratedTime":<VALUE>,"logIndex":<VALUE>,"logID":"<VALUE>"}}}}]

Kubernetesポリシーエンジンを使用した署名検証

KyvernoやOpen Policy Agent (OPA)などのエンジンを使用すれば、Kubernetesクラスター内でDockerイメージの署名検証が可能です。検証用ルールを含むポリシーを作成すると、Kyvernoは定義された条件(リポジトリやタグなど)に基づいてイメージの署名検証を実行します。検証はKubernetesリソースのデプロイ時に行われます。

以下は、Kyvernoポリシーを使用してWallarm Dockerイメージ署名を検証する例です。

  1. クラスターにKyvernoをインストールし、全てのPodが正常に稼働していることを確認してください。

  2. 以下のKyverno YAMLポリシーを作成します:

    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: verify-wallarm-images
    spec:
      webhookTimeoutSeconds: 30
      validationFailureAction: Enforce
      background: false
      failurePolicy: Fail
      rules:
        - name: verify-wallarm-images
          match:
            any:
              - resources:
                  kinds:
                    - Pod
          verifyImages:
            - imageReferences:
                - docker.io/wallarm/ingress*
                - docker.io/wallarm/sidecar*
              attestors:
                - entries:
                    - keys:
                        kms: https://repo.wallarm.com/cosign.pub
    
  3. ポリシーを適用します:

    kubectl apply -f <PATH_TO_POLICY_FILE>
    
  4. 要件に応じて、WallarmのNGINX Ingress controllerまたはSidecar Controllerをデプロイします。デプロイ時にKyvernoポリシーがイメージ署名の検証を行います。

  5. 次のコマンドを実行し、検証結果を確認します:

    kubectl describe ClusterPolicy verify-wallarm-images
    

以下は署名検証状況の概要です:

Events:
  Type    Reason         Age                From               Message
  ----    ------         ----               ----               -------
  Normal  PolicyApplied  50s (x2 over 50s)  kyverno-admission  Deployment wallarm-sidecar/wallarm-sidecar-wallarm-sidecar-controller: pass
  Normal  PolicyApplied  48s                kyverno-admission  Pod wallarm-sidecar/wallarm-sidecar-wallarm-sidecar-controller-9dcfddfc7-hjbhd: pass
  Normal  PolicyApplied  40s (x2 over 40s)  kyverno-admission  Deployment wallarm-sidecar/wallarm-sidecar-wallarm-sidecar-postanalytics: pass
  Normal  PolicyApplied  35s                kyverno-admission  Pod wallarm-sidecar/wallarm-sidecar-wallarm-sidecar-postanalytics-554789546f-9cc8j: pass

提供されたverify-wallarm-imagesポリシーにはfailurePolicy: Failが設定されています。これは、署名認証が成功しない場合、チャート全体のデプロイが失敗することを意味します。