이 페이지에서는 Google Kubernetes Engine(GKE)의 감사 로깅 정책을 설명합니다. 다양한 유형의 감사 로그를 사용 설정하고 보는 방법과 필요한 IAM 권한은 GKE 감사 로깅 정보를 참조하세요.
시작하기 전에
이 항목을 읽기 전에 다음 항목의 자료를 숙지해야 합니다.
개요
GKE 클러스터에서 Kubernetes API 서버는 GKE에서 관리하는 백엔드에 감사 로그 항목을 씁니다. GKE는 Kubernetes API 서버에서 로그 항목을 수신하면 개발자 프로젝트의 관리자 활동 로그 및 데이터 액세스 로그에 기록합니다.
프로젝트의 감사 로그에 표시되는 내용에 영향을 주는 정책은 두 가지입니다.
Kubernetes 감사 정책은 로그 항목으로 기록되는 이벤트에 대한 규칙을 정의합니다. 또한 로그 항목에 포함될 데이터를 지정합니다.
GKE 감사 정책은 관리자 활동 로그에 기록되는 항목 및 데이터 액세스 로그에 기록되는 항목을 결정합니다.
데이터 액세스 로그에 기록되는 감사 로그는 감사 로그 구성에 따라 다릅니다. 데이터 액세스 로그는 Google Cloud Observability 가격 책정을 사용합니다. 관리자 활동 로그는 무료로 제공됩니다. GKE에서는 다음 유형의 데이터 액세스 로그를 지원합니다.
ADMIN_READ
: 포드 나열과 같은 Kubernetes 리소스에 대한 메타데이터를 읽는 작업입니다.DATA_READ
: 포드의 로그 읽기와 같이 Kubernetes 리소스에서 데이터를 읽는 작업입니다.DATA_WRITE
: 포드 상태 업데이트와 같은 Kubernetes 리소스에 데이터를 쓰는 작업입니다.
자세한 내용은 데이터 액세스 감사 로그 구성을 참조하세요.
Kubernetes 감사 정책
Kubernetes API 서버는 kube-apiserver 명령어의 --audit-policy-file
플래그에 지정된 정책을 따릅니다.
GKE에서 Kubernetes API 서버를 시작할 때 --audit-policy-file
플래그 값을 설정하여 감사 정책 파일을 제공합니다. 오픈소스 Kubernetes 저장소에 감사 정책 파일을 생성하는 configure-helper.sh 스크립트가 표시됩니다. 스크립트를 직접 조사하여 감사 정책 파일을 대부분 확인할 수 있습니다.
이벤트 및 단계
사용자 또는 구성요소가 Kubernetes API 서버에 요청을 수행하면 요청이 하나 이상의 단계를 통과합니다.
단계 | 설명 |
---|---|
RequestReceived | 감사 핸들러가 요청을 수신했습니다. |
ResponseStarted | 응답 헤더가 전송되었지만 응답 본문이 전송되지 않았습니다. |
ResponseComplete | 응답 본문이 완료되었고 더 이상 바이트가 전송되지 않습니다. |
Panic | 내부 서버 오류가 발생했습니다. 요청이 완료되지 않았습니다. |
요청의 각 단계마다 이벤트가 생성되고, 정책에 따라 처리됩니다. 이 정책은 이벤트를 로그 항목으로 기록할지 여부를 지정하고, 기록 시 로그 항목에 포함할 데이터를 지정합니다.
감사 수준
Kubernetes 감사 정책 파일에는 규칙 목록이 포함됩니다. 정책 파일에서 이벤트와 일치하는 첫 번째 규칙에 따라 해당 이벤트의 감사 수준이 설정됩니다.
규칙은 다음과 같은 감사 수준 중 하나를 지정할 수 있습니다.
수준 | 설명 |
---|---|
None | 이벤트에 대해 로그 항목을 만들지 않습니다. |
Metadata | 로그 항목을 만듭니다. 메타데이터를 포함하지만, 요청 본문 또는 응답 본문을 포함하지 않습니다. |
Request | 로그 항목을 만듭니다. 메타데이터와 요청 본문을 포함하지만 응답 본문을 포함하지 않습니다. |
RequestResponse | 로그 항목을 만듭니다. 메타데이터, 요청 본문, 응답 본문을 포함합니다. |
규칙 예시는 다음과 같습니다. 이벤트가 규칙과 일치하면 Kubernetes API 서버가 Request
수준에서 로그 항목을 만듭니다.
- level: Request userGroups: ["system:nodes"] verbs: ["update","patch"] resources: - group: "" # core resources: ["nodes/status", "pods/status"] omitStages: - "RequestReceived"
이벤트가 규칙과 일치하려면 다음 조건이 모두 충족되어야 합니다.
- 이벤트가 정책 파일에 있는 이전 규칙과 일치하지 않습니다.
- 호출을 수행하는 ID가
system:nodes
사용자 그룹에 있습니다. - 호출이
update
요청 또는patch
요청입니다. nodes/status
리소스 또는pods/status
리소스에 대한 요청입니다.- 이벤트가 호출의
RequestReceived
단계가 아닙니다.
GKE 클러스터의 Kubernetes 감사 정책 요약
일반적으로
create
,update
,delete
와 같은 쓰기 요청은RequestResponse
수준으로 로깅됩니다.일반적으로
get
,list
,watch
이벤트는Metadata
수준으로 로깅됩니다.일부 이벤트는 특별한 경우로 취급됩니다. 특별한 경우로 취급되는 요청 확정 목록은 정책 스크립트를 참조하세요. 이 문서 작성 시점을 기준으로 특별한 경우는 다음과 같습니다.
nodes/status
리소스 또는pods/status
리소스에 대한kubelet
,system:node-problem-detector
또는system:serviceaccount:kube-system:node-problem-detector
의 업데이트 및 패치 요청은 요청 수준으로 로깅됩니다.nodes/status
리소스 또는pods/status
리소스에 대한system:nodes
그룹 내 ID의 업데이트 및 패치 요청은 요청 수준으로 로깅됩니다.system:serviceaccount:kube-system:namespace-controller
의deletecollection
요청은 요청 수준으로 로깅됩니다.secrets
리소스,configmaps
리소스 또는tokenreviews
리소스에 대한 요청은 메타데이터 수준으로 로깅됩니다.
특정 요청은 전혀 로깅되지 않습니다. 로깅되지 않는 요청 확정 목록은 정책 스크립트의
level: None
규칙을 참조하세요. 이 문서 작성 시점을 기준으로 로깅되지 않는 요청은 다음과 같습니다.endpoints
리소스,services
리소스 또는services/status
리소스를 감시하기 위한system:kube-proxy
의 요청kube-system
네임스페이스의configmaps
리소스에 대한system:unsecured
의 가져오기 요청nodes
리소스 또는nodes/status
리소스에 대한kubelet
의 가져오기 요청nodes
리소스 또는nodes/status
리소스에 대한system:nodes
그룹 내 ID의 가져오기 요청kube-system
네임스페이스의endpoints
리소스에 대한system:kube-controller-manager
,system:kube-scheduler
또는system:serviceaccount:endpoint-controller
의 가져오기 및 업데이트 요청namespaces
리소스,namespaces/status
리소스 또는namespaces/finalize
리소스에 대한system:apiserver
의 가져오기 요청metrics.k8s.io
그룹의 모든 리소스에 대한system:kube-controller-manager
의 가져오기 및 나열 요청/healthz*
,/version
또는/swagger*
와 일치하는 URL에 대한 요청
GKE 감사 정책
GKE는 Kubernetes API 서버에서 로그 항목을 수신하면 고유 정책을 적용하여 개발자 프로젝트의 관리자 활동 로그와 데이터 액세스 로그에 기록될 항목을 결정합니다.
대부분의 경우 GKE은 Kubernetes API 서버에서 제공되는 로그 항목에 다음 규칙을 적용합니다.
create
,delete
,update
요청을 표현하는 항목은 관리자 작업 로그에 기록됩니다.get
,list
,updateStatus
요청을 표현하는 항목은 데이터 액세스 로그에 기록됩니다.
가격 책정 및 기본적으로 사용 설정되는 로그 유형에 대한 자세한 내용은 로깅 세부정보를 참조하세요.
Kubernetes 감사 정책 파일 이해
GKE 클러스터의 경우 Kubernetes 감사 정책 파일은 특정 이벤트가 전혀 로깅되지 않도록 지정하는 규칙으로 시작됩니다. 예를 들어 이 규칙은 nodes
리소스 또는 nodes/status
리소스에 대한 kubelet
의 get
요청을 로깅하지 않도록 지정합니다. None
수준은 일치하는 이벤트가 로깅되지 않음을 의미합니다.
- level: None users: ["kubelet"] # legacy kubelet identity verbs: ["get"] resources: - group: "" # core resources: ["nodes", "nodes/status"]
정책 파일에는 level: None
규칙 목록 다음에 특수한 경우의 규칙 목록이 있습니다. 예를 들어 다음과 같은 특수한 경우의 규칙은 특정 요청을 Metadata
수준으로 로깅하도록 지정합니다.
- level: Metadata resources: - group: "" # core resources: ["secrets", "configmaps"] - group: authentication.k8s.io resources: ["tokenreviews"] omitStages: - "RequestReceived"
이벤트가 규칙과 일치하려면 다음 조건이 모두 충족되어야 합니다.
- 이벤트가 정책 파일에 있는 이전 규칙과 일치하지 않습니다.
secrets
,configmaps
또는tokenreviews
형식의 리소스에 대한 요청입니다.- 이벤트가 호출의
RequestReceived
단계가 아닙니다.
특별한 경우의 규칙 목록 후 정책 파일에는 일반 규칙이 포함됩니다.
스크립트에서 일반 규칙을 확인하려면 known_apis
값을 ${known_apis}
로 바꿔야 합니다. 바꾸면 규칙은 다음과 같이 됩니다.
- 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: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
이 규칙은 정책 파일에 있는 이전 규칙과 일치하지 않으며 RequestReceived
단계가 아닌 이벤트에 적용됩니다. 이 규칙으로 인해 나열된 그룹 중 하나에 속하는 리소스의 get
, list
, watch
요청은 Request
수준으로 로깅됩니다.
정책 파일의 다음 규칙은 다음과 같습니다.
- 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: "settings.k8s.io" - group: "storage.k8s.io" omitStages: - "RequestReceived"
이 규칙은 정책 파일에 있는 이전 규칙과 일치하지 않으며 RequestReceived
단계가 아닌 이벤트에 적용됩니다. 특히 이 규칙은 읽기 요청인 get
, list
, watch
에 적용되지 않습니다. 대신 create
, update
, delete
와 같은 쓰기 요청에 적용됩니다. 이 규칙에 따라 쓰기 요청은 RequestResponse
수준으로 로깅됩니다.