Wallarm Dockerイメージ署名の検証¶
WallarmはDockerイメージ用の公開鍵に署名し、共有しています。これにより、イメージの信頼性を検証し、改竄されたイメージやサプライチェーン攻撃などのリスクを軽減できます。本記事では、Wallarm Dockerイメージの署名検証手順を説明します。
署名済みイメージの一覧¶
Wallarmは以下のDockerイメージに署名しています。
-
wallarm/node 4.8.0-1以降:全てのWallarmモジュールを含み、Wallarm展開用のスタンドアロンアーティファクトとして提供されるNGINXベースのDockerイメージ
-
HelmチャートによるNGINXベースのIngress Controller展開で使用される全てのDockerイメージ:
-
HelmチャートによるSidecar展開で使用される全てのDockerイメージ:
-
wallarm/node-native-aio:Wallarmコネクタ向けのセルフホスト型Native Node展開用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イメージ署名を検証する例です。
-
クラスターにKyvernoをインストールし、全てのPodが正常に稼働していることを確認してください。
-
以下の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
-
ポリシーを適用します:
-
要件に応じて、WallarmのNGINX Ingress controllerまたはSidecar Controllerをデプロイします。デプロイ時にKyvernoポリシーがイメージ署名の検証を行います。
-
次のコマンドを実行し、検証結果を確認します:
以下は署名検証状況の概要です:
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
が設定されています。これは、署名認証が成功しない場合、チャート全体のデプロイが失敗することを意味します。