개요

쿠버네티스 감사는 클러스터에서 발생하는 일련의 행동들을 보안과 관련된 시간순 기록으로 남깁니다. 클러스터는 사용자, 쿠버네티스 API를 사용하는 애플리케이션, 그리고 컨트롤 플레인 자체에 의해 생성된 활동들을 감사합니다.

 

샘플 감사 정책

https://kubernetes.io/docs/tasks/debug/debug-cluster/audit/

apiVersion: audit.k8s.io/v1 # This is required.
kind: Policy
omitStages:
  - "RequestReceived"
rules:
  - level: RequestResponse
    resources:
    - group: ""
      resources: ["namespaces"]
  - level: Request
    resources:
    - group: "" # core API group
      resources: ["persistentvolumes"]
    namespaces: ["my-namespace"]
  - level: Metadata
    resources:
    - group: "" # core API group
      resources: ["secrets", "configmaps"]
  - level: Request
    resources:
    - group: "" # core API group
    - group: "extensions" # Version of group should NOT be included.
  - level: Metadata
    omitStages:
      - "RequestReceived"

 

각 규칙의 의미 상세 설명

쿠버네티스 감사 정책(Audit Policy)은 클러스터 내에서 발생하는 모든 요청에 대한 로그를 기록하는 방법을 정의합니다. 각 규칙은 특정 요청에 대해 어떤 정보를 얼마나 상세하게 기록할지를 결정합니다.

  • omitStages: - "RequestReceived":
    • RequestReceived 단계는 API 서버가 요청을 받은 즉시 기록하는 단계입니다.
    • 이 정책은 모든 감사 로그에서 RequestReceived 단계를 제외합니다. 따라서 요청이 인증, 인가 등을 거친 후부터의 로그만 남게 되어 로그 파일의 크기를 줄이는 데 도움이 됩니다.
  • level: RequestResponse:
    • 대상: **모든 네임스페이스(group: "", resources: ["namespaces"])**에 대한 요청.
    • 로그 수준: RequestResponse는 요청의 메타데이터, 요청 본문, 그리고 응답 본문까지 모두 기록하는 가장 상세한 수준입니다.
    • 의미: 누군가 kubectl get namespaces나 kubectl create namespace 같은 명령을 실행하면, 해당 요청과 API 서버의 응답 내용 전체가 로그로 남게 됩니다.
  • level: Request:
    • 대상: **PersistentVolume(resources: ["persistentvolumes"])**에 대한 요청.
    • 로그 수준: Request는 요청의 메타데이터요청 본문을 기록합니다. 응답 본문은 포함되지 않습니다.
    • 의미: 누군가 PV를 생성하거나 수정할 때, 요청의 상세 내용이 로그로 남게 됩니다.
  • level: Metadata:
    • 대상: **Secrets와 ConfigMaps(resources: ["secrets", "configmaps"])**에 대한 요청.
    • 로그 수준: Metadata는 가장 낮은 수준으로, 요청의 **메타데이터(사용자, 타임스탬프 등)**만 기록하고 요청/응답 본문은 기록하지 않습니다.
    • 의미: Secrets는 민감한 정보를 담고 있으므로, 본문을 기록하는 것은 보안상 위험할 수 있습니다. 따라서 이 규칙은 누가 언제 Secrets나 ConfigMaps에 접근했는지 정도만 기록합니다.
  • level: Request:
    • 대상: 모든 핵심(core) API 그룹과 extensions API 그룹에 대한 요청.
    • 로그 수준: Request 수준으로, 요청 본문까지 기록합니다.
    • 의미: 이 규칙은 핵심 API(예: Pods, Services)와 extensions API에 대한 모든 요청에 대해 상세한 로그를 남깁니다.

 

 

클러스터의 컨트롤 플레인이 kube-apiserver를 파드(Pod)로 실행하는 경우, 감사 기록이 유지되도록 정책 파일과 로그 파일의 위치를 hostPath로 마운트해야 합니다.

  • kube-apiserver.yaml 에 구문 추가
  containers:
  - command:
    - kube-apiserver
    - --audit-policy-file=/etc/kubernetes/log/policy.yaml
    - --audit-log-path=/var/log/kubernetes/logs.txt
    - --audit-log-maxage=10
    - --audit-log-maxbackup=2
    
    ...
    
    volumeMounts:

    - mountPath: /etc/kubernetes/log/policy.yaml
      name: audit
      readOnly: true
    - mountPath: /var/log/kubernetes/
      name: audit-log
      readOnly: false
      
    ...
    
  volumes:
  - name: audit
    hostPath:
      path: /etc/kubernetes/log/policy.yaml
      type: File
  - name: audit-log
    hostPath:
      path: /var/log/kubernetes/
      type: DirectoryOrCreate

 

+ Recent posts