[K8s][CKS] 감사(auditing)
쿠버네티스의 감사는 클러스터의 작업 순서을 문서화하는 보안 관련 시간별 레코드 세트를 제공한다.
클러스터는 사용자, 쿠버네티스 API를 사용하는 애플리케이션 및 컨프롤 플레인 자체에서 생성된 활동을 감사한다.
감사기록은 Kube-apiserver 컴포넌트 내에서 수명주기를 시작하며, 각 단계에서 각 요청은 감사 이벤트를 생성하고
감사 이벤트는 특정 정책에 따라 사전 처리되고 백엔드에 기록된다.
감사 정책
감사 정책은 기록해야 하는 이벤트와 포함해야 하는 데이터에 대한 규칙을 정의한다.
정의된 감사 수준은 다음과 같다.
None | 이 규칙에 해당되는 이벤트는 로깅하지 않는다. |
Metadata | 요청 메타데이터는 로깅하지만 요청/응답 본문은 로깅하지 않는다. |
Request | 이벤트 메타데이터 및 요청 본문을 로깅하지만 응답 본문은 로깅하지 않는다. 리소스 외의 요청에는 적용되지 않는다. |
RequestResponse | 이벤트 메타데이터 및 요청/응답 본문을 로깅한다. 리소스 외의 요청에는 적용되지 않는다. |
해당 정책들은 --audit-policy-file 플래그를 사용하여 정책이 포함된 파일을 kube-apiserver에 전달 할 수 있다.
감사 정책 파일에 rules 필드가 반드시 제공되어야 하며, 규칙이 없는 정책은 적절하지 않은 것으로 간주된다.
정책 파일의 예는 다음과 같다. (audit-policy.yaml)
apiVersion: audit.k8s.io/v1 # 필수사항임.
kind: Policy
# Request Received 단계의 모든 요청에 대해 감사 이벤트를 생성하지 않음.
omitStages:
- "RequestReceived"
rules:
# RequestResponse 수준에서 파드 변경 사항 기록
- level: RequestResponse
resources:
- group: ""
# 리소스 "파드" 가 RBAC 정책과 부합하는 파드의 하위 리소스에 대한
# 요청과 일치하지 않음.
resources: ["pods"]
# 메타데이터 수준에서 "pods/log", "pods/status"를 기록함.
- level: Metadata
resources:
- group: ""
resources: ["pods/log", "pods/status"]
# "controller-leader" 라는 컨피그맵에 요청을 기록하지 않음."
- level: None
resources:
- group: ""
resources: ["configmaps"]
resourceNames: ["controller-leader"]
# 엔드포인트 또는 서비스의 "system:kube-proxy"에 의한 감시 요청 기록하지 않음.
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # 핵심 API 그룹
resources: ["endpoints", "services"]
# 인증된 요청을 특정 리소스가 아닌 URL 경로에 기록하지 않음.
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # 와일드카드 매칭(wildcard matching).
- "/version"
# kube-system에 컨피그맵 변경 사항의 요청 본문을 기록함.
- level: Request
resources:
- group: "" # 핵심 API 그룹
resources: ["configmaps"]
# 이 정책은 "kube-system" 네임스페이스의 리소스에만 적용됨.
# 빈 문자열 "" 은 네임스페이스가 없는 리소스를 선택하는데 사용할 수 있음.
namespaces: ["kube-system"]
# 메타데이터 수준에서 다른 모든 네임스페이스의 컨피그맵과 시크릿 변경 사항을 기록함.
- level: Metadata
resources:
- group: "" # 핵심 API 그룹
resources: ["secrets", "configmaps"]
# 요청 수준에서 코어 및 확장에 있는 다른 모든 리소스를 기록함.
- level: Request
resources:
- group: "" # 핵심 API 그룹
- group: "extensions" # 그룹의 버전을 기재하면 안 된다.
# 메타데이터 수준에서 다른 모든 요청을 기록하기 위한 모든 수집 정책.
- level: Metadata
# 이 정책에 해당하는 감시자와 같은 장기 실행 요청은
# RequestReceived에서 감사 이벤트를 생성하지 않음.
omitStages:
- "RequestReceived"
다음과 같이 최소 감사 정책 파일을 사용하여 Metadata 수준에서 모든 요청을 기록할 수 있다.
# Log all requests at the Metadata level.
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadata
감사 백엔드
감사 백엔드는 감사 이벤트를 외부 저장소에 유지한다. 기본적으로 kube-apiserver는 두 가지 백엔드를 제공한다.
- 이벤트를 파일 시스템에 기록하는 로그 백엔드
- 이벤트를 외부 HTTP API로 보내는 Webhook 백엔드
모든 경우에 감사 이벤트는 쿠버네티스 API의 audit.k9s.io API 그룹에서 정의한 구조를 따른다.
로그 백엔드
로그 백엔드는 감사 이벤트를 JSON 형식으로 파일에 기록한다.
kube-apiserver 플래그를 사용하여 로그 감사 백엔드를 구성할 수 있다.
--audit-log-path | 로그 백엔드가 감사 이벤트를 쓰는 데, 사용하는 로그 파일 경로를 지정한다. 이 플래그를 지정하지 않으면 로그 백엔드가 비활성화 된다. |
--audit-log-maxage | 오래된 감사 로그 파일을 보관할 최대 일수를 정의한다. |
--audit-log-maxbackup | 보관할 감사 로그 파일의 최대 수를 정의한다. |
--audit-log-maxsize | 감사 로그 파일이 로테이트 되기 전의 최대 크기(MB)를 정의한다. |
클러스터의 컨트롤 플레인이 kube-apiserver 파드로 실행하는 경우, 감사 레코드가 지속되도록
정책 파일 및 로그 파일의 위치에 hostPath를 마운트 해야한다.
kube-apiserver에 플래그를 추가 후
--audit-policy-file=/etc/kubernetes/audit-policy.yaml
--audit-log-path=/var/log/kubernetes/audit/audit.log
볼륨을 마운트 한다.
...
volumeMounts:
- mountPath: /etc/kubernetes/audit-policy.yaml
name: audit
readOnly: true
- mountPath: /var/log/kubernetes/audit/
name: audit-log
readOnly: false
마지막으로 hostPath를 구성한다.
...
volumes:
- name: audit
hostPath:
path: /etc/kubernetes/audit-policy.yaml
type: File
- name: audit-log
hostPath:
path: /var/log/kubernetes/audit/
type: DirectoryOrCreate
웹훅 백엔드
웹훅 감사 백엔드는 원격 웹 API로 감사 이벤트를 전송하는데, 이는 인증 수단을 포함하여 쿠버네티스 API의 한 형태로 간주된다. 다음 Kube-apiserver 플래그를 사용하여 웹훅 감사 백엔드를 구성할 수 있다.
--audit-webhhok-config-file | 웹훅 구성이 있는 파일의 경로를 지정한다. |
--audit-webhook-initial-backoff | 첫 번째로 실패한 요청 이후 다시 시도하기 전 대기할 시간을 지정한다. 이후의 요청은 지수의 백오프로 재시도된다. |
이벤트 배치
로그 및 웹 훅 백엔드는 모두 배치를 지원한다.
--audit-webhook-mode | 버퍼링 전략을 정의한다. 아래 세가지는 버퍼링 전략이다. |
batch | 이벤트를 버퍼링하고 비동기식으로 배치한다. (default) |
blocking | 각 개별 이벤트를 처리할 때, API 서버 응답을 차단한다. |
blocking-strict | blocking과 동일하지만, RequestRecevied 단계에서 감사 로깅중에 오류가 발생하면, Kube-apiserver에 대한 전체 요청이 실패한다. |
다음 플래그는 batch 모드에서만 사용된다.
--audit-webhook-batch-buffer-size | 배치하기 전 버퍼링할 이벤트 수를 정의한다. 들어오는 이벤트의 비율이 버퍼를 초과하면 이벤트가 삭제된다. |
--audit-webhook-batch-max-size | 한 배치의 최대 이벤트 수를 정의한다. |
--audit-webhook-batch-max-wait | 대기열에서 이벤트를 무조건 배치하기 전 대기할 최대 시간을 정의한다. |
--audit-webhook-batch-throttle-qps | 초당 생성되는 최대 평균 배치 수를 정의한다. |
--audit-webhook-batch-throttle-burst | 허용된 QPS가 이전에 충분히 활용되지 않은 경우에 동시에 생성되는 최대 배치 수를 정의한다. |
참고 : https://kubernetes.io/ko/docs/tasks/debug/debug-cluster/audit/
'🐳 Container > K8S' 카테고리의 다른 글
[K8s][CKS] Admission Controller (0) | 2024.06.19 |
---|---|
[K8s] SecurityContext (1) | 2024.06.04 |
[K8s][CKS] 컨테이너의 불변성 보장 (0) | 2024.05.24 |
[K8s][CKS] TLS (Cipher-Suites) (0) | 2024.05.23 |
[K8s][CKS] Kube-bench (0) | 2024.05.21 |