監査ポリシー

このページでは、Google Kubernetes Engine の監査ロギング ポリシーについて説明します。

始める前に

このトピックを読む前に、次のトピックの資料の内容を把握しておく必要があります。

概要

Kubernetes Engine クラスタでは、Kubernetes API サーバーは、Kubernetes Engine が管理するバックエンドに監査ログエントリを書き込みます。Kubernetes Engine は Kubernetes API サーバーからログエントリを受け取ると、これらをプロジェクトの管理アクティビティ ログとデータアクセス ログに書き込みます。

プロジェクトの監査ログの表示内容は、2 つのポリシーにより変化します。

  • Kubernetes 監査ポリシーでは、イベントをログエントリとして記録するルールを定義します。また、ログエントリに含めるデータを指定します。

  • Kubernetes Engine 監査ポリシーでは、管理アクティビティ ログに書き込むエントリとデータアクセス ログに書き込むエントリを定義します。

Kubernetes の監査ポリシー

Kubernetes API サーバーは、kube-apiserver コマンドの --audit-policy-file フラグで指定されたポリシーに従います。

Kubernetes Engine が Kubernetes API サーバーを起動すると、--audit-policy-file フラグの値が設定され、監査ポリシー ファイルが提供されます。オープンソースの Kubernetes リポジトリには、監査ポリシー ファイルを生成する configure-helper.sh スクリプトがあります。スクリプトを直接見ると、監査ポリシー ファイルの大部分を確認できます。

イベントとステージ

ユーザーやコンポーネントから Kubernetes API サーバーへのリクエストが作成された場合、そのリクエストは 1 つ以上のステージを経て実行されます。

ステージ 説明
RequestReceived 監査ハンドラがリクエストを受信しました。
ResponseStarted レスポンス ヘッダーは送信されましたが、レスポンスの本文は送信されていません。
ResponseComplete レスポンスの本文が送信され、すべての送信処理が完了しました。
Panic サーバーで内部エラーが発生し、リクエストが完了していません。

リクエストの各段階では、ポリシーに従って処理されるイベントが生成されます。このポリシーは、イベントをログエントリとして記録するかどうか、およびその場合にどのデータをログエントリに含めるかを指定します。

監査レベル

Kubernetes の監査ポリシー ファイルには、ルールリストが含まれています。ポリシー ファイルでは、イベントに一致する最初のルールによりイベントの監査レベルが設定されます。

ルールでは、以下の監査レベルのいずれかが指定されます。

レベル 説明
None イベントのログエントリを作成しない。
Metadata ログエントリを作成する。メタデータは含めるがリクエストの本文またはレスポンスの本文は含めない。
Request ログエントリを作成する。メタデータとリクエストの本文は含めるがレスポンスの本文は含めない。
RequestResponse ログエントリを作成する。メタデータ、リクエストの本文、レスポンスの本文を含める。

ここで、ルールの例を示します。イベントがルールに一致する場合、Kubernetes API サーバーは Request レベルでログエントリを作成します。

- level: Request
  userGroups: ["system:nodes"]
  verbs: ["update","patch"]
  resources:
    - group: "" # core
      resources: ["nodes/status", "pods/status"]
  omitStages:
    - "RequestReceived"

次のすべてが該当する場合、イベントがルールに一致したと判断されます。

  • イベントがポリシー ファイル内の以前のルールと一致しない。
  • 呼び出し元の ID が system:nodes ユーザー グループ内に存在する。
  • 呼び出しが update リクエストか patch リクエストである。
  • リクエストが nodes/status リソースか pods/status リソースに存在する。
  • イベントが呼び出しの RequestReceived ステージに向けたものではない。

Kubernetes Engine クラスタ用 Kubernetes 監査ポリシーの概要

  • 一般に、createupdatedelete などの書き込みリクエストは RequestResponse レベルで記録されます。

  • 一般に、getlistwatch の各イベントは Metadata レベルで記録されます。

  • 一部のイベントは特殊なケースとして扱われます。特殊なケースとして扱われるリクエストの確定リストは、ポリシーのスクリプトを参照してください。現時点では、特殊なケースには以下のようなものがあります。

    • kubeletsystem:node-problem-detector による更新やパッチ リクエスト、nodes/status リソースや pods/status リソースの system:serviceaccount:kube-system:node-problem-detector は Request レベルで記録されます。

    • nodes/status リソースや pods/status リソースの system:nodes グループの任意の ID による更新やパッチ リクエストは、Request レベルで記録されます。

    • system:serviceaccount:kube-system:namespace-controller による deletecollection リクエストは、Request レベルで記録されます。

    • secrets リソース、configmaps リソース、tokenreviews リソースのリクエストは、Metadata レベルで記録されます。

  • ログに記録されないリクエストもあります。ログに記録されないリクエストの確定リストについては、ポリシー スクリプトlevel: None ルールをご覧ください。現時点では、以下のリクエストはログに記録されません。

    • system:kube-proxy による、endpointsservicesservices/status の各リソースの表示リクエスト。

    • kube-system 名前空間内の configmaps リソースの system:unsecured による Get リクエスト。

    • nodes リソースや nodes/status リソースの kubelet による Get リクエスト。

    • nodes リソースや nodes/status リソースの system:nodes グループ内の任意の ID による Get リクエスト。

    • kube-system 名前空間内の endpoints リソースの system:kube-controller-managersystem:kube-schedulersystem:serviceaccount:endpoint-controller による Get リクエストや update リクエスト。

    • namespacesnamespaces/statusnamespaces/finalize の各リソースの system:apiserver による Get リクエスト。

    • metrics.k8s.io グループの任意のリソースの system:kube-controller-manager による Get リクエストおよび list リクエスト。

    • /healthz*/version/swagger* に一致する URL へのリクエスト。

Kubernetes Engine の監査ポリシー

Kubernetes Engine が Kubernetes API サーバーからログエントリを受け取ると、独自のポリシーを適用して、プロジェクトの管理アクティビティ ログに書き込むエントリとデータアクセス ログに書き込むエントリを決定します。

ほとんどの場合、Kubernetes Engine は Kubernetes API サーバーから受け取ったログエントリに次のルールを適用します。

  • createdeleteupdate の各リクエストを表すエントリは、管理アクティビティ ログに書き込まれます。

  • getlistupdateStatus の各リクエストを表すエントリは、データアクセス ログに書き込まれます。

料金、およびデフォルトで有効になっているログの種類については、ロギングの詳細をご覧ください。

Kubernetes の監査ポリシー ファイルについて

Kubernetes Engine クラスタの場合、Kubernetes の監査ポリシー ファイルの冒頭には特定のイベントを記録しないように指定するルールが記述されています。たとえば、以下のルールでは nodes リソースや nodes/status リソースの kubelet による任意の get リクエストは記録しないように指定されています。None レベルでは、一致したイベントはログに記録されません。

- level: None
  users: ["kubelet"] # legacy kubelet identity
  verbs: ["get"]
  resources:
    - group: "" # core
    resources: ["nodes", "nodes/status"]

ポリシー ファイルでは、level: None ルールリストの後に特殊なケースのルールリストが記述されます。次の例は、Metadata レベルで特定のリクエストを記録するよう指示する特殊なケースのルールです。

- level: Metadata
    resources:
      - group: "" # core
        resources: ["secrets", "configmaps"]
      - group: authentication.k8s.io
        resources: ["tokenreviews"]
    omitStages:
      - "RequestReceived"

次のすべてが該当する場合、イベントがルールに一致したと判断されます。

  • イベントがポリシー ファイル内の以前のルールと一致しない。
  • リクエストがタイプ secretsconfigmapstokenreviews のリソースに対するものである。
  • イベントが呼び出しの RequestReceived ステージに向けたものではない。

ポリシー ファイルには、特殊なケースのルールリストの後に一般的なルールが複数記述されます。スクリプトの一般的なルールを見るには、${known_apis}known_apis の値を代入する必要があります。代入すると、ルールは次のようになります。

- level: Request
  verbs: ["get", "list", "watch"]
  resources:
    - group: "" # core
    - group: "admissionregistration.k8s.io"
    - group: "apiextensions.k8s.io"
    - group: "apiregistration.k8s.io"
    - group: "apps"
    - group: "authentication.k8s.io"
    - group: "authorization.k8s.io"
    - group: "autoscaling"
    - group: "batch"
    - group: "certificates.k8s.io"
    - group: "extensions"
    - group: "metrics.k8s.io"
    - group: "networking.k8s.io"
    - group: "policy"
    - group: "rbac.authorization.k8s.io"
    - group: "settings.k8s.io"
    - group: "storage.k8s.io"
  omitStages:
    - "RequestReceived"

このルールは、ポリシー ファイルの以前のルールと一致せず、その時点で RequestReceived ステージではないイベントに適用されます。このルールでは、Request レベルで、リストに記載されたいずれかのグループに属する任意のリソースに対する getlistwatch の各リクエストを記録します。

ポリシー ファイルの次のルールは、以下のようになります。

- level: RequestResponse
  resources:
    - group: "" # core
    - group: "admissionregistration.k8s.io"
    - group: "apiextensions.k8s.io"
    - group: "apiregistration.k8s.io"
    - group: "apps"
    - group: "authentication.k8s.io"
    - group: "authorization.k8s.io"
    - group: "autoscaling"
    - group: "batch"
    - group: "certificates.k8s.io"
    - group: "extensions"
    - group: "metrics.k8s.io"
    - group: "networking.k8s.io"
    - group: "policy"
    - group: "rbac.authorization.k8s.io"
    - group: "settings.k8s.io"
    - group: "storage.k8s.io"
  omitStages:
    - "RequestReceived"

このルールは、ポリシー ファイルの以前のルールと一致せず、その時点で RequestReceived ステージではないイベントに適用されます。特に、このルールは読み取りリクエストの getlistwatch には適用されません。このルールは createupdatedelete などの書き込みリクエストに適用されます。このルールでは、書き込みリクエストは RequestResponse レベルでログに記録されます。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント