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 となります。 |
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 が有効化されていることをご確認ください。
- [Log Service コンソール] にログインします。
- 左側のナビゲーションウィンドウから、[プロジェクト管理] をクリックし、クラスターを作成時に設定するプロジェクトを選択ます。それから、プロジェクト名をクリックします。
- [Logstore] ページで、"audit-${clusterid}" という名称の Logstore を探し、Logstore の右側の [検索] をクリックします。 クラスターの監査ログが "audit-${clusterid}" という名称の Logstore に保存されます。
注 クラスターの作成処理では、"audit-${clusterid}" という名前の Logstore が自動的に指定したプロジェクトに追加されます。
- 以下の図で示すように、RAM ユーザーの操作の追跡のため、RAM ユーザー ID を入力し関連するログを検索します。
- 以下の図で示すように、指定した期間の指定したリソースオブジェクトの操作の追跡のため、リソース名を入力し関連するログを検索します。
サードパーティログソリューションの使用
クラスターのマスターノードにログインし、パス /var/log/kubernetes/kubernetes.audit で監査ログのソースファイルを検索できます。 ソースファイルは標準的な JSON フォーマットです。 クラスターのデプロイ時、監査ログの収集および検索のため Alibaba Cloud Log Service を使用する代わりに、他のログソリューションを利用できます。