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

Container Compute Service:クラスターの API Server 監査機能を使用してセキュリティ O&M を行う

最終更新日:Nov 09, 2025

API サーバーでの監査は、Kubernetes API へのリクエストとそのリクエストの結果を記録します。Alibaba Cloud Container Service for Kubernetes (ACK) は、API サーバーの監査ログを提供します。これらのログは、クラスター管理者が、いつ、誰が、どのリソースに対して、どの操作を実行したかを判断するのに役立ちます。ログを使用して、クラスター操作の履歴を追跡し、クラスターの問題をトラブルシューティングできます。これにより、クラスターのセキュリティ運用とメンテナンス (O&M) のワークロードが削減されます。

ステップ 1: クラスターの API Server 監査機能を有効にする

ACK クラスターを作成すると、API Server 監査機能を有効にするために、デフォルトで [Log Service の使用] が選択されます。この機能が有効になっていない場合は、次の手順に従って有効にしてください。

  1. ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、[セキュリティ] > [クラスター監査] を選択します。

クラスターロギングまたはクラスター監査が有効になっていない場合は、画面の指示に従って Simple Log Service (SLS) プロジェクトを選択し、機能を有効にします。

重要

アカウントの SLS リソースクォータを超えていないことを確認してください。超えている場合、クラスター監査機能を有効にできません。

  • SLS プロジェクト数のクォータ。

  • SLS プロジェクトあたりの Logstore 数のクォータ。

  • SLS プロジェクトあたりのダッシュボード数のクォータ。

SLS クォータとその調整方法の詳細については、「リソースクォータの調整」をご参照ください。

ステップ 2: 監査レポートの表示

重要

監査レポートは変更しないでください。監査レポートをカスタマイズするには、Simple Log Service コンソールで新しいレポートを作成できます。

ACK クラスターには、監査センターの概要、リソース操作の概要、リソース操作の詳細、Kubernetes CVE セキュリティリスクの 4 つの組み込み監査ログレポートがあります。[クラスター監査] ページでは、名前空間や Resource Access Management (RAM) ユーザーなどのディメンションを選択して監査イベントをフィルター処理し、レポートから次の情報を取得できます。

結果を取得した後、特定のエリアの右上隅にある image.png アイコンをクリックして、さらに操作を実行できます。たとえば、特定のエリアのチャートを全画面で表示したり、そのエリアのクエリ文をプレビューしたりできます。

監査センターの概要

監査センターの概要レポートには、ACK クラスター内のイベントの概要が表示され、重要なイベントの詳細が提供されます。重要なイベントには、RAM ユーザー操作、パブリックネットワークアクセス、コマンド実行、リソース削除、シークレットへのアクセス、Kubernetes CVE セキュリティリスクが含まれます。

リソース操作の概要

リソース操作の概要レポートには、ACK クラスター内の一般的なコンピューティング、ネットワーク、およびストレージリソースに対する操作に関する統計が表示されます。これらの操作には、作成、更新、削除、およびアクセスが含まれます。リソースには次のものが含まれます。

  • コンピューティングリソース: deployments、StatefulSets、jobs、CronJobs、pods、DaemonSets。

  • ネットワークリソース: services、Ingresses。

  • ストレージリソース: ConfigMaps、secrets、PersistentVolumeClaims。

  • アクセス制御リソース: Roles、ClusterRoles、RoleBindings、ClusterRoleBindings。

リソース操作の詳細

このレポートには、ACK クラスター内の特定のリソースタイプに対する操作の詳細なリストが表示されます。リアルタイムクエリを実行するには、リソースタイプを選択または入力する必要があります。レポートには、各リソース操作タイプのイベントの総数、名前空間の分布、成功率、時系列の傾向、および操作の詳細なリストが表示されます。

説明

Kubernetes に登録されているカスタムリソース定義 (CRD) リソースや、リストにない他のリソースに関連する操作を表示するには、リソース名の複数形を入力します。たとえば、CRD リソースが AliyunLogConfig の場合、AliyunLogConfigs と入力します。

Kubernetes CVE セキュリティリスク

このレポートには、クラスター内の潜在的な Kubernetes CVE セキュリティリスクが表示されます。リアルタイムクエリを実行するには、サブアカウント ID (RAM ユーザー ID) を選択または入力します。レポートには、指定されたアカウントの Kubernetes CVE セキュリティリスクが表示されます。CVE の詳細とソリューションについては、「[CVE セキュリティ] 脆弱性修正のお知らせ」をご参照ください。

(オプション) ステップ 3: 詳細なログレコードの表示

カスタムクエリを実行したり、監査ログを分析したりするには、Simple Log Service コンソールに移動して詳細なログレコードを表示できます。

説明

デフォルトでは、ACK クラスターの API サーバー監査ログに対応する Logstore 内のデータは 30 日間保持されます。保持期間を変更するには、「Logstore の管理」をご参照ください。

  1. ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけてその名前をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、[クラスター情報] をクリックします。

  3. [基本情報] タブをクリックします。クラスターリソース セクションで、Log Service Project の横にあるプロジェクト ID をクリックします。次に、プロジェクトリストで [audit-${clusterid}] という名前の Logstore をクリックします。

    クラスターの作成中に、指定された SLS プロジェクトに audit-${clusterid} という名前の Logstore が自動的に作成されます。

    重要

    インデックスは、デフォルトで監査 Logstore 用に構成されています。インデックスは変更しないでください。変更すると、レポートが無効になる場合があります。

  4. 検索ボックスにクエリ文を入力し、クエリの時間範囲 (たとえば、過去 15 分) を指定してから、[クエリ/分析] をクリックして結果を表示します。

    次のリストは、監査ログを検索する一般的な方法を説明しています。

    • RAM ユーザーの操作レコードをクエリするには、RAM ユーザー ID を入力して [クエリ/分析] をクリックします。

    • リソースに対する操作をクエリするには、クラスター内のコンピューティング、ネットワーク、ストレージ、またはアクセス制御リソースの名前を入力して [クエリ/分析] をクリックします。

    • システムコンポーネントの操作をフィルターで除外するには、NOT user.username: node NOT user.username: serviceaccount NOT user.username: apiserver NOT user.username: kube-scheduler NOT user.username: kube-controller-manager を入力して [クエリ/分析] をクリックします。

    クエリおよび統計メソッドの詳細については、「Simple Log Service のクエリおよび分析メソッド」をご参照ください。

(オプション) ステップ 4: アラートの設定

特定のリソースに対する操作についてリアルタイムのアラートが必要な場合は、Simple Log Service のアラート機能を使用できます。サポートされている通知方法には、DingTalk チャットボット、カスタム Webhook、通知センターなどがあります。詳細については、「ログベースのアラートをすばやく設定する」をご参照ください。

例 1: コンテナーでのコマンド実行に関するアラート

ある企業では、Kubernetes クラスターの使用に厳しい制限があり、ユーザーがコンテナーにログインしたり、コンテナー内でコマンドを実行したりすることを禁止しています。ユーザーがコマンドを実行した場合、すぐにアラートを送信する必要があります。アラート情報には、ユーザーがログインしたコンテナー、実行されたコマンド、オペレーター、イベント ID、時刻、およびソース IP アドレスを含める必要があります。

  • クエリ文:

    verb : create and objectRef.subresource:exec and stage:  ResponseStarted | SELECT auditID as "Event ID", date_format(from_unixtime(__time__), '%Y-%m-%d %T' ) as "Operation Time",  regexp_extract("requestURI", '([^\?]*)/exec\?.*', 1)as "Resource",  regexp_extract("requestURI", '\?(.*)', 1)as "Command" ,"responseStatus.code" as "Status Code",
     CASE 
     WHEN "user.username" != 'kubernetes-admin' then "user.username"
     WHEN "user.username" = 'kubernetes-admin' and regexp_like("annotations.authorization.k8s.io/reason", 'RoleBinding') then regexp_extract("annotations.authorization.k8s.io/reason", ' to User "(\w+)"', 1)
     ELSE 'kubernetes-admin' END  
     as "Operator Account", 
    CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE  sourceIPs END
    as "Source Address" order by "Operation Time" desc  limit 10000
  • 条件式: Operation Event =~ ".*"

例 2: API サーバーへのパブリックネットワークアクセスの失敗に関するアラート

あるクラスターでは、パブリックネットワークアクセスが有効になっています。悪意のある攻撃を防ぐには、アクセス試行回数と失敗率を監視する必要があります。アクセス試行回数が特定のしきい値 (たとえば 10) に達し、失敗率が特定のしきい値 (たとえば 50%) を超えた場合、すぐにアラートを送信する必要があります。アラート情報には、ユーザーの IP アドレスのリージョン、ソース IP アドレス、およびその IP アドレスがハイリスクであるかどうかの情報を含める必要があります。

  • クエリ文:

    * | select ip as "Source Address", total as "Access Count", round(rate * 100, 2) as "Failure Rate %", failCount as "Illegal Access Count", CASE when security_check_ip(ip) = 1 then 'yes' else 'no' end  as "Is High-Risk IP",  ip_to_country(ip) as "Country", ip_to_province(ip) as "Province", ip_to_city(ip) as "City", ip_to_provider(ip) as "Carrier" from (select CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE  sourceIPs END
    as ip, count(1) as total,
    sum(CASE WHEN "responseStatus.code" < 400 then 0 
    ELSE 1 END) * 1.0 / count(1) as rate,
    count_if("responseStatus.code" = 403) as failCount
    from log  group by ip limit 10000) where ip_to_domain(ip) != 'intranet' and ip not LIKE '%,%' and not try(is_subnet_of('<Your subnet IP address>')) ORDER by "Access Count" desc limit 10000
  • 条件式: Source Address =~ ".*"

関連操作

Log Project の変更

クラスターの API サーバー監査ログデータを別の SLS プロジェクトに移行するには、[SLS プロジェクトの変更] 機能を使用できます。

  1. ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、[セキュリティ] > [クラスター監査] を選択します。

  3. クラスター監査ページの右上隅にある Change Log Service Project をクリックして、クラスター監査ログデータを別の SLS プロジェクトに移行します。

クラスターの API Server 監査機能を無効にする

API Server 監査機能が不要になった場合は、無効にすることができます。

  1. ACS コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけてその ID をクリックします。クラスター詳細ページの左側のナビゲーションウィンドウで、[セキュリティ] > [クラスター監査] を選択します。

  3. [クラスター監査] ページの右上隅にある [クラスター監査の無効化] をクリックして、クラスターの監査機能を無効にします。

ACS クラスター内: サードパーティのロギングソリューションの使用

ACK クラスターの監査ログを記録するには、Alibaba Cloud Simple Log Service (SLS) を使用することをお勧めします。ただし、サードパーティのロギングサービスを使用する場合は、クラスターの作成時に SLS を使用しないことを選択できます。その後、別のロging ソリューションに接続して監査ログを収集および取得できます。

参考: ACK クラスターの API Server 監査設定の概要

ACK クラスターを作成してそのコンポーネントを設定すると、コンソールでデフォルトで [Log Service の使用] が選択されます。これにより、API Server 監査機能が有効になり、監査ポリシーに基づいてイベントデータが収集され、データがバックエンドに書き込まれます。

監査ポリシー

監査ポリシーは、監査機能の構成とリクエストを収集するためのルールを定義します。イベントログを収集するためのルールは、監査レベルによって異なります。次の監査レベルが利用可能です。

監査レベル

ログ収集ルール

なし

ルールに一致するイベントは収集されません。

メタデータ

ユーザー情報やタイムスタンプなどのリクエストのメタデータを収集しますが、リクエスト本文や応答本文は収集しません。

リクエスト

リクエストのメタデータと本文を収集しますが、応答本文は収集しません。これは非リソースリクエストには適用されません。

RequestResponse

メタデータ、リクエスト本文、および応答本文を収集します。これは非リソースリクエストには適用されません。

--audit-policy-file コマンドラインフラグを使用して、次のサンプル YAML ファイルを API サーバーの起動パラメーターとして保存できます。次のコードブロックは、監査ログ設定ポリシーのサンプル YAML ファイルを示しています。

サンプル YAML ファイルの表示

apiVersion: audit.k8s.io/v1 # 必須。Kubernetes v1.24 以降のクラスターでは値は audit.k8s.io/v1、それ以前のバージョンのクラスターでは audit.k8s.io/v1beta1 です。
kind: Policy
# RequestReceived ステージのリクエストに対して監査イベントを生成しません。
omitStages:
  - "RequestReceived"
rules:
  # 次のタイプのリクエストは頻繁であり、潜在的なリスクが低いです。監査をスキップするためにレベルを None に設定することをお勧めします。
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
      - group: "" # コア
        resources: ["endpoints", "services"]
  - level: None
    users: ["system:unsecured"]
    namespaces: ["kube-system"]
    verbs: ["get"]
    resources:
      - group: "" # コア
        resources: ["configmaps"]
  - level: None
    users: ["kubelet"] # レガシー kubelet ID
    verbs: ["get"]
    resources:
      - group: "" # コア
        resources: ["nodes"]
  - level: None
    userGroups: ["system:nodes"]
    verbs: ["get"]
    resources:
      - group: "" # コア
        resources: ["nodes"]
  - level: None
    users:
      - system:kube-controller-manager
      - system:kube-scheduler
      - system:serviceaccount:kube-system:endpoint-controller
    verbs: ["get", "update"]
    namespaces: ["kube-system"]
    resources:
      - group: "" # コア
        resources: ["endpoints"]
  - level: None
    users: ["system:apiserver"]
    verbs: ["get"]
    resources:
      - group: "" # コア
        resources: ["namespaces"]
  # /healthz*、/version*、/swagger* などの読み取り専用 URL については、監査をスキップするためにレベルを None に設定します。
  - level: None
    nonResourceURLs:
      - /healthz*
      - /version
      - /swagger*
  # イベントの監査をスキップするためにレベルを None に設定します。
  - level: None
    resources: 
      - group: "" # コア
        resources: ["events"]
  # Secrets、ConfigMaps、TokenReviews など、機密情報やバイナリファイルを含む可能性のあるインターフェイスについては、レベルを Metadata に設定します。
  - level: Metadata
    resources:
      - group: "" # コア
        resources: ["secrets", "configmaps"]
      - group: authentication.k8s.io
        resources: ["tokenreviews"]
  # リクエストは大量のデータを返す可能性があります。応答本文を収集しないように、レベルを Request に設定します。
  - level: Request
    verbs: ["get", "list", "watch"]
    resources:
      - group: "" # コア
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "extensions"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "settings.k8s.io"
      - group: "storage.k8s.io"
  # 既知の Kubernetes API については、リクエストと応答の本文を返すために、レベルはデフォルトで RequestResponse に設定されます。
  - level: RequestResponse
    resources:
      - group: "" # コア
      - group: "admissionregistration.k8s.io"
      - group: "apps"
      - group: "authentication.k8s.io"
      - group: "authorization.k8s.io"
      - group: "autoscaling"
      - group: "batch"
      - group: "certificates.k8s.io"
      - group: "extensions"
      - group: "networking.k8s.io"
      - group: "policy"
      - group: "rbac.authorization.k8s.io"
      - group: "settings.k8s.io"
      - group: "storage.k8s.io"
  # 他のすべてのリクエストについては、レベルはデフォルトで Metadata に設定されます。
  - level: Metadata
    説明

    ログはリクエストを受信した直後には記録されません。記録は応答ヘッダーが送信された後にのみ開始されます。

    システムは、冗長な kube-proxy watch リクエスト、kubelet および system:nodes からのノードに対する GET リクエスト、kube-system 名前空間で kube コンポーネントによって実行されるエンドポイント操作、または API サーバーからの名前空間に対する GET リクエストを監査しません。

    authenticationrbaccertificatesautoscalingstorage などの機密インターフェイスについては、システムは読み取りおよび書き込み操作に基づいて、対応するリクエスト本文と応答本文を記録します。

監査バックエンド

監査イベントが収集された後、それらはログバックエンドのファイルシステムに保存されます。ログファイルは標準の JSON フォーマットです。