監査とログ記録 - Amazon EKS

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

監査とログ記録

〔監査] ログの収集と分析は、さまざまな理由で役立ちます。ログは、根本原因の分析と属性、つまり特定のユーザーに変更を書き込むのに役立ちます。十分なログが収集されると、異常な動作を検出するためにも使用できます。EKS では、監査ログは Amazon Cloudwatch Logs に送信されます。EKS の監査ポリシーは次のとおりです。

apiVersion: audit.k8s.io/v1beta1 kind: Policy rules: # Log full request and response for changes to aws-auth ConfigMap in kube-system namespace - level: RequestResponse namespaces: ["kube-system"] verbs: ["update", "patch", "delete"] resources: - group: "" # core resources: ["configmaps"] resourceNames: ["aws-auth"] omitStages: - "RequestReceived" # Do not log watch operations performed by kube-proxy on endpoints and services - level: None users: ["system:kube-proxy"] verbs: ["watch"] resources: - group: "" # core resources: ["endpoints", "services", "services/status"] # Do not log get operations performed by kubelet on nodes and their statuses - level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"] # Do not log get operations performed by the system:nodes group on nodes and their statuses - level: None userGroups: ["system:nodes"] verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"] # Do not log get and update operations performed by controller manager, scheduler, and endpoint-controller on endpoints in kube-system namespace - 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"] # Do not log get operations performed by apiserver on namespaces and their statuses/finalizations - level: None users: ["system:apiserver"] verbs: ["get"] resources: - group: "" # core resources: ["namespaces", "namespaces/status", "namespaces/finalize"] # Do not log get and list operations performed by controller manager on metrics.k8s.io resources - level: None users: - system:kube-controller-manager verbs: ["get", "list"] resources: - group: "metrics.k8s.io" # Do not log access to health, version, and swagger non-resource URLs - level: None nonResourceURLs: - /healthz* - /version - /swagger* # Do not log events resources - level: None resources: - group: "" # core resources: ["events"] # Log request for updates/patches to nodes and pods statuses by kubelet and node problem detector - level: Request users: ["kubelet", "system:node-problem-detector", "system:serviceaccount:kube-system:node-problem-detector"] verbs: ["update", "patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived" # Log request for updates/patches to nodes and pods statuses by system:nodes group - level: Request userGroups: ["system:nodes"] verbs: ["update", "patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived" # Log delete collection requests by namespace-controller in kube-system namespace - level: Request users: ["system:serviceaccount:kube-system:namespace-controller"] verbs: ["deletecollection"] omitStages: - "RequestReceived" # Log metadata for secrets, configmaps, and tokenreviews to protect sensitive data - level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived" # Log requests for serviceaccounts/token resources - level: Request resources: - group: "" # core resources: ["serviceaccounts/token"] # Log get, list, and watch requests for various resource groups - 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: "scheduling.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived" # Default logging level for known APIs to log request and response - 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: "scheduling.k8s.io" - group: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived" # Default logging level for all other requests to log metadata only - level: Metadata omitStages: - "RequestReceived"

レコメンデーション

監査ログを有効にする

監査ログは、EKS によって管理される EKS マネージド Kubernetes コントロールプレーンログの一部です。Kubernetes API サーバー、コントローラーマネージャー、スケジューラのログと監査ログを含むコントロールプレーンログを有効または無効にする手順については、 を参照してくださいhttps://docs.aws.amazon.com/eks/latest/userguide/control-plane-logs.html#enabling-control-plane-log-export

注記

コントロールプレーンのログ記録を有効にすると、CloudWatch にログを保存するためのコストが発生します。これにより、継続的なセキュリティコストに関するより広範な問題が発生します。最終的には、これらのコストと、財務上の損失、評判の低下などのセキュリティ違反のコストを比較検討する必要があります。このガイドの推奨事項の一部のみを実装することで、環境を適切に保護できる場合があります。

警告

CloudWatch Logs エントリの最大サイズは 256KB ですが、Kubernetes API リクエストの最大サイズは 1.5 MiB です。256KB を超えるログエントリは切り捨てられるか、リクエストメタデータのみが含まれます。

監査メタデータを使用する

Kubernetes 監査ログには、リクエストが承認されたかどうかauthorization.k8s.io/decisionと、決定の理由を示す 2 つの注釈が含まれていますauthorization.k8s.io/reason。これらの属性を使用して、特定の API コールが許可された理由を確認します。

疑わしいイベントのアラームを作成する

403 Forbidden レスポンスと 401 Unauthorized レスポンスが増加した場合に自動的に警告するアラームを作成し、hostsourceIPs、 などの属性を使用して、これらのリクエストの送信元k8s_user.usernameを確認します。

Log Insights を使用してログを分析する

CloudWatch Log Insights を使用して、ロール、RoleBindings、ClusterRoles、ClusterRoleBindings などの RBAC オブジェクトへの変更をモニタリングします。いくつかのサンプルクエリが以下に表示されます。

ConfigMap aws-auth の更新を一覧表示します。

fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter verb in ["update", "patch"] | filter objectRef.resource = "configmaps" and objectRef.name = "aws-auth" and objectRef.namespace = "kube-system" | sort @timestamp desc

検証ウェブフックの新規作成または変更を一覧表示します。

fields @timestamp, @message | filter @logStream like "kube-apiserver-audit" | filter verb in ["create", "update", "patch"] and responseStatus.code = 201 | filter objectRef.resource = "validatingwebhookconfigurations" | sort @timestamp desc

ロールへの作成、更新、削除オペレーションを一覧表示します。

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="roles" and verb in ["create", "update", "patch", "delete"]

RoleBindings への作成、更新、削除オペレーションを一覧表示します。

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="rolebindings" and verb in ["create", "update", "patch", "delete"]

ClusterRoles への作成、更新、削除オペレーションを一覧表示します。

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterroles" and verb in ["create", "update", "patch", "delete"]

ClusterRoleBindings への作成、更新、削除オペレーションを一覧表示します。

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="clusterrolebindings" and verb in ["create", "update", "patch", "delete"]

シークレットに対する不正な読み取りオペレーションをプロットします。

fields @timestamp, @message | sort @timestamp desc | limit 100 | filter objectRef.resource="secrets" and verb in ["get", "watch", "list"] and responseStatus.code="401" | stats count() by bin(1m)

失敗した匿名リクエストのリスト:

fields @timestamp, @message, sourceIPs.0 | sort @timestamp desc | limit 100 | filter user.username="system:anonymous" and responseStatus.code in ["401", "403"]

CloudTrail ログの監査

サービスアカウントの IAM ロール (IRSA) を使用しているポッドによって呼び出される AWS APIs は、サービスアカウントの名前とともに CloudTrail に自動的に記録されます。API の呼び出しを明示的に許可されていないサービスアカウントの名前がログに表示された場合は、IAM ロールの信頼ポリシーの設定が間違っている可能性があります。一般的に、Cloudtrail は特定の IAM プリンシパルに AWS API コールを記述する優れた方法です。

CloudTrail Insights を使用して疑わしいアクティビティを発掘する

CloudTrail インサイトは、CloudTrail 証跡からの書き込み管理イベントを自動的に分析し、異常なアクティビティを警告します。これにより、IRSA を使用して IAM ロールを引き受けるポッドなど、AWS アカウントの書き込み APIs で呼び出しボリュームが増加するタイミングを特定できます。詳細については、CloudTrail Insights の発表: 異常な API アクティビティの特定と対応」を参照してください。

追加リソース

ログの量が増えると、Log Insights または別のログ分析ツールを使用してログを解析およびフィルタリングすると、無効になる可能性があります。別の方法として、Sysdig Falco ekscloudwatch の実行を検討することもできます。Falco は監査ログを分析し、長期間にわたって異常や不正にフラグを立てます。ekscloudwatch プロジェクトは、監査ログイベントを CloudWatch から Falco に転送して分析します。Falco には、デフォルトの監査ルールのセットと、独自の監査ルールを追加する機能が用意されています。

さらに別のオプションとして、監査ログを S3 に保存し、SageMaker ランダムカットフォレストアルゴリズムを使用して、さらなる調査を必要とする異常な動作を行うことが考えられます。

ツールとリソース

以下の商用プロジェクトとオープンソースプロジェクトを使用して、確立されたベストプラクティスとのクラスターの整合性を評価できます。