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 の有効化]** がデフォルトで選択されています。クラスター監査が無効になっている場合、以下の手順に従って有効化してください。
ACK コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで目的のクラスターを見つけ、その名前をクリックします。左側ナビゲーションウィンドウで、[セキュリティ] > [監査] を選択します。
[クラスター監査] ページで、[クラスター監査] タブをクリックします。
画面上の指示に従い、Simple Log Service プロジェクトを選択してクラスター監査を有効化します。
ステップ 2:監査ログレポートの表示
ACK では、4 種類の組み込み監査ログレポートが提供されています。[クラスター監査] ページで、名前空間または RAM ユーザーを指定して監査イベントをフィルターできます。
組み込みの監査ログレポートは変更しないでください。カスタマイズしたレポートを作成する場合は、Simple Log Service コンソールにログインし、新しいレポートを作成してください。
組み込みの監査ログレポートは変更しないでください。カスタム監査ログレポートを作成する場合は、Simple Log Service コンソールに移動して新しいレポートを作成してください。
任意のチャートの右上隅にある
アイコンをクリックすると、チャートを全画面表示で確認したり、クエリ文をプレビューしたりできます。
概要
現在のクラスターで発生したすべてのイベントを表示し、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 内の生の監査ログデータにアクセスします。
ACK コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで目的のクラスターを見つけ、その名前をクリックします。左側ナビゲーションウィンドウで、[クラスター情報] をクリックします。
[基本情報] タブで、[Log Service プロジェクト] の横にあるプロジェクト ID をクリックします。Logstore の一覧から、audit-${clusterid} という名前の Logstore をクリックします。
重要この Logstore にはインデックスが事前に設定されています。インデックスを変更すると、レポートの生成が停止するため、変更しないでください。
クエリ文を入力し、時間範囲(例: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 プロジェクトに移行するには、以下の手順を実行します。
ACK コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで目的のクラスターを見つけ、その名前をクリックします。左側ナビゲーションウィンドウで、[セキュリティ] > [監査] を選択します。
[クラスタ監査]タブで、[Log Service プロジェクトの変更]をクリックします。
クラスター監査の無効化
ACK コンソールにログインします。左側ナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、クラスターを見つけ、その名前をクリックします。 左側のナビゲーションウィンドウで、[セキュリティ] > [監査] を選択します。
[クラスター監査] タブで、[クラスター監査の無効化] をクリックします。
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 |
参考文献
コンテナ監査の有効化 — コンテナ内での
kubectl execコマンド実行を監査セキュリティ運用のベストプラクティス — 企業環境向けのセキュリティ運用ベストプラクティス