

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 감사 및 로깅
<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).

[감사] 로그를 수집하고 분석하는 것은 다양한 이유로 유용합니다. 로그는 근본 원인 분석 및 속성, 즉 특정 사용자에 대한 변경 사항을 설명하는 데 도움이 될 수 있습니다. 충분한 로그가 수집되면 이상 동작을 감지하는 데에도 사용할 수 있습니다. 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.5MiB입니다. 1MB보다 큰 로그 항목은 잘리거나 요청 메타데이터만 포함됩니다.

### 감사 메타데이터 활용
<a name="_utilize_audit_metadata"></a>

Kubernetes 감사 로그에는 요청이 승인되었는지 여부와 결정 이유를 나타내는 두 개의 주석`authorization.k8s.io/decision`이 포함되어 있습니다`authorization.k8s.io/reason`. 이러한 속성을 사용하여 특정 API 호출이 허용된 이유를 확인합니다.

### 의심스러운 이벤트에 대한 경보 생성
<a name="_create_alarms_for_suspicious_events"></a>

경보를 생성하여 금지된 응답 403개와 승인되지 않은 응답 401개가 증가한 위치를 자동으로 경고한 다음 , `host` `sourceIPs`및와 같은 속성을 사용하여 해당 요청의 출처`k8s_user.username`를 확인합니다.

### Log Insights를 사용하여 로그 분석
<a name="_analyze_logs_with_log_insights"></a>

CloudWatch Log Insights를 사용하여 역할, RoleBindings, ClusterRoles 및 ClusterRoleBindings와 같은 RBAC 객체에 대한 변경 사항을 모니터링합니다. 다음은 몇 가지 샘플 쿼리입니다.

`aws-auth` ConfigMap에 대한 업데이트를 나열합니다.

```
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"]
```

Secrets에 대한 무단 읽기 작업을 도표화합니다.

```
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 [Random Cut Forest](https://docs.aws.amazon.com/sagemaker/latest/dg/randomcutforest.html) 알고리즘을 사용하여 추가 조사가 필요한 비정상적인 동작을 수행하는 것입니다.

## 도구 및 리소스
<a name="_tools_and_resources"></a>

다음과 같은 상용 및 오픈 소스 프로젝트를 사용하여 클러스터가 설정된 모범 사례에 부합하는지 평가할 수 있습니다.
+  [Amazon EKS Security Immersion 워크숍 - 탐지 제어](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 공통 구성 점수 시스템 프레임워크에 따라 클러스터에서 실행되는 워크로드에 위험 점수를 할당합니다.
+  [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/) 포함)에 따라 잘못된 구성을 감지합니다.