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

Container Service for Kubernetes:kritis-validation-hookの紹介

最終更新日:Nov 17, 2024

kritis-validation-hookは、コンテナイメージのシグネチャを検証するために使用される重要なコンポーネントです。 署名検証を使用して、信頼できる機関によって署名されたイメージのみがクラスターにデプロイされるようにすることができます。 これにより、悪意のあるコード実行のリスクが軽減されます。 このトピックでは、kritis-validation-hookを使用して署名を検証する方法の例を示します。

前提条件

Container Service for Kubernetes (ACK) 管理またはACK専用クラスターが作成されます。 詳細については、「ACK管理クラスターの作成」および「ACK専用クラスターの作成」をご参照ください。

背景情報

kritis-validation-hookは、オープンソースプロジェクトのkritisに基づいて開発され、kritisと統合されています。

Container Registryを使用します。 kritis-validation-hookを使用して、によって署名された画像の署名を確認できます。 キー管理サービス (KMS) 。 kritis-validation-hookを一緒に使用することもできます。 セキュリティセンター、KMS、およびContainer Registryは、イメージ署名と署名検証を自動化します。 これにより、クラスターの安全な環境を構築できます。 コンテナイメージの自動署名検証を有効にする方法の詳細については、「kritis-validation-hookを使用してコンテナイメージの署名を自動的に検証する」をご参照ください。

クラスターによるリソースへのアクセス許可

kritis-validation-hookが正常に機能するようにするには、クラスターのResource Access Management (RAM) ロールに次の権限を付与する必要があります。

重要
  • ACK管理クラスターを使用する場合は、クラスターのワーカーRAMロールに次の権限を付与する必要があります。

  • ACK専用クラスターを使用する場合は、クラスターのマスターRAMロールとワーカーRAMロールに次の権限を付与する必要があります。

"cr:ListInstance",
"cr:ListMetadataOccurrences"

クラスターのRAMロールに上記の権限を付与する場合は、次の手順を実行します。

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

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

    説明

    ACK専用クラスターを使用する場合は、クラスターのマスターRAMロールに前述の権限を付与する必要があります。

ACKサーバーレスクラスターでkritis-validation-hookに必要なRAM権限を設定する

ACKサーバーレスクラスターには、マスターRAMロールまたはワーカーRAMロールがありません。 ACKサーバーレスクラスターでkritis-validation-hookに必要なRAM権限を設定するには、サービスアカウントのRAMロール (RRSA) 機能を使用する必要があります。 詳細については、「RRSAを使用して異なるポッドに異なるクラウドサービスへのアクセスを許可する」をご参照ください。

ack-ram-toolを使用して、kritis-validation-hookで必要なRRSA関連の設定を設定できます。 詳細については、「ack-ram-tool」をご参照ください。 次の操作を実行します。

説明

<clusterId> を、管理するクラスターのIDに置き換えます。

  1. 次のコマンドを実行して、クラスターのRRSA機能を有効にします。

    ack-ram-tool rrsa enable -c <clusterId>
  2. 次のコマンドを実行して、kritis-validation-hookに必要なRAM権限を設定します。

    ack-ram-tool rrsa setup-addon -a kritis-validation-hook -c <clusterId>

署名検証を有効にする方法の例

次の例は、kritis-validation-hookを使用してdefault名前空間の署名検証を有効にする方法を示しています。

説明

kritis-validation-hookを使用して画像に署名することはできないため、この例には画像の署名に関する詳細は含まれていません。 イメージ署名の詳細については、「コンテナーイメージの署名」をご参照ください。 次の情報は、この例で署名されているイメージのアドレスを指定します。 使用する画像のアドレスに置き換えます。

  • 署名された画像: kritis-demo *** .cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine@sha256:ddba4d27a7ffc3f86dd6c2f92041af252a1f23a8e742c90e6e1297bfa1bc0c45

    画像に不変タグが追加されていない場合は、画像のダイジェストを使用して画像を指定する必要があります。 詳細については、「リポジトリを不変にする設定」をご参照ください。

  • 画像の署名に使用される証人名 (画像署名キー): demo-aa。

  • cat publickey.txt | base64 | tr -d '\n' コマンドを実行して、Base64: LS0tLS1CRUdJTiBQ *** を使用してエンコードされた公開キーを生成します。

    KMSキーに対応する公開キーは、publickey.txtファイルに保存されます。

  • KMSキーのID: 4a2ef103-5aa3-4220-****

  1. AttestationAuthorityオブジェクトを作成して、信頼できる機関を宣言します。

    1. 次のテンプレートを使用して、AttestationAuthority.yamlという名前のファイルを作成します。

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

      kubectl apply -f AttestationAuthority.yaml
  2. を作成します。Create aGenericAttestationPolicyオブジェクトを使用して署名検証ポリシーを宣言し、信頼できる権限を使用してイメージ署名を検証します。

    1. 次のテンプレートを使用して、AttestationAuthority.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=alpine:3.11

      期待される出力:

      Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image alpine:3.11 is not attested
    • 次のコマンドを実行して、署名検証をテストします。

      kubectl create deployment test-denied --image=kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine:3.11

      期待される出力:

      Error from server: admission webhook "kritis-validation-hook-deployments.grafeas.io" denied the request: image kritis-demo***.cn-hangzhou.cr.aliyuncs.com/kritis-demo***/alpine:3.11 is not attested

    出力は、イメージが検証に合格しなかったことを示し、イメージからポッドを展開する要求は拒否されます。

  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を使用すると、署名検証ホワイトリストを設定できます。 署名検証ホワイトリストを設定した後、kritis-validation-hookは、ホワイトリストに含まれていない画像の署名のみを検証します。 ホワイトリストに含まれる画像の署名は検証されません。

admissionallollists. kritis.grafeas.ioリソースを定義することで、署名検証ホワイトリストを設定できます。 この例では, 次のリソースを定义します。

apiVersion: kritis.grafeas.io/v1beta1   # This is the default value. Do not change the value. 
kind: AdmissionAllowlist                # This is the default value. Do not change the value. 
metadata:
  name: kritis-allowlist                # The name of the resource. The name must be unique within the cluster. 
spec:
  patterns:                             # The content of the whitelist. You can add one or more images to the whitelist. 
  - namePattern: 'registry*.*.aliyuncs.com/acs/*' # The name of the image whose signature you do not want the system to verify. 
  - namePattern: 'registry-vpc.cn-beijing.aliyuncs.com/arms-docker-repo/*'
    namespace: 'default'    # Optional. The namespace to which the whitelist is applied. If you do not specify a namespace, the whitelist is applied to all namespaces.

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パラメーターは、アスタリスク (*) を使用して完全一致とファジー一致をサポートします。

    • namePatternの値にアスタリスクが含まれていない場合、完全一致が実行されます。 たとえば、nginx:v0.1.0の値はnginx: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の両方に一致します。

    次のリストは、ほとんどの場合ホワイトリストに追加できる画像を示しています。

    # Images used by ACK.
    - namePattern: 'registry*.*.aliyuncs.com/acs/*'
    - namePattern: 'registry-*.ack.aliyuncs.com/acs/*'
    
    # Images used by ACK in regions within China.
    - namePattern: 'registry*.cn-*.aliyuncs.com/acs/*'
    - namePattern: 'registry-cn-*.ack.aliyuncs.com/acs/*'
    
    # Images used by Application Real-Time Monitoring Service (ARMS).
    - namePattern: 'registry*.*.aliyuncs.com/arms-docker-repo/*'
    
    # Images used by ARMS in regions within China.
    - 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