すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:kritis-validation-hook を使用したコンテナイメージ署名の検証

最終更新日:Nov 09, 2025

kritis-validation-hook コンポーネントは、信頼できるコンテナのデプロイメント中にコンテナイメージの署名を検証するための主要なコンポーネントです。デプロイメント前にコンテナイメージの署名を検証し、信頼できる認証局によって署名されたコンテナイメージのみがクラスターにデプロイされるようにすることで、環境内で予期しないコードや悪意のあるコードが実行されるリスクを低減します。このトピックでは、例を通じて kritis-validation-hook コンポーネントの動作を説明します。

前提条件

ACK マネージドクラスターまたは ACK 専用クラスターを作成済みであること。詳細については、「ACK マネージドクラスターの作成」または「ACK 専用クラスターの作成 (作成不可)」をご参照ください。

背景情報

kritis-validation-hook コンポーネントは、オープンソースの kritis ソフトウェアをベースに構築されており、Alibaba Cloud Container Registry (ACR) と深く統合されています。Alibaba Cloud Key Management Service (KMS) によって署名されたコンテナイメージの検証をサポートしています。Security Center、KMS、および ACR との緊密な連携により、kritis-validation-hook コンポーネントは完全に自動化されたコンテナイメージの署名と検証を実装し、より安全なクラスターランタイム環境の構築を支援します。コンテナイメージ署名を自動的に検証する方法の詳細については、「kritis-validation-hook コンポーネントを使用してコンテナイメージ署名を自動的に検証する」をご参照ください。

リソースアクセス権限の設定

kritis-validation-hook コンポーネントの正常な動作を保証するには、クラスターが使用する RAM ロールに次のリソースアクセス権限があることを確認する必要があります。

重要
  • ACK マネージドクラスターを使用している場合は、クラスターが使用する Worker RAM ロールに次のリソースアクセス権限があることを確認する必要があります。

  • ACK 専用クラスターを使用している場合は、クラスターが使用する Master RAM ロールと Worker RAM ロールの両方に次のリソースアクセス権限があることを確認する必要があります。

"cr:ListInstance",
"cr:ListMetadataOccurrences"

クラスターが使用する RAM ロールに上記のリソースアクセス権限がない場合は、次の方法で必要なリソースアクセス権限を追加できます。

  1. 次の内容でカスタムポリシーを作成します。詳細については、「ステップ 1: カスタムポリシーの作成」をご参照ください。

    {
        "Statement": [
            {
                "Action": [
                    "cr:ListInstance",
                    "cr:ListMetadataOccurrences"
                ],
                "Effect": "Allow",
                "Resource": "*"
            }
        ],
        "Version": "1"
    }
  2. クラスターの Worker RAM ロールに権限を付与します。詳細については、「ステップ 2: クラスターの Worker RAM ロールに権限を付与する」をご参照ください。

    説明

    ACK 専用クラスターの場合は、クラスターの Master RAM ロールにも上記の権限を付与する必要があります。

イメージ署名検証を有効にする例

次の例では、現在の [default] 名前空間でイメージ署名検証を有効にすることで、kritis-validation-hook コンポーネントの機能を示します。この例のイメージ署名情報は次のとおりです。[取得手順] 列の指示に従って、実際のイメージ署名情報に置き換えることができます。

署名情報

値の例

取得手順

対応する YAML フィールド

KMS 公開鍵 (base64)

LS0tLS1CRUdJTiBQ***

非対称キーの作成

spec.publicKeyData

KMS キー ID

key-4a2ef103-5aa3-4220-****

キーの作成

spec.publicKeyId

証明者名

demo-aa

証明者と署名検証ポリシーの設定

spec.noteReference

namespaces/demo-aa は、demo-aa という名前の証明者設定が参照されていることを示します。

署名済みイメージ

kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

N/A

N/A

説明

イメージ署名は kritis-validation-hook コンポーネントの範囲外であるため、この例では署名手順をスキップします。イメージ署名の詳細な手順については、「コンテナイメージへの署名」をご参照ください。

  1. AttestationAuthority を設定して、信頼できる認証局を宣言します。

    1. 次の内容で AttestationAuthority.yaml ファイルを作成します。

      apiVersion: kritis.grafeas.io/v1beta1
      kind: AttestationAuthority
      metadata:
        name: demo-aa
      spec:
        noteReference: namespaces/demo-aa
        publicKeyData: LS0tLS1CRUdJTiBQ***
        publicKeyId: key-4a2ef103-5aa3-4220-****
    2. 次のコマンドを実行して、信頼できる認証局情報を設定します。

      kubectl apply -f AttestationAuthority.yaml
  2. GenericAttestationPolicy を設定して署名検証ポリシーを宣言し、信頼できる認証局情報を使用して署名を検証します。

    1. 次の内容で GenericAttestationPolicy.yaml ファイルを作成します。

      apiVersion: kritis.grafeas.io/v1beta1
      kind: GenericAttestationPolicy
      metadata:
        name: demo-gap
      spec:
        attestationAuthorityNames:
        - demo-aa
    2. 次のコマンドを実行して、署名検証ポリシーを設定します。

      kubectl apply -f GenericAttestationPolicy.yaml
  3. 信頼できる認証局によって署名されていないイメージをデプロイして、イメージ署名検証機能をテストします。

    次のコマンドを実行して、イメージ署名検証機能をテストします。

    kubectl create deployment test-denied --image=anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

    期待される出力:

    error: failed to create deployment: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: "ACROpenAPIError detail: <image anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 is not attested because of get resource url for anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6: ListInstance failed, instanceName: "anolis", regionId: "cn-zhangjiakou", requstURL:error:****

    期待される出力から、イメージ署名検証機能が、信頼できる認証局によって署名されていないイメージのデプロイを拒否することがわかります。

  4. 信頼できる認証局によって署名されたイメージをデプロイして、イメージ署名検証機能をテストします。

    次のコマンドを実行して、イメージ署名検証機能をテストします。

    次のイメージアドレスを、実際の署名済みイメージに置き換えてください。
    kubectl create deployment test-allow --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

    期待される出力:

    deployment.apps/test-allow created

    期待される出力から、イメージ署名検証機能が、信頼できる認証局によって署名されたイメージのデプロイを許可することがわかります。

イメージ署名検証ホワイトリストの設定

ミドルウェアまたはサービスメッシュのシナリオでは、kritis-validation-hook コンポーネントは、イメージ署名検証ホワイトリストの設定をサポートしています。これにより、サードパーティコンポーネントによって自動的にインジェクトされた Sidecar コンテナイメージがイメージ署名検証に合格できず、Pod をデプロイできないという問題を解決します。このコンポーネントは、ホワイトリスト内のイメージの署名は検証せず、ホワイトリストにないイメージのみを検証します。

admissionallowlists.kritis.grafeas.io リソースを定義することで、イメージ署名検証ホワイトリストを設定できます。リソース定義の例は次のとおりです。

apiVersion: kritis.grafeas.io/v1beta1   # デフォルト値、変更不要。
kind: AdmissionAllowlist                # デフォルト値、変更不要。
metadata:
  name: kritis-allowlist                # リソース名、クラスター内で一意。
spec:
  patterns:                             # ホワイトリスト設定、複数のホワイトリストエントリを定義可能。
  - namePattern: 'registry*.*.aliyuncs.com/acs/*' # 無視するイメージ名、具体的なフォーマットは以下を参照。
  - namePattern: 'registry-vpc.cn-beijing.aliyuncs.com/arms-docker-repo/*'
    namespace: 'default'    # [オプション]、ホワイトリスト設定が適用される名前空間。設定しない場合、すべての名前空間に適用されます。

ACK システムイメージをホワイトリストに追加するには、次の手順で設定します。

  1. 次の内容で kritis-admission-allowlist-acs.yaml ファイルを作成し、ホワイトリストを設定します。

    apiVersion: kritis.grafeas.io/v1beta1
    kind: AdmissionAllowlist
    metadata:
      name: allow-acs-images
    spec:
      patterns:
      - namePattern: 'registry*.*.aliyuncs.com/acs/*'
      - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'

    namePattern の設定値は、完全一致とアスタリスク (*) 文字を使用した単純なワイルドカードマッチングをサポートしています。具体的な説明は次のとおりです。

    • 設定値にアスタリスク (*) 文字が含まれていない場合、設定値に基づいて完全一致が実行されます。たとえば、nginx:v0.1.0nginx:v0.1.0 にのみ一致します。

    • アスタリスク (*) 文字をワイルドカードマッチングに使用する場合、次の制限があります。

      • アスタリスク (*) が末尾にある場合、スラッシュ (/) を除く任意の文字に一致します。たとえば、a.com/nginx*a.com/nginx:v0.1.0 には一致しますが、a.com/nginx/test:v0.1.0 には一致しません。

      • アスタリスク (*) が末尾にない場合、文字、数字、ハイフン (-)、およびアンダースコア (_) に一致します。たとえば、registry-vpc.cn-*.aliyuncs.com/acs/pause:3.2registry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.2 の両方に一致します。

    一般的なホワイトリストエントリは次のとおりです。実際のニーズに応じて追加できます。

    # Container Service ACK で使用されるイメージ
    - namePattern: 'registry*.*.aliyuncs.com/acs/*'
    - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'
    
    # Container Service ACK で使用されるイメージ (中国リージョン限定)
    - namePattern: 'registry*.cn-*.aliyuncs.com/acs/*'
    - namePattern: 'registry-cn-*.ack.aliyuncs.com/acs/*'
    
    # ARMS で使用されるイメージ
    - namePattern: 'registry*.*.aliyuncs.com/arms-docker-repo/*'
    
    # ARMS で使用されるイメージ (中国リージョン限定)
    - namePattern: 'registry*.cn-*.aliyuncs.com/arms-docker-repo/*'
  2. 次のコマンドを実行して、ホワイトリストを設定します。

    kubectl apply -f kritis-admission-allowlist-acs.yaml 

    期待される出力:

    admissionallowlist.kritis.grafeas.io/allow-acs-images created
  3. 次のコマンドを実行して、ホワイトリストの設定が成功したことを確認します。

    kubectl get admissionallowlists.kritis.grafeas.io

    期待される出力:

    NAME               AGE
    allow-acs-images   2m22s