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

Container Service for Kubernetes:API サーバーの監査機能を活用してクラスター操作をセキュア化する

最終更新日:Mar 26, 2026

API サーバーは、すべての Kubernetes API リクエストおよび応答を監査ログとして記録します。ACK におけるクラスター監査機能により、クラスター管理者は操作履歴をトレースし、異常を調査し、セキュリティイベントをモニターできます。具体的には、「誰が」「どのリソースに対して」「いつ」操作を行ったかを特定できます。

対象:ACK マネージドクラスター、ACK 専用クラスター、ACK サーバーレスクラスター。

登録済みクラスターについては、「クラスター監査の活用」をご参照ください。

課金

監査ログの保存およびクエリは、Simple Log Service を通じて課金されます。課金明細は、請求書の概要ページでご確認いただけます。課金方法の詳細については、「機能別課金」および「請求書の確認」をご参照ください。

重要

ACK マネージドクラスターの監査ログはデフォルトで 30 日間保持され、ACK 専用クラスターの監査ログはデフォルトで 365 日間保持されます。長期保持を行うと、継続的なストレージコストが発生します。保持期間を変更する場合は、「Logstore の管理」をご参照ください。

前提条件

開始前に、Alibaba Cloud アカウント内の以下の Simple Log Service のクォータが十分であることをご確認ください。

  • Simple Log Service プロジェクト数のクォータ

  • 各 Simple Log Service プロジェクトにおける Logstore 数のクォータ

  • 各 Simple Log Service プロジェクトにおけるダッシュボード数のクォータ

クォータの確認または調整については、「リソースクォータの調整」をご参照ください。

ステップ 1:クラスター監査の有効化

クラスター作成時に、**[Log Service の有効化]** がデフォルトで選択されています。クラスター監査が無効になっている場合、以下の手順に従って有効化してください。

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

  2. [クラスター] ページで目的のクラスターを見つけ、その名前をクリックします。左側ナビゲーションウィンドウで、[セキュリティ][監査] を選択します。

  3. [クラスター監査] ページで、[クラスター監査] タブをクリックします。

  4. 画面上の指示に従い、Simple Log Service プロジェクトを選択してクラスター監査を有効化します。

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

ACK では、4 種類の組み込み監査ログレポートが提供されています。[クラスター監査] ページで、名前空間または RAM ユーザーを指定して監査イベントをフィルターできます。

重要

組み込みの監査ログレポートは変更しないでください。カスタマイズしたレポートを作成する場合は、Simple Log Service コンソールにログインし、新しいレポートを作成してください。

組み込みの監査ログレポートは変更しないでください。カスタム監査ログレポートを作成する場合は、Simple Log Service コンソールに移動して新しいレポートを作成してください。

任意のチャートの右上隅にある image.png アイコンをクリックすると、チャートを全画面表示で確認したり、クエリ文をプレビューしたりできます。

概要

現在のクラスターで発生したすべてのイベントを表示し、RAM ユーザーによる操作、インターネットアクセス、コマンド実行、リソース削除、シークレットへのアクセス、Kubernetes の共通脆弱性および曝露 (CVE) の検出状況について詳細な内訳を示します。

操作の概要

以下の 4 つのリソースカテゴリにおける、作成・更新・削除・アクセス操作の統計情報を表示します。

  • コンピューティングリソース:Deployment、StatefulSet、CronJob、DaemonSet、Job、Pod

  • ネットワークリソース:Service、Ingress

  • ストレージリソース:ConfigMap、Secret、PersistentVolumeClaim (PVC)

  • アクセス制御リソース:Role、ClusterRole、RoleBinding、ClusterRoleBinding

资源操作概览

操作の詳細

リソースタイプごとの操作詳細を提供します。リアルタイムでクエリを実行するため、リソースタイプを選択または入力してください。レポートには、操作回数の合計、名前空間別の分布、成功率、および時間経過に伴う操作傾向が表示されます。

资源操作详细列表
説明

CustomResourceDefinition (CRD) リソースや、このレポートにリストされていないリソースの操作をクエリする場合は、リソース名の複数形を入力してください。たとえば、AliyunLogConfig CRD の操作をクエリするには、AliyunLogConfigs を入力します。

CVE 脆弱性

現在のクラスターで検出された Kubernetes CVE 脆弱性を表示します。RAM ユーザー ID でフィルターして、特定のユーザーに結果を絞り込みます。CVE の詳細および修正方法については、「[CVE セキュリティ] CVE 脆弱性の修正」をご参照ください。

(任意)ステップ 3:詳細ログデータの表示

カスタムクエリおよびより深い分析を行うには、Simple Log Service 内の生の監査ログデータにアクセスします。

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

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

  3. [基本情報] タブで、[Log Service プロジェクト] の横にあるプロジェクト ID をクリックします。Logstore の一覧から、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

クエリ構文の完全版については、「クエリ方法」をご参照ください。

(任意)ステップ 4:アラート機能の設定

特定の操作が発生した際に、Simple Log Service からリアルタイムでアラートを送信するよう設定できます。サポートされる通知チャネルは、DingTalk チャットボット、カスタム Webhook、Alibaba Cloud メッセージセンターです。設定手順については、「Simple Log Service でのアラートルールの設定」をご参照ください。

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

この例では、ユーザーがコンテナ内でコマンドを実行した際にアラートを発行します。アラートには、コンテナ、コマンド、ユーザー、イベント 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 "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 "User account",
CASE WHEN json_array_length(sourceIPs) = 1 then json_format(json_array_get(sourceIPs, 0)) ELSE  sourceIPs END
as "Source IP address" order by "Time" desc  limit 10000

条件式:Event =~ ".*"

例 2:API サーバーのインターネットアクセス失敗に対するアラート

この例では、クラスターからのインターネットアクセスをモニターします。インターネットアクセスがしきい値(10 回)に達し、失敗率が 50 % を超えた場合にアラートが発行されます。アラートには、ソース IP のリージョン、ソース IP アドレス、および IP アドレスがリスクありと判定されているかどうかが含まれます。

クエリ文:

* | select ip as "Source IP address", total as "Number of times of Internet access", round(rate * 100, 2) as "Failure rate in percentage", failCount as "Number of times of illegal access", CASE when security_check_ip(ip) = 1 then 'yes' else 'no' end  as "Whether the IP address is risky",  ip_to_country(ip) as "Country", ip_to_province(ip) as "Province", ip_to_city(ip) as "City", ip_to_provider(ip) as "ISP" 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 '%,%' ORDER by "Number of times of Internet access" desc limit 10000

条件式:Source IP address =~ ".*"

次のステップ

Simple Log Service プロジェクトの変更

監査ログを別の Simple Log Service プロジェクトに移行するには、以下の手順を実行します。

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

  2. [クラスター] ページで目的のクラスターを見つけ、その名前をクリックします。左側ナビゲーションウィンドウで、[セキュリティ][監査] を選択します。

  3. クラスタ監査]タブで、[Log Service プロジェクトの変更]をクリックします。

クラスター監査の無効化

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

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

  3. [クラスター監査] タブで、[クラスター監査の無効化] をクリックします。

ACK 専用クラスターにおけるサードパーティ製ログサービスの利用

Simple Log Service の代わりにサードパーティ製ログサービスを利用するには、クラスター作成時に Simple Log Service の統合をスキップし、その後、サードパーティ製サービスを設定して監査ログを収集します。マスターノード上の監査ログのソースファイルは、JSON 形式で /var/log/kubernetes/kubernetes.audit にあります。

ACK 専用クラスター向けの監査構成

このセクションでは、ACK が専用クラスターに適用する kube-apiserver 監査構成について説明します。ACK マネージドクラスターおよび ACK サーバーレスクラスターは、ACK がコントロールプレーンを管理しており、手動による変更はサポートされていません。

監査ポリシー

監査ポリシーは、どのイベントを収集するか、およびその詳細レベルを定義します。イベントは、以下の 4 つの監査レベルに分類されます。

監査レベル収集内容
None何も収集しません。該当するイベントは記録されません。
Metadataリクエストメタデータのみ:ユーザー ID、タイムスタンプ、リソース、動詞。リクエストボディおよびレスポンスボディは収集されません。
Requestメタデータおよびリクエストボディ。レスポンスボディは収集されません。非リソースリクエストには適用されません。
RequestResponseメタデータ、リクエストボディ、およびレスポンスボディ。非リソースリクエストには適用されません。

--audit-policy-file フラグを設定して、kube-apiserver の起動構成として監査ポリシーを読み込みます。ポリシーファイルは、マスターノード上の /etc/kubernetes/audit-policy.yml に配置されています。以下はデフォルトポリシーです。

apiVersion: audit.k8s.io/v1 # 必須。Kubernetes のバージョンが 1.24 以降の場合は audit.k8s.io/v1、1.24 より前の場合は audit.k8s.io/v1beta1 を指定します。
kind: Policy
# RequestReceived ステージでは監査イベントを生成する必要はありません。
omitStages:
  - "RequestReceived"
rules:
  # 次の種類のリクエストは頻繁に発生し、リスクが低いため、これらのリクエストをスキップするために None ルールを設定することを推奨します。
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
      - group: "" # core
        resources: ["endpoints", "services"]
  - level: None
    users: ["system:unsecured"]
    namespaces: ["kube-system"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["configmaps"]
  - level: None
    users: ["kubelet"] # レガシな kubelet ID
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["nodes"]
  - level: None
    userGroups: ["system:nodes"]
    verbs: ["get"]
    resources:
      - group: "" # core
        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: "" # core
        resources: ["endpoints"]
  - level: None
    users: ["system:apiserver"]
    verbs: ["get"]
    resources:
      - group: "" # core
        resources: ["namespaces"]
  # /healthz*、/version*、/swagger* などの読み取り専用 URL については、None ルールを設定します。
  - level: None
    nonResourceURLs:
      - /healthz*
      - /version
      - /swagger*
  # イベントについては、None ルールを設定します。
  - level: None
    resources:
      - group: "" # core
        resources: ["events"]
  # 機密データまたはバイナリファイルを含む可能性がある Secret、ConfigMap、TokenReview API リクエストについては、Metadata ルールを設定します。
  - level: Metadata
    resources:
      - group: "" # core
        resources: ["secrets", "configmaps"]
      - group: authentication.k8s.io
        resources: ["tokenreviews"]
  # レスポンスには大量のデータが含まれる場合があります。レスポンスボディを収集しないようにするため、Request ルールを設定します。
  - level: Request
    verbs: ["get", "list", "watch"]
    resources:
      - group: "" # core
      - 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: "" # core
      - 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

デフォルトポリシーでは、以下のルールが適用されます。

  • None:kube-proxy の watch リクエスト;system:unsecured による kube-system 名前空間内の ConfigMap の GET;kubelet および system:nodes によるノードの GET;kube-controller-manager、kube-scheduler、endpoint-controller による kube-system 名前空間内のエンドポイントの GET/UPDATE;apiserver による名前空間の GET;読み取り専用 URL(/healthz*/version/swagger*);イベント

  • Metadata:Secret、ConfigMap、TokenReview リクエスト(機密データ);上記のルールに該当しないその他のすべてのリクエスト

  • Request:すべての主要な API グループにおける GET、list、watch 操作(データ量を抑えるため、レスポンスボディは除外)

  • RequestResponse:すべての主要な API グループにおけるその他の操作(リクエストおよびレスポンスボディを完全に収集)

説明

監査ログは、リクエスト受信時ではなく、レスポンスヘッダー送信時に生成されます。

監査バックエンド

監査イベントは、JSON 形式でマスターノードのファイルシステム上のログファイルに書き込まれます。API サーバーの構成ファイルは、マスターノード上の /etc/kubernetes/manifests/kube-apiserver.yaml にあります。以下のフラグで監査ログの保存を制御します。

フラグ説明デフォルト値
--audit-log-maxbackup保持する監査ログシャードの最大数10
--audit-log-maxsize個々の監査ログファイルの最大サイズ100 MB
--audit-log-path監査ログの出力パス/var/log/kubernetes/kubernetes.audit
--audit-log-maxage監査ログの保持期間7
--audit-policy-file監査ポリシーファイルのパス/etc/kubernetes/audit-policy.yml

参考文献