

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

# 監査とログ記録
<a name="auditing-and-logging"></a>

**ヒント**  
 Amazon EKS [https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el](https://aws-experience.com/emea/smb/events/series/get-hands-on-with-amazon-eks?trk=4a9b4147-2490-4c63-bc9f-f8a84b122c8c&sc_channel=el)ワークショップを通じてベストプラクティスをご覧ください。

[監査] ログの収集と分析は、さまざまな理由で役立ちます。ログは、根本原因の分析と属性、つまり特定のユーザーに変更を 書き込むのに役立ちます。十分なログが収集されると、異常な動作を検出するためにも使用できます。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"
```

## 推奨事項
<a name="_recommendations"></a>

### 監査ログを有効にする
<a name="_enable_audit_logs"></a>

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

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

**警告**  
CloudWatch Logs エントリの最大サイズは [1MB](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html) ですが、Kubernetes API リクエストの最大サイズは 1.5 MiB です。1MB を超えるログエントリは切り捨てられるか、リクエストメタデータのみが含まれます。

### 監査メタデータを使用する
<a name="_utilize_audit_metadata"></a>

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

### 疑わしいイベントのアラームを作成する
<a name="_create_alarms_for_suspicious_events"></a>

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

### Log Insights を使用してログを分析する
<a name="_analyze_logs_with_log_insights"></a>

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 ログの監査
<a name="_audit_your_cloudtrail_logs"></a>

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

### CloudTrail Insights を使用して疑わしいアクティビティを発掘する
<a name="_use_cloudtrail_insights_to_unearth_suspicious_activity"></a>

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

### その他のリソース
<a name="_additional_resources"></a>

ログの量が増えると、Log Insights または別のログ分析ツールを使用してログを解析およびフィルタリングすると、無効になる可能性があります。別の方法として、[Sysdig Falco ](https://github.com/falcosecurity/falco)と [ekscloudwatch](https://github.com/sysdiglabs/ekscloudwatch) の実行を検討することもできます。Falco は監査ログを分析し、長期間にわたって異常や不正にフラグを立てます。ekscloudwatch プロジェクトは、監査ログイベントを CloudWatch から Falco に転送して分析します。Falco は、[デフォルトの監査ルール](https://github.com/falcosecurity/plugins/blob/master/plugins/k8saudit/rules/k8s_audit_rules.yaml)のセットと、独自の監査ルールを追加する機能を提供します。

さらに別のオプションとして、監査ログを S3 に保存し、SageMaker [ランダムカットフォレスト](https://docs.aws.amazon.com/sagemaker/latest/dg/randomcutforest.html)アルゴリズムを使用して、さらなる調査を必要とする異常な動作を行うことが考えられます。

## ツールとリソース
<a name="_tools_and_resources"></a>

以下の商用プロジェクトとオープンソースプロジェクトを使用して、確立されたベストプラクティスとのクラスターの整合性を評価できます。
+  [Amazon EKS セキュリティイマージョンワークショップ - Detective Controls](https://catalog.workshops.aws/eks-security-immersionday/en-US/5-detective-controls) 
+  [kubeaudit](https://github.com/Shopify/kubeaudit) 
+  [kube-scan](https://github.com/octarinesec/kube-scan) Kubernetes Common Configuration Scoring System フレームワークに従って、クラスターで実行されているワークロードにリスクスコアを割り当てます。
+  [kubesec.io](https://kubesec.io/) 
+  [ポーラリス](https://github.com/FairwindsOps/polaris) 
+  [スターボード](https://github.com/aquasecurity/starboard) 
+  [Snyk](https://support.snyk.io/hc/en-us/articles/360003916138-Kubernetes-integration-overview) 
+  [Kubescape](https://github.com/kubescape/kubescape) Kubescape は、クラスター、YAML ファイル、Helm チャートをスキャンするオープンソースの kubernetes セキュリティツールです。複数のフレームワーク ([NSA-CISA](https://www.armosec.io/blog/kubernetes-hardening-guidance-summary-by-armo/?utm_source=github&utm_medium=repository) および [MITRE ATT&CK®](https://www.microsoft.com/security/blog/2021/03/23/secure-containerized-environments-with-updated-threat-matrix-for-kubernetes/) を含む) に従って設定ミスを検出します。