감사 정책

이 페이지에서는 Google Kubernetes Engine의 감사 로깅 정책을 설명합니다.

시작하기 전에

이 항목을 읽기 전에 다음 항목의 자료를 숙지해야 합니다.

개요

Kubernetes Engine 클러스터에서 Kubernetes API 서버는 Kubernetes Engine에서 관리되는 백엔드에 감사 로그 항목을 기록합니다. Kubernetes Engine은 Kubernetes API 서버에서 로그 항목을 수신할 때 이를 개발자 프로젝트의 관리자 활동 로그 및 데이터 액세스 로그에 기록합니다.

프로젝트의 감사 로그에 표시되는 내용에 영향을 주는 정책은 두 가지입니다.

  • Kubernetes 감사 정책은 로그 항목으로 기록되는 이벤트에 대한 규칙을 정의합니다. 또한 로그 항목에 포함될 데이터를 지정합니다.

  • Kubernetes Engine 감사 정책은 관리자 활동 로그에 기록되는 항목 및 데이터 액세스 로그에 기록되는 항목을 결정합니다.

Kubernetes 감사 정책

Kubernetes API 서버는 kube-apiserver 명령어의 --audit-policy-file 플래그에 지정된 정책을 따릅니다.

Kubernetes Engine은 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 단계가 아닙니다.

Kubernetes Engine 클러스터를 위한 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에 대한 요청

Kubernetes Engine 감사 정책

Kubernetes Engine은 Kubernetes API 서버에서 로그 항목을 수신할 때 고유 정책을 적용하여 개발자 프로젝트의 관리자 활동 로그에 기록할 항목 및 개발자 프로젝트의 데이터 액세스 로그에 기록할 항목을 결정합니다.

대부분의 경우 Kubernetes Engine은 Kubernetes API 서버에서 제공되는 로그 항목에 다음 규칙을 적용합니다.

  • create, delete, update 요청을 나타내는 항목은 관리자 활동 로그에 기록됩니다.

  • get, list, updateStatus 요청을 나타내는 항목은 데이터 액세스 로그에 기록됩니다.

가격 책정 및 기본적으로 사용 설정되는 로그 유형에 대한 자세한 내용은 로깅 세부정보를 참조하세요.

Kubernetes 감사 정책 파일 이해

Kubernetes Engine 클러스터의 경우 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 수준으로 기록되도록 지정합니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine 문서