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: カスタムポリシーの作成」をご参照ください。
{ "Statement": [ { "Action": [ "cr:ListInstance", "cr:ListMetadataOccurrences" ], "Effect": "Allow", "Resource": "*" } ], "Version": "1" }クラスターの Worker RAM ロールに権限を付与します。詳細については、「ステップ 2: クラスターの Worker RAM ロールに権限を付与する」をご参照ください。
説明ACK 専用クラスターの場合は、クラスターの Master RAM ロールにも上記の権限を付与する必要があります。
イメージ署名検証を有効にする例
次の例では、現在の [default] 名前空間でイメージ署名検証を有効にすることで、kritis-validation-hook コンポーネントの機能を示します。この例のイメージ署名情報は次のとおりです。[取得手順] 列の指示に従って、実際のイメージ署名情報に置き換えることができます。
署名情報 | 値の例 | 取得手順 | 対応する YAML フィールド |
KMS 公開鍵 (base64) |
|
| |
KMS キー ID |
|
| |
証明者名 | demo-aa |
| |
署名済みイメージ |
| N/A | N/A |
イメージ署名は kritis-validation-hook コンポーネントの範囲外であるため、この例では署名手順をスキップします。イメージ署名の詳細な手順については、「コンテナイメージへの署名」をご参照ください。
AttestationAuthority を設定して、信頼できる認証局を宣言します。
次の内容で 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-****次のコマンドを実行して、信頼できる認証局情報を設定します。
kubectl apply -f AttestationAuthority.yaml
GenericAttestationPolicy を設定して署名検証ポリシーを宣言し、信頼できる認証局情報を使用して署名を検証します。
次の内容で GenericAttestationPolicy.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=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:****期待される出力から、イメージ署名検証機能が、信頼できる認証局によって署名されていないイメージのデプロイを拒否することがわかります。
信頼できる認証局によって署名されたイメージをデプロイして、イメージ署名検証機能をテストします。
次のコマンドを実行して、イメージ署名検証機能をテストします。
次のイメージアドレスを、実際の署名済みイメージに置き換えてください。
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 システムイメージをホワイトリストに追加するには、次の手順で設定します。
次の内容で
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.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の両方に一致します。
一般的なホワイトリストエントリは次のとおりです。実際のニーズに応じて追加できます。
# 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/*'次のコマンドを実行して、ホワイトリストを設定します。
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