감사 및 로깅 - 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.5MiB입니다. 256KB보다 큰 로그 항목은 잘리거나 요청 메타데이터만 포함합니다.

감사 메타데이터 활용

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

의심스러운 이벤트에 대한 경보 생성

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

Log Insights를 사용하여 로그 분석

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 로그 감사

서비스 계정에 대한 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 Falcoekscloudwatch 실행을 고려할 수 있습니다. Falco는 감사 로그를 분석하고 장기간 이상 또는 남용에 플래그를 지정합니다. ekscloudwatch 프로젝트는 CloudWatch의 감사 로그 이벤트를 분석을 위해 Falco로 전달합니다. Falco는 사용자 고유의 추가 기능과 함께 기본 감사 규칙 세트를 제공합니다.

그러나 또 다른 옵션은 감사 로그를 S3에 저장하고 SageMaker Random Cut Forest 알고리즘을 사용하여 추가 조사가 필요한 비정상적인 동작을 수행하는 것입니다.

도구 및 리소스

다음과 같은 상용 및 오픈 소스 프로젝트를 사용하여 클러스터가 설정된 모범 사례에 부합하는지 평가할 수 있습니다.