본 가이드는 CKS 2026 핵심 가이드 및 실전 아키텍처의 핵심 개념, 실전 구성 명령어 및 아키텍처 베스트 프랙티스를 다룹니다. 클라우드 네이티브 및 인프라 엔지니어링 실무에 즉시 활용 가능하도록 체계적으로 정리했습니다.
📑 Table of Contents
Study
-
사내 기술동호회
– [부제목 추가](https://www.canva.com/design/DAHKE-QYkIE/nrLyzRbAXLpCVsiSLsVy_w/edit)
– 활동 방식 :
– 회차별 미팅전 준비사항 : udemy수강 후 회차별 모임 1주일전까지 notion 회차별 디렉토리 하위에 각자의 이름으로 내용 학습한 내용 정리하기 (필수 내용 : 해당 내용에 대한 정의, 테스트 케이스와 결과값 ), 분량은 발표로 한다고하면 약 5분정도(발표를 하지는 않음)
– 회차별 미팅시 : 조별로 aws인스턴스 생성하여 다른 인원들이 학습한 내용 notion을 토대로 학습하고 공유하기
– \<조 구성 >
1. 이금홍,김가영,안효준
2. 김홍희, 최시영,김명한
3. 황예은,박지혜,박영준 -
AWS:
– [606163771990.signin.aws.amazon.com](https://606163771990.signin.aws.amazon.com/console)
– mh.kim2
– region: ap-northeast-2
Docs
Required
-
CKA \~
커리큘럼
CKS (Certified Kubernetes Security Specialist) 커리큘럼
CKS 인증은 쿠버네티스 보안 전문가가 빌드, 배포 및 런타임 중에 컨테이너 기반 애플리케이션과 쿠버네티스 플랫폼을 보호할 수 있는 기술, 지식 및 역량을 갖추었는지 확인하기 위해 설계되었습니다.
이 자격증은 다음과 같은 쿠버네티스 보안 모범 사례 적용 능력을 입증합니다:
- 클러스터 설정 강화 (Cluster Hardening)
- 시스템 및 네트워크 보안
- 공급망 보안 (Supply Chain Security)
- 모니터링 및 침해 사고 대응
본 인증은 쿠버네티스 관리자, 클라우드 보안 엔지니어 및 쿠버네티스 환경의 보안 전문성을 검증하려는 IT 전문가를 대상으로 합니다. 시험에 관한 자세한 정보는 Linux Foundation Training 웹사이트에서 확인할 수 있습니다.
평가 영역 및 비중
| Domain | Weight |
|
Cluster Setup • 네트워크 보안 정책을 사용하여 클러스터 수준 액세스를 제한합니다.CIS 벤치마크를 사용하여 Kubernetes 구성 요소(etcd, kubelet, kubedns, kubeapi)의 보안 구성을 검토합니다.TLS를 사용하여 Ingress를 적절히 설정합니다.노드 메타데이터 및 엔드포인트를 보호합니다 .배포하기 전에 플랫폼 바이너리를 확인합니다. |
10% |
|
Cluster Hardening • 노출을 최소화하기 위해 역할 기반 액세스 제어를 사용합니다.서비스 계정을 사용할 때 주의하십시오. 예: 기본값 비활성화, 새로 생성된 계정의 권한 최소화Kubernetes API에 대한 액세스 제한취약성을 방지하기 위해 Kubernetes 업그레이드 |
15% |
|
System Hardening • 호스트 OS 설치 공간 최소화(공격 표면 감소)최소 권한 ID 및 액세스 관리 사용네트워크에 대한 외부 액세스 최소화AppArmor, seccomp와 같은 커널 강화 도구 적절히 사용 |
15% |
|
Minimize Microservice Vulnerabilities • 적절한 Pod 보안 표준 사용Kubernetes 비밀 관리격리 기술(멀티 테넌시, 샌드박스 컨테이너 등) 이해 및 구현Pod 간 암호화(Cilium, Istio) 구현 |
20% |
|
Supply Chain Security • 기본 이미지 공간 최소화공급망 이해(예: SBOM, CI/CD, 아티팩트 저장소)공급망 보안(허용된 레지스트리, 아티팩트 서명 및 검증 등)사용자 작업 부하 및 컨테이너 이미지에 대한 정적 분석 수행(예: Kubesec, KubeLinter) |
20% |
|
Monitoring, Logging and Runtime Security • 악성 활동을 탐지하기 위한 행동 분석 수행물리적 인프라, 앱, 네트워크, 데이터, 사용자 및 워크로드 내의 위협탐지 환경 내의 공격 단계 및 악의적 행위자 조사 및 식별런타임 시 컨테이너의 불변성 보장Kubernetes 감사 로그를 사용하여 액세스 모니터링 |
20% |
바이너리 도표
CKS(Certified Kubernetes Security Specialist) 자격증 시험을 준비하시는군요! 시험 환경에서 직접 다루게 되는 핵심 바이너리(도구), 애드온(플러그인/컴포넌트), 그리고 필수 보안 개념을 한눈에 파악하실 수 있도록 영역별로 명확하게 정리해 드렸습니다.
1. 클러스터 보안 및 핵심 바이너리 (Cluster Security & Binaries)
시험 환경(Kubeadm 기반)에서 클러스터의 구성 요소를 점검하고 통제할 때 사용하는 핵심 도구와 개념입니다.
| 분류 | 항목 | 주요 역할 및 관련 핵심 개념 | 시험 실무 포인트 |
|---|---|---|---|
| 바이너리 | kube-apiserver |
클러스터의 진입점. 모든 보안 제어의 중심 | NodeRestriction, AlwaysPullImages 등 플러그인 활성화 |
| 바이너리 | kubelet |
각 노드에서 실행되는 에이전트 | 익명 요청 차단(anonymous: enabled: false), 웹훅 인증 활성화 |
| 바이너리 | etcd |
클러스터의 모든 데이터가 저장되는 KV 저장소 | 데이터 암호화(EncryptionConfiguration), TLS 인증서 적용 |
| 개념 | CIS Benchmark | 쿠버네티스 보안 구성 표준 가이드라인 | kube-bench 도구를 활용해 마스터/워커 노드 취약점 진입점 진단 |
| 개념 | RBAC | 역할 기반 접근 제어 (Role, ClusterRole) | 최소 권한 원칙(Principle of Least Privilege) 적용, 서비스 어카운트 제한 |
2. 시스템 하드닝 및 애드온 (System Hardening & Add-ons)
커널 레벨 및 OS 수준에서 컨테이너의 격리성을 높이고 권한을 제한하는 도구와 개념입니다.
| 분류 | 항목 | 주요 역할 및 관련 핵심 개념 | 시험 실무 포인트 |
|---|---|---|---|
| 애드온/모듈 | AppArmor | 리눅스 커널 보안 모듈 (프로그램별 프로필 적용) | Pod에 프로필 적용 (container.apparmor.security.beta.kubernetes.io) |
| 애드온/모듈 | seccomp | 컨테이너가 사용할 수 있는 시스템 콜(Syscall) 제한 | Pod의 securityContext.seccompProfile 설정 (RuntimeDefault 또는 커스텀) |
| 개념 | Security Context | Pod/컨테이너 레벨의 권한 및 보안 설정 | runAsNonRoot: true, readOnlyRootFilesystem: true, allowPrivilegeEscalation: false |
3. 마이크로서비스 및 네트워크 보안 (Microservice & Network Security)
포드 간의 통신을 제어하고, 외부 트래픽 진입 시 인증 및 암호화를 관리하는 영역입니다.
| 분류 | 항목 | 주요 역할 및 관련 핵심 개념 | 시험 실무 포인트 |
|---|---|---|---|
| 개념/오브젝트 | NetworkPolicy | Pod 간, 또는 외부와의 L3/L4 네트워크 트래픽 통제 | Ingress(들어오는 것), Egress(나가는 것) 격리 및 특정 라벨 제한 |
| 애드온 | Ingress Controller | 외부 트래픽을 클러스터 내부 서비스로 라우팅 | TLS 인증서(Secret) 연동 및 HTTPS 강제화 설정 |
| 개념 | mTLS | 서비스 간 상호 TLS 인증 (Service Mesh 기초 개념) | Pod 간 통신 시 데이터 암호화 및 신원 검증 |
4. 공급망 보안 및 정적 분석 (Supply Chain Security & Static Analysis)
이미지 빌드 단계부터 배포 전까지, 취약점이 있는 리소스가 클러스터에 들어오지 못하게 막는 도구들입니다.
| 분류 | 항목 | 주요 역할 및 관련 핵심 개념 | 시험 실무 포인트 |
|---|---|---|---|
| 바이너리 | trivi 또는 clair |
컨테이너 이미지 취약점 스캐너 | trivy image 명령어로 CRITICAL 취약점 유무 확인 |
| 바이너리 | kubesec |
쿠버네티스 manifest(YAML) 파일 정적 보안 분석 도구 | YAML 파일의 보안 점수(Score) 확인 및 취약한 설정 수정 |
| 애드온 | Admission Controller | 요청이 API 서버에 저장되기 전 검증/변조하는 플러그인 | ValidatingWebhookConfiguration, MutatingWebhookConfiguration 구조 이해 |
| 애드온 | ImagePolicyWebhook | 특정 검증을 통과한 이미지 파일만 배포되도록 강제 | API 서버의 --admission-control-config-file에 웹훅 설정 연동 |
5. 모니터링, 로깅 및 런타임 보안 (Monitoring, Logging & Runtime Security)
이미 배포되어 실행 중인 컨테이너에서 발생하는 비정상적인 행위를 탐지하고 기록하는 영역입니다.
| 분류 | 항목 | 주요 역할 및 관련 핵심 개념 | 시험 실무 포인트 |
|---|---|---|---|
| 바이너리/애드온 | Falco | 실시간 런타임 위협 탐지 도구 (CNCF) | 실시간 규칙(Rules) 수정, 컨테이너 내 비정상 쉘 접속 이력 감지 (/etc/falco/falco_rules.local.yaml) |
| 개념 | Audit Logging | API 서버에 도달한 모든 요청의 기록(감사 로그) | Audit Policy 파일 작성 (Metadata, RequestResponse 레벨), API 서버 옵션 바인딩 |
| 바이너리 | crictl |
CRI(컨테이너 런타임 인터페이스) 호환 컨테이너 관리 도구 | 디버깅 시 노드에 직접 접속하여 crictl ps, crictl logs 등으로 컨테이너 상태 조사 |
💡 CKS 합격을 위한 팁
CKS는 이론보다 “문제에서 요구하는 도구(바이너리)의 설정 파일을 직접 수정하거나(선언형 YAML 변경), 제공된 툴을 실행하여 나온 결과(로그/스캔 결과)를 바탕으로 조치하는 능력”을 평가합니다. 위의 도구들이 어느 경로에 설치되어 있고, 어떻게 환경설정 파일(kube-apiserver.yaml 등)과 연동되는지 반복 숙지하시는 것을 추천합니다.
공유자료
문제 항목
1.kubelet 및 etcd 보안 문제 해결
2. TLS Secret
3. Dockerfile 보안 모범 사례
4. /dev/mem에 접근하는 Pod
5. 보안 컨텍스트(Container Security Context)
6. 로그 감사 log audit
7. 네트워크 정책 Deny와 Allow
8. Ingress를 사용해 HTTPS 서비스 공개
9. API 자격 증명 자동 마운트 비활성화
10. 클러스터 노드 업그레이드
11. bom 도구를 사용해 SPDX 문서 생성
12. 제한적 Pod 보안 표준
13. Docker 데몬 보호
14. Cilium 네트워크 정책
15. 컨테이너 이미지 정책 (ImagePolicyWebhook)
16. API 서버 인증 활성화
보안 컨텍스트(Container Security Context)
문제에서
Context
기존 Pod을 업데이트하여 컨테이너의 불변성을 보장해야 한다.
Task
`sec-ns` 네임스페이스에 있는 `secdep`이라는 Deployment를 수정하여, 그 안의 컨테이너가 다음 조건을 만족하도록 하라:
- 사용자 ID 30000으로 실행
- 루트 파일 시스템을 읽기 전용으로 설정
- 권한 상승(Privilege Escalation) 금지
Deployment 매니페스트 파일은 `~/sec-ns_deployment.yaml`에 있다.
답안
candidate@master01:~$ kubectl get -f sec-ns_deployment.yaml
NAME READY UP-TO-DATE AVAILABLE AGE
secdep 1/1 1 1 134d
candidate@master01:~$ vim sec-ns_deployment.yaml
kind: Deployment
metadata:
name: secdep
namespace: sec-ns
spec:
replicas: 1
selector:
matchLabels:
app: secdep
template:
metadata:
labels:
app: secdep
spec:
containers:
- name: sec-ctx-demo-1
image: busybox:1.28
imagePullPolicy: IfNotPresent
command: [ "sh", "-c", "sleep 12h" ]
securityContext: # 제목 요구사항에 따라 보안 컨텍스트 추가
allowPrivilegeEscalation: false # 권한 상승 금지
readOnlyRootFilesystem: true # 루트 파일 시스템 읽기 전용
runAsUser: 30000 # 사용자 ID 30000 사용
volumeMounts:
- name: sec-ctx-vol-1
mountPath: /data/demo1
- name: sec-ctx-demo-2
image: busybox
imagePullPolicy: IfNotPresent
command: [ "sh", "-c", "sleep 12h" ]
securityContext: # 제목 요구사항에 따라 보안 컨텍스트 추가
allowPrivilegeEscalation: false # 권한 상승 금지
readOnlyRootFilesystem: true # 루트 파일 시스템 읽기 전용
runAsUser: 30000 # 사용자 ID 30000 사용
volumeMounts:
- name: sec-ctx-vol-2
mountPath: /data/demo2
volumes:
- name: sec-ctx-vol-1
emptyDir: {}
- name: sec-ctx-vol-2
emptyDir: {}
candidate@master01:~$ kubectl apply -f sec-ns_deployment.yaml
deployment.apps/secdep configured
candidate@master01:~$
candidate@master01:~$ kubectl -n sec-ns get pod
NAME READY STATUS RESTARTS AGE
secdep-697685948b-krg2k 2/2 Running 0 21s
secdep-7478777cc8-5546d 2/2 Terminating 16 (3h1m ago) 134d
candidate@master01:~$ exit
감사 로그 문제 예제는
Context
너는 kubeadm으로 구성된 클러스터에 대해 감사를 구현해야 한다.
Task
먼저, 클러스터의 API 서버를 다음과 같이 재구성하라:
⚫ `/etc/kubernetes/logpolicy/sample-policy.yaml`의 기본 감사 정책을 사용한다
⚫ 로그를 `/var/log/kubernetes/audit-logs.txt`에 저장한다
⚫ 최대 2개의 로그를 보관하며, 보관 기간은 10일이다
주의: 기본 정책은 기록하지 않을 항목만 지정한다.
그런 다음, 기본 정책을 편집하고 확장하여 다음을 기록하라:
⚫ persistentvolumes 이벤트를 RequestResponse 수준으로 기록
⚫ `front-apps` 네임스페이스의 `configmaps` 이벤트의 요청 본문 기록
⚫ 모든 네임스페이스에서 `ConfigMap`과 `Secret` 변경을 Metadata 수준으로 기록
⚫ 기타 모든 요청을 Metadata 수준으로 기록
주의: API 서버가 확장된 정책을 사용하도록 보장하라.
답
1. 정책편집
root@master01:~# cp /etc/kubernetes/logpolicy/sample-policy.yaml /opt/
root@master01:~# vim /etc/kubernetes/logpolicy/sample-policy.yaml
root@master01:~# cat /etc/kubernetes/logpolicy/sample-policy.yaml
apiVersion: audit.k8s.io/v1
kind: Policy
omitStages:
- "RequestReceived"
rules:
# 엔드포인트나 서비스에서 "system:kube-proxy"가 수행하는 watch 요청은 기록하지 않음
- level: None
users: ["system:kube-proxy"]
verbs: ["watch"]
resources:
- group: "" # 코어 API 그룹
resources: ["endpoints", "services"]
# 특정 non-resource URL 경로에 대한 인증된 요청은 기록하지 않음
- level: None
userGroups: ["system:authenticated"]
nonResourceURLs:
- "/api*" # 와일드카드 매칭
- "/version"
# 위의 기존 규칙은 삭제하지 말고, 아래에 문제에서 요구한 규칙만 추가하십시오.
# RequestResponse 수준의 persistentvolumes 이벤트
- level: RequestResponse
resources:
- group: ""
resources: ["persistentvolumes"]
# front-apps 네임스페이스의 configmaps 이벤트 요청 본문
- level: Request
resources:
- group: ""
resources: ["configmaps"]
namespaces: ["front-apps"]
# 모든 네임스페이스에서 ConfigMap과 Secret 변경을 Metadata 수준으로 기록
- level: Metadata
resources:
- group: ""
resources: ["secrets", "configmaps"]
# 기타 모든 요청을 Metadata 수준으로 기록
- level: Metadata
omitStages:
- "RequestReceived"
2. api 편집
root@master01:~# cp /etc/kubernetes/manifests/kube-apiserver.yaml /opt/
root@master01:~# vim /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 11.0.1.111:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --advertise-address=11.0.1.111
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --audit-policy-file=/etc/kubernetes/logpolicy/sample-policy.yaml # 감사 정책
- --audit-log-path=/var/log/kubernetes/audit-logs.txt # 로그 저장 경로
- --audit-log-maxbackup=2 # 로그 최대 백업 수
- --audit-log-maxage=10 # 로그 보관 일수
······
3. 구성 재적용
root@master01:~# systemctl daemon-reload && systemctl restart kubelet.service
root@master01:~#
root@master01:~# kubectl get pod -A # 2분 대기 후 확인, 클러스터 정상 상태 확인
NAME READY STATUS RESTARTS AGE
amd-gpu-6cbfd6c6d6-l5464 1/1 Running 7 (3h44m ago) 134d
nvidia-gpu-64c4d44986-x5qgh 1/1 Running 7 (3h44m ago) 134d
root@master01:~# tail /var/log/kubernetes/audit-logs.txt # 검증
{"kind":"Event","apiVersion":"audit.k8s.io/v1","level":"Metadata","auditID":"a6c4f229-78be-41d7-a682-6f5597841f9c","stage":"ResponseComplete","requestURI":"/rAgent":"kubelet/v1.31.0 (linux/amd64) kubernetes/9edcffc","objectRef":{"resource":"nodes","name":"master01","apiVersion":"v1"},"responseStatus":{"metadata":ision":"allow","authorization.k8s.io/reason":""}}
·····
root@master01:~#
Leave a Reply