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: カスタムポリシーの作成」をご参照ください。
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }
クラスターのワーカーロールに権限を付与します。 詳細については、「手順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に置き換えます。
次のコマンドを実行して、クラスターのRRSA機能を有効にします。
ack-ram-tool rrsa enable -c <clusterId>
次のコマンドを実行して、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-****
AttestationAuthorityオブジェクトを作成して、信頼できる機関を宣言します。
次のテンプレートを使用して、AttestationAuthority.yamlという名前のファイルを作成します。
apiVersion: kritis.grafeas.io/v1beta1 kind: AttestationAuthority metadata: name: demo-aa spec: noteReference: namespaces/demo-aa publicKeyData: LS0tLS1CRUdJTiBQ*** publicKeyId: 4a2ef103-5aa3-4220-****
次のコマンドを実行して、信頼できる機関を適用します。
kubectl apply -f AttestationAuthority.yaml
を作成します。Create aGenericAttestationPolicyオブジェクトを使用して署名検証ポリシーを宣言し、信頼できる権限を使用してイメージ署名を検証します。
次のテンプレートを使用して、AttestationAuthority.yamlという名前のファイルを作成します。
apiVersion: kritis.grafeas.io/v1beta1 kind: GenericAttestationPolicy metadata: name: demo-gap spec: attestationAuthorityNames: - demo-aa
次のコマンドを実行して、署名検証ポリシーを適用します。
kubectl apply -f GenericAttestationPolicy.yaml
指定された信頼できる機関によって署名されていないイメージを使用して、署名検証機能をテストします。
次のコマンドを実行して、署名検証をテストします。
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
出力は、イメージが検証に合格しなかったことを示し、イメージからポッドを展開する要求は拒否されます。
指定された信頼できる機関によって署名されたイメージを使用して、署名検証機能をテストします。
次のコマンドを実行して、署名検証をテストします。
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のシステムイメージをホワイトリストに追加するには、次の手順を実行します。
次のテンプレートを使用して、
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.2
はregistry-vpc.cn-hangzhou.aliyuncs.com/acs/pause:3.2
とregistry-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/*'
次のコマンドを実行して、ホワイトリストを設定します。
kubectl apply -f kritis-admission-allowlist-acs.yaml
期待される出力:
admissionallowlist.kritis.grafeas.io/allow-acs-images created
次のコマンドを実行して、ホワイトリストが有効かどうかを確認します。
kubectl get admissionallowlists.kritis.grafeas.io
期待される出力:
NAME AGE allow-acs-images 2m22s