KB-001 Kubernetes API Audit Log
공격 행위 요약
ClusterDrain에서 공격자는 침해된 배포/운영 지점에서 확보한 kubeconfig로 Kubernetes API Server에 인증한 뒤, prod-platform namespace를 중심으로 리소스 조회, Secret 접근, Pod 내부 명령 실행, 수집 Pod 생성, RBAC 리소스 생성을 수행했다.
Metadata level audit log는 요청 본문과 응답 본문 전체를 남기지는 않지만, 요청 주체, 동작, 대상 리소스, namespace, requestURI, 응답 코드, 인가 결과를 확인할 수 있다.
로그 발생 위치
kubectl get, kubectl describe, kubectl exec, kubectl run, kubectl apply, kubectl create rolebinding 같은 요청은 Kubernetes API Server로 전달되며 audit event로 기록된다.
수집 방식
k3s API Server audit log를 파일로 생성하도록 설정하고, Elastic Agent custom log input으로 logs-* 인덱스에 적재한다. Kibana Discover에서는 data_stream.dataset:"sb05.kubernetes_audit" 조건으로 Kubernetes audit log만 필터링한다.
주요 탐지 포인트
| Technique | 탐지 기준 | KQL |
|---|---|---|
| T1613 Container and Resource Discovery | get 또는 list 요청이 여러 Kubernetes 리소스에 반복적으로 발생한다. Secret, ConfigMap, Ingress 같은 민감/구조성 리소스가 포함되면 우선 확인한다. | data_stream.dataset:"sb05.kubernetes_audit" and verb:("get" or "list") and responseStatus.code:200 and objectRef.resource:("namespaces" or "pods" or "deployments" or "services" or "ingresses" or "configmaps" or "secrets" or "endpoints" or "serviceaccounts" or "roles" or "rolebindings") |
| T1552.007 Unsecured Credentials: Container API | 업무 namespace에서 secrets 리소스에 대한 get 또는 list 요청이 성공한다. | data_stream.dataset:"sb05.kubernetes_audit" and objectRef.resource:"secrets" and objectRef.namespace:"prod-platform" and verb:("get" or "list") and responseStatus.code:200 |
| T1609 Container Administration Command | requestURI에 exec가 포함되고 업무 namespace의 Pod에 대한 요청이 성공한다. | data_stream.dataset:"sb05.kubernetes_audit" and requestURI:*exec* and objectRef.namespace:"prod-platform" and responseStatus.code:200 |
| T1610 Deploy Container | 업무 namespace에서 pods 리소스에 대한 create 요청이 성공한다. | data_stream.dataset:"sb05.kubernetes_audit" and objectRef.resource:"pods" and objectRef.namespace:"prod-platform" and verb:"create" and responseStatus.code:(200 or 201) |
| T1098.006 Additional Container Cluster Roles | 업무 namespace에서 serviceaccounts, roles, rolebindings 생성/수정 요청이 성공한다. | data_stream.dataset:"sb05.kubernetes_audit" and objectRef.resource:("serviceaccounts" or "roles" or "rolebindings") and objectRef.namespace:"prod-platform" and verb:("create" or "patch" or "update") and responseStatus.code:(200 or 201) |
추가 KQL
data_stream.dataset:"sb05.kubernetes_audit" and verb:("get" or "list") and responseStatus.code:200 and objectRef.namespace:"prod-platform" and objectRef.resource:("pods" or "deployments" or "services" or "ingresses" or "configmaps" or "secrets" or "endpoints" or "serviceaccounts" or "roles" or "rolebindings")
data_stream.dataset:"sb05.kubernetes_audit" and objectRef.resource:"pods" and objectRef.subresource:"exec" and objectRef.namespace:"prod-platform" and responseStatus.code:200
data_stream.dataset:"sb05.kubernetes_audit" and objectRef.resource:"rolebindings" and objectRef.namespace:"prod-platform" and verb:"create" and responseStatus.code:(200 or 201)
Investigation Pivot
objectRef.resource,objectRef.name,objectRef.namespace를 확인해 어떤 리소스가 조회되거나 변경되었는지 확인한다.user.username,userAgent,sourceIPs를 확인해 정상 운영자, 배포 자동화 계정, 침해된 운영 지점을 구분한다.- Secret 조회 이후 Pod exec, Pod 생성, RBAC 변경이 동일 주체 또는 동일 출발지에서 이어졌는지 확인한다.
- Pod 생성 또는 RBAC 변경이 승인된 배포 이력, 권한 변경 요청, 장애 대응 티켓과 일치하는지 확인한다.
- RBAC 변경이 Secret 조회, Pod 조회, ConfigMap 조회, Pod exec 권한 확장으로 이어졌는지 확인한다.
