Kubernetes クラスターでは、クラスターの セキュリティ O&M (Operation & Maintenance) での重要なパートの追跡および役割を行うため、apiserver 監査ログにより異なるユーザーの日常的な操作が記録されます。 このトピックでは、Alibaba Cloud Kubernetes cluster の apiserver 監査ログの設定を紹介し、Log Servcie を利用し、ログの収集および検索をどのように行うかを解説します。

apiserver 監査ログの設定

現在、apiserver 監査機能は Kubernetes クラスター作成時にデフォルトで有効化されます。 対応するパラメーターと説明は以下のようになります。
マスターノードにログインし、apiserver 設定ファイル /etc/kubernetes/manifests/kube-apiserver.yaml ディレクトリに移動します。
設定 説明
audit-log-maxbackup 監査ログの最大フラグメントは 10 個のログファイルを保存します。
audit-log-maxsize 1 つの監査ログサイズは最大で 100 MB です。
audit-log-path 監査ログ出力パスは /var/log/kubernetes/kubernetes.audit となります。
audit-log-maxage 監査ログの最長保存期間は 7 日です。
audit-policy-file 監査ログの設定ポリシーファイルです。 ディレクトリは /etc/kubernetes/audit-policy.yml となります。
マスターノードマシンにログインします。 監査ログ設定ポリシーファイルのディレクトリは、/etc/kubernetes/audit-policy.yml となります。 ファイルの内容は以下のようになります。
apiVersion: audit.k8s.io/v1beta1 # This is required.
kind: Policy
# We recommend that you do not generate audit events for all requests in RequestReceived stage.
omitStages:
  - "RequestReceived"
rules:
  # The following requests are manually identified as high-volume and low-risk.
  # Therefore, we recommend that you drop them.
  - 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: "" # core
        resources: ["configmaps"]
  - level: None
    users: ["kubelet"] # legacy kubelet identity
    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"]
  # We recommend that you do not log these read-only URLs.
  - level: None
    nonResourceURLs:
      - /healthz*
      - /version
      - /swagger*
  # We recommend that you do not log events requests.
  - level: None
    resources:
      - group: "" # core
        resources: ["events"]
  # Secrets, ConfigMaps, and TokenReviews can contain sensitive and binary data.
  # Therefore, they are logged only at the Metadata level.
  - level: Metadata
    resources:
      - group: "" # core
        resources: ["secrets", "configmaps"]
      - group: authentication.k8s.io
        resources: ["tokenreviews"]
  # Get repsonses can be large; skip them.
  - 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"
  # Default level for known APIs.
  - 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"
  # Default level for all other requests.
  - level: Metadata
  • リクエストを受信した後、すぐにはログは記録されません。 ログの記録はレスポンスボディヘッダーが送信された後にのみ開始されます。
  • 以下のリクエストまたは操作は監査されません。冗長 kube-proxy ウォッチリクエスト、Kubelet およびシステムノードからノードへの GET リクエスト、kube-system での kube コンポーネントによるエンドポイントで実行される操作、および名前空間に関する apiserver からの GET リクエストです。
  • /healthz*/version* および /swagger* などのような 読み取り専用 URL は監査されません。
  • シークレットのインターフェイスのログ、設定マップおよび tokenreviews はメタデータレベルには設定できません。これは重要な情報またはバイナリーファイルが含まれるためです。 このレベルのログでは、リクエストイベントのユーザー、タイプスタンプ、リクエストリソースおよびリクエストアクションのみが監査されます。 要求本文および応答本文は監査されません。
  • 認証、rbac、証明書、オートスケーリングおよびストレージなどの重要なインターフェイスに関しては、対応するリクエストボディおよびレスポンスボディが、リードリクエストおよびライトリクエストにより監査されます。

ログの収集と検索

Kube-apiserver 監査ログの使用前に、クラスターを作成し、対応するログプロジェクトおよび Logstoreが作成された際に Log Service が有効化されていることをご確認ください。

  1. [Log Service コンソール] にログインします。
  2. 左側のナビゲーションウィンドウから、[プロジェクト管理] をクリックし、クラスターを作成時に設定するプロジェクトを選択ます。それから、プロジェクト名をクリックします。
  3. [Logstore] ページで、"audit-${clusterid}" という名称の Logstore を探し、Logstore の右側の [検索] をクリックします。 クラスターの監査ログが "audit-${clusterid}" という名称の Logstore に保存されます。
    クラスターの作成処理では、"audit-${clusterid}" という名前の Logstore が自動的に指定したプロジェクトに追加されます。
  4. 以下の図で示すように、RAM ユーザーの操作の追跡のため、RAM ユーザー ID を入力し関連するログを検索します。
  5. 以下の図で示すように、指定した期間の指定したリソースオブジェクトの操作の追跡のため、リソース名を入力し関連するログを検索します。

サードパーティログソリューションの使用

クラスターのマスターノードにログインし、パス /var/log/kubernetes/kubernetes.audit で監査ログのソースファイルを検索できます。 ソースファイルは標準的な JSON フォーマットです。 クラスターのデプロイ時、監査ログの収集および検索のため Alibaba Cloud Log Service を使用する代わりに、他のログソリューションを利用できます。