감사 정책


이 페이지에서는 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-controllerdeletecollection 요청은 요청 수준으로 로깅됩니다.

    • 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 리소스에 대한 kubeletget 요청을 로깅하지 않도록 지정합니다. 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 수준으로 로깅됩니다.

다음 단계