クラスターのコンプライアンス要件を満たし、セキュリティを強化するために、ポリシーガバナンス機能を有効にします。この機能は、Kubernetes コンテナアプリケーション向けのセキュリティポリシーライブラリを提供します。これには、Infra (インフラストラクチャ層リソース)、Compliance (Kubernetes コンプライアンス標準)、PSP (PodSecurityPolicy 機能の拡張)、K8s-general (一般ポリシー) などのカテゴリが含まれます。Container Service for Kubernetes (ACK) コンソールでコンテナアプリケーションのセキュリティポリシーを有効化またはカスタマイズして、Pod のデプロイと更新が安全かつ制御されていることを確認できます。
ポリシーガバナンス
Kubernetes v1.21 以降、PodSecurityPolicy (PSP) は非推奨となりました。これに対応して、ACK は元の PSP ベースのポリシー管理機能をアップグレードしました。Open Policy Agent (OPA) ポリシーを使用する Gatekeeper アドミッションコントローラー上に構築され、ACK はポリシーガバナンスステータス統計、ログレポート、ログ検索などの機能でこの機能を強化しています。ACK には、幅広い Kubernetes アプリケーションシナリオに合わせたルールを持つ豊富なポリシーライブラリも含まれています。これらのポリシーは、ACK コンソールのユーザーフレンドリなインターフェイスを通じて設定でき、ポリシーガバナンスの使用を簡素化します。
前提条件
-
クラスターは Kubernetes 1.16 以降を実行している必要があります。クラスターをアップグレードするには、「ACK クラスターの手動アップグレード」をご参照ください。
-
RAM ユーザーを使用してポリシーを管理する場合、RAM ユーザーに次の権限があることを確認してください:
-
cs:DescribePolicies:ポリシーライブラリ内のポリシーを一覧表示します。 -
cs:DescribePolicyDetails:ポリシーテンプレートの詳細を取得します。 -
cs:DescribePolicyGovernanceInCluster:クラスターのポリシーガバナンスの詳細を取得します。 -
cs:DescribePolicyInstances:クラスターにデプロイされているポリシーインスタンスを一覧表示します。 -
cs:DescribePolicyInstancesStatus:クラスター内の異なるポリシータイプに対するポリシーインスタンスのデプロイステータスを取得します。 -
cs:DeployPolicyInstance:指定されたクラスターにポリシーインスタンスをデプロイします。 -
cs:DeletePolicyInstance:指定されたクラスターのポリシーインスタンスを削除します。 -
cs:ModifyPolicyInstance:指定されたクラスターのポリシーインスタンスを変更します。
カスタム RAM ポリシーの作成方法の詳細については、「RAM を使用したクラスターとクラウドリソースへのアクセス権限の付与」をご参照ください。
-
ポリシーガバナンスコンポーネント
ACK は、マネージドバージョンと非マネージドバージョンの 2 種類のポリシーガバナンスコンポーネントを提供しています。1 つのクラスターで一度に有効にできるのは 1 種類のみです。次の表は、2 つのバージョンを比較したものです。
|
項目 |
マネージドバージョン |
非マネージドバージョン |
|
デプロイモード |
コントロールプレーンデプロイ:ACK はクラスターのコントロールプレーン上にコンポーネントをデプロイし、完全に管理します。 |
データプレーンデプロイ:コンポーネントはクラスター内のワークロードとしてデプロイされ、デフォルトで kube-system 名前空間にインストールされ、ワーカーノードの Pod リソースを消費します。 |
|
対象クラスター |
Auto Mode クラスター v1.30 以降 |
ACK マネージドクラスターおよびACK 専用クラスター v1.16 以降 |
|
起動パラメーター設定 |
システムがコンポーネントの起動パラメーターを設定し、カスタマイズはできません。 |
コンポーネントの起動パラメーターをカスタマイズできます。 |
|
コアコンポーネントのインストール |
ACK コンソールの アドオン管理 ページでは、マネージドバージョンのコンポーネントカードにマネージドアイコン |
|
|
ポリシーログ収集 |
ACK マネージドクラスターのコントロールプレーンコンポーネントのログを収集する機能を使用してログを収集し、指定された Log Service プロジェクトに送信します。 |
クラスターにログ収集コンポーネントをインストールしてログを収集し、指定された Log Service プロジェクトに送信します。 |
|
ポリシーライブラリ |
ACK の事前定義済みセキュリティポリシーのすべてのポリシー |
|
注意事項
-
この機能は Linux ノードにのみ適用されます。
-
この機能はカスタムポリシーをサポートしていません。すべてのルールは、組み込みの ACK ポリシーライブラリから取得する必要があります。
手順 1:ポリシーガバナンスのインストールまたはアップグレード
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
Policy ページで、画面の指示に従ってコンポーネントをインストールまたはアップグレードします。
ポリシーガバナンス機能を有効にするには、次のコンポーネントをインストールする必要があります。これらのコンポーネントは無料ですが、Pod リソースを消費します。
-
gatekeeper:OPA ポリシーエンジンに基づく Kubernetes ポリシーアドミッションコントローラーです。クラスターで OPA ポリシーを管理および適用し、名前空間ラベル管理などの機能を実装するのに役立ちます。
説明ACK が提供する gatekeeper コンポーネントを使用する必要があります。他のソースから gatekeeper コンポーネントをインストールした場合は、それをアンインストールしてから、ACK が提供するバージョンを再インストールしてください。gatekeeper コンポーネントのリリースノートの詳細については、「gatekeeper」をご参照ください。
-
ログ収集コンポーネント:ポリシー制約によって拒否またはフラグが立てられたリクエストのイベントを収集および取得します。
-
policy-template-controller:Alibaba Cloud ポリシーテンプレートに基づいて開発された Kubernetes コントローラーです。異なるポリシーテンプレートからデプロイされたポリシーインスタンスと、クラスターの全体的なガバナンスステータスをより良く管理するのに役立ちます。
-
手順 2:ポリシーガバナンスの使用
エントリポイント
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
Policy ページで、プロンプトが表示された場合は画面の指示に従ってコンポーネントをインストールまたはアップグレードし、必要に応じて操作を実行します。
ポリシー適用ステータスの表示
概要 タブをクリックして、クラスターの現在のポリシーガバナンスステータスを表示します。
-
ポリシー概要セクションには、高リスクおよび中リスクの保護ポリシーの総数、有効化されたポリシーの数、および有効化が推奨されるポリシーのリストが表示されます。
-
過去 7 日間の拒否されたリクエストとアラートの統計。
-
過去 7 日以内のポリシー適用レコードが表示されます。 テーブルには、デフォルトで、過去 7 日間に拒否されたリクエストまたはアラートの最新 100 件のログが表示されます。 より多くの監査ログを表示するには、過去 7 日間の操作 の横にある
アイコンをクリックし、表示されたポップアップウィンドウで Log Service リンクをクリックすると、Log Service コンソールの指定された Logstore ですべてのログを表示できます。 ページ下部にある [過去 7 日間のポリシー適用レコード] テーブルには、各ポリシーの 適用時間、ポリシータイプ、ポリシー名、ポリシーの説明、リスクレベル、アクション、および 詳細 が表示されます。 検索ボックスとフィルターボタンを使用して、特定のレコードを検索できます。
ポリシーインスタンスの作成と管理
マイポリシー タブをクリックし、ポリシーインスタンスの作成 をクリックします。ポリシーインスタンスの作成 ダイアログボックスで、パラメーターを設定します。
|
パラメーター |
説明 |
|
ポリシータイプ |
ポリシータイプを選択します。有効な値:
詳細については、「ACK の事前定義済みセキュリティポリシー」をご参照ください。 |
|
ポリシー名 |
選択したポリシータイプに基づいて、ドロップダウンリストからデプロイしたいポリシーテンプレートの名前を選択します。 |
|
操作 |
|
|
範囲 |
ポリシーインスタンスが適用されるクラスター内の名前空間を選択します。 |
|
パラメーター |
|
ポリシーとインスタンスの表示
マイポリシー タブをクリックして、クラスターでデプロイ可能なすべてのポリシーを表示します。
-
リストの右上隅で表示されるポリシーをフィルターできます。有効化されたポリシーが最初に表示されます。[インスタンス] 列には、クラスターに対応するポリシーでデプロイされたインスタンスの数が表示されます。
[インスタンス] 列の値が空の場合、そのポリシーはクラスターにデプロイされていません。Actions 列の 有効 をクリックしてパラメーターを設定し、ポリシーインスタンスをデプロイできます。
-
Actions 列の 編集 をクリックして、ポリシーインスタンスの設定を変更します。
ポリシーに複数のインスタンスがある場合は、Actions 列の ポリシーインスタンスを表示 をクリックし、目的のインスタンスで 編集 をクリックして変更します。
-
クラスターにデプロイされているポリシーのすべてのインスタンスを削除するには、Actions 列の 削除 をクリックします。
ポリシーの説明とテンプレートの例の詳細については、「ACK の事前定義済みセキュリティポリシー」をご参照ください。
関連操作
削除保護の有効化
手順 1:ポリシーガバナンスのインストールまたはアップグレードで説明されているように ポリシーガバナンス機能を有効にすると、重要なビジネスや機密データに関わる名前空間やサービスの削除保護を有効にして、誤削除を防ぐこともできます。削除保護が有効になっている場合、対応するリソースを削除する前に手動で無効にする必要があります。
このセクションでは、既存の名前空間に対して削除保護を有効にする方法を示します。他のリソースについてもプロセスは同様です。
-
既存の名前空間の削除保護を有効にする
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、名前空間とクォータ をクリックします。
-
名前空間のリストで、管理したい名前空間を見つけ、アクション 列の 編集 をクリックし、ダイアログボックスの画面の指示に従って削除保護を有効にします。
-
既存のサービスの削除保護を有効にする
ACK コンソールにログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
クラスターリスト ページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、 をクリックします。
-
「サービス」のリストで、管理するサービスを見つけ、アクション 列の
をクリックし、削除保護の有効化 をクリックします。その後、ダイアログボックスの画面の指示に従って削除保護を有効にします。
ack-policy-external-provider によるクロスリソース検証
デフォルトでは、Gatekeeper はレビュー中のオブジェクトのみに基づいてポリシー決定を行います。ただし、複雑なセキュリティシナリオでは、正確な適用のためにポリシーが他のクラスターリソースの状態を確認する必要があることがよくあります。
マネージドコンポーネント ack-policy-external-provider は、Gatekeeper の外部データソースとして機能し、ポリシー開発者が Rego コード内から Kubernetes リソースをクエリできるようにします。この機能は、組み込みの CRD 削除保護ポリシーなどの高度なポリシーに必要です。
ack-policy-external-provider コンポーネントは gatekeeper と一緒に使用する必要があります。クラスターに gatekeeper がデプロイされていることを確認してください。
ack-policy-external-provider のインストールと設定
ACK クラスターページで、対象クラスターの名前をクリックします。左側のナビゲーションウィンドウで、Add-ons をクリックします。
-
ack-policy-external-provider を検索し、画面の指示に従って設定を完了します。
-
ProviderPodNumber:コンポーネントインスタンスの数。
-
ProtectedKinds:保護したい CRD に対応するリソースタイプを追加します。
CRD の削除保護では、リソースタイプのインスタンスがクラスターに存在するかどうかを確認する必要があります。最小権限の原則に従い、ack-policy-external-provider はデフォルトで必要なクエリ権限を持っておらず、手動で設定する必要があります。
ProviderPodNumber (レプリカ数、デフォルト:
1) を設定します。ProtectedKinds セクションに、リソースタイプ名 (pods、policies、customresourcesなど) を入力します。[追加] をクリックして複数のエントリを追加するか、[削除] をクリックしてエントリを削除します。[OK] をクリックします。
-
API 定義とパラメーター
ack-policy-external-provider は、標準の Gatekeeper 外部データプロバイダーを実装しています。Rego ポリシーテンプレートでは、external_data 関数を呼び出し、provider: ack-policy-external-data-provider を指定することで、このコンポーネントにリソースクエリリクエストを送信できます。
リクエストパラメーターは JSON 形式で定義されます。以下にいくつかの例を示します。
// 例 1
{
"action": "ListK8sResource",
"namespaced": false,
"group": "",
"version": "v1",
"resource": "persistentvolumeclaims"
"requestID": review.uid,
"userInfo": review.userInfo,
"requestFrom": "PVCProtector",
"labelSelector": "protected",
"limit": 1
}
// 例 2
{
"action": "GetK8sResource",
"namespaced": true,
"namespace": "default",
"group": "apps",
"version": "v1",
"resource": "deployments",
"requestID": review.uid,
"userInfo": review.userInfo,
"requestFrom": "FinOpsPolicy",
"labelSelector": "protected",
"limit": 1
}
次の表は、コアパラメーターを説明しています。
|
パラメーター |
説明 |
必須 |
|
|
操作タイプ。サポートされている値は |
はい |
|
|
ターゲットリソースの API グループ。 |
はい |
|
|
ターゲットリソースの API バージョン。 |
いいえ |
|
|
ターゲットリソースの複数形名 (例: |
はい |
|
|
ターゲットリソースが名前空間内にあるかどうか。 クラスター全体のリソースには
|
はい |
|
|
|
いいえ |
|
|
|
いいえ |
|
|
Kubernetes のラベルセレクター構文に従って、ラベルに基づいてリソースをフィルターします。 |
いいえ |
|
|
|
いいえ |
|
|
リクエストの一意の ID。 |
いいえ |
|
|
リクエストを開始したユーザーに関する情報。 |
いいえ |
|
|
リクエストソースの識別子で、通常はポリシーテンプレートの名前です。ログトレースに使用されます。 |
はい |
例:CRD 削除の防止
この例では、ack-policy-external-provider を使用して、一般的な高度なポリシーを実装する方法を示します。それは、関連するカスタムリソース (CR) インスタンスがまだ存在する場合に、カスタムリソース定義 (CRD) の削除を禁止することです。
このポリシーは組み込みルールであり、手動でのデプロイは不要です。このセクションはデモンストレーションのみを目的としています。
-
ポリシーロジック
-
クエリ:Rego ポリシーは
external_dataを使用して ack-policy-external-provider を呼び出します。 -
チェック:リクエストパラメーターに基づき、ack-policy-external-provider コンポーネントはクラスターをクエリして、対応する CR インスタンスが存在するかどうかを確認します。
-
決定:クエリ結果が少なくとも 1 つの CR インスタンスを返した場合、ack-policy-external-provider は結果を Rego ポリシーに返し、ポリシーは最終的にこの削除操作を
deny(拒否) します。
-
-
ポリシーテンプレート (ConstraintTemplate)
ポリシーロジックを定義します。
apiVersion: templates.gatekeeper.sh/v1beta1 kind: ConstraintTemplate metadata: name: blockcrddeletion annotations: meta.helm.sh/release-name: gatekeeper meta.helm.sh/release-namespace: kube-system metadata.gatekeeper.sh/version: 1.0.0 labels: app.kubernetes.io/managed-by: Helm spec: crd: spec: names: kind: BlockCrdDeletion validation: legacySchema: true targets: - target: admission.k8s.gatekeeper.sh rego: | package block_crd_deletion violation[{"msg": msg}] { before(input.review.operation) response := handle(input.review) msg := after(response) } before(operation) { operation == "DELETE" } handle(review) = response { customrequest := { "action": "ListK8sResource", "namespaced": false, "group": review.object.spec.group, "version": "", "resource": review.object.spec.names.plural, "requestID": review.uid, "userInfo": review.userInfo, "requestFrom": "BlockCrdDeletion", "labelSelector": "protected", "limit": 1 } request_keys := [json.marshal(customrequest)] response := external_data({ "provider": "ack-policy-external-data-provider", "keys": request_keys }) } after(response) = msg { count(response.responses[0]) > 0 msg := sprintf( "The CRD %v is not allowed to be deleted. Reason: It is not allowed to delete a CRD object when it contains a collection of custom resources. Current existing custom resources: %v, etc.", [input.review.name, response.responses[0][0]] ) } -
ポリシーインスタンス (Constraint)
テンプレートを特定のリソースに適用します。この例では、ポリシーをすべての CRD に適用します。
apiVersion: constraints.gatekeeper.sh/v1beta1 kind: BlockCrdDeletion metadata: name: block-crd-deletion-rule spec: enforcementAction: deny match: kinds: - apiGroups: - '*' kinds: - CustomResourceDefinition -
結果の検証
-
テスト用の CRD と対応する CR インスタンスを作成します。
# CRD の作成 apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: simplestthings.example.com spec: group: example.com scope: Namespaced names: plural: simplestthings singular: simplestthing kind: SimplestThing versions: - name: v1 served: true storage: true schema: openAPIV3Schema: type: object properties: spec: type: object properties: message: type: string --- # CR インスタンスの作成 apiVersion: example.com/v1 kind: SimplestThing metadata: name: my-simple-thing namespace: default labels: protected: "false" spec: message: "Hello" -
CRD の削除を試みます。
kubectl delete crd simplestthings.example.com -
ポリシーが削除をブロックし、明確なエラーメッセージを返すことを確認します。
期待される出力:
Error from server (Forbidden): admission webhook "delete.validation.gatekeeper.sh" denied the request: [block-crd-deletion-rule] The CRD simplestthings.example.com is not allowed to be deleted. Reason: It is not allowed to delete a CRD object when it contains a collection of custom resources. Current existing custom resources: my-simple-thing, etc.
-
関連トピック
検査機能を使用すると、ワークロード設定のセキュリティリスクをスキャンできます。詳細については、「クラスターワークロードをチェックするための検査の設定」をご参照ください。