Security

컨테이너/K8s 보안 체크리스트

컨테이너 및 Kubernetes 환경의 보안 설정을 점검하세요. · 2025.02 기준

전체 진행률
0%
0 / 45 항목 완료
이미지 보안0/7
런타임 보안0/8
네트워크 정책0/7
시크릿 관리0/7
RBAC/접근 제어0/8
모니터링/감사0/8
신뢰할 수 있는 베이스 이미지 사용

공식 레지스트리 또는 조직 내부에서 검증된 베이스 이미지만 사용하여 공급망 공격 위험을 줄입니다.

확인 방법:Dockerfile의 FROM 절에 명시된 이미지가 Docker Official Images 또는 사내 승인 목록에 포함되어 있는지 확인합니다.
이미지 취약점 스캔 자동화

CI/CD 파이프라인에 Trivy, Grype 등의 취약점 스캐너를 통합하여 빌드 시점에 알려진 CVE를 탐지합니다.

확인 방법:CI 파이프라인에 trivy image --severity HIGH,CRITICAL <image> 명령을 추가하고, CRITICAL 취약점 발견 시 빌드가 실패하도록 설정합니다.
이미지 태그 대신 다이제스트(SHA256) 사용

latest 등 변경 가능한 태그 대신 이미지 다이제스트를 지정하여 배포 시 이미지 무결성을 보장합니다.

확인 방법:Pod spec의 image 필드가 image@sha256:abc123... 형식으로 다이제스트를 포함하는지 kubectl get pods -o jsonpath으로 확인합니다.
이미지 서명 및 검증 (Cosign/Notary)

Cosign 또는 Notary를 활용하여 이미지에 서명하고, 배포 전 서명을 검증하여 변조를 방지합니다.

확인 방법:cosign verify --key cosign.pub <image> 명령으로 서명을 검증하거나, Kyverno/OPA 정책으로 서명 없는 이미지 배포를 차단합니다.
최소 베이스 이미지(Distroless/Alpine) 사용

불필요한 패키지와 셸을 제거한 최소 이미지를 사용하여 공격 표면을 줄입니다.

확인 방법:Dockerfile에서 gcr.io/distroless 또는 alpine 기반 이미지를 사용하고 있는지 확인합니다. docker image inspect로 레이어 수와 크기를 점검합니다.
프라이빗 레지스트리 접근 제어

컨테이너 레지스트리에 인증 및 권한 관리를 적용하여 무단 이미지 푸시/풀을 방지합니다.

확인 방법:레지스트리에 RBAC이 적용되어 있는지, imagePullSecrets가 올바르게 설정되어 있는지 kubectl get sa -o yaml로 확인합니다.
멀티스테이지 빌드로 빌드 도구 제거

멀티스테이지 빌드를 사용하여 컴파일러, 빌드 도구 등이 최종 이미지에 포함되지 않도록 합니다.

확인 방법:Dockerfile에 여러 FROM 절이 있고, 최종 스테이지에 빌드 도구(gcc, make 등)가 포함되지 않는지 확인합니다.
컨테이너를 non-root 사용자로 실행

securityContext에서 runAsNonRoot: true를 설정하여 컨테이너가 root 권한으로 실행되지 않도록 합니다.

확인 방법:kubectl get pods -o jsonpath='{.items[*].spec.containers[*].securityContext.runAsNonRoot}'로 모든 컨테이너의 설정을 확인합니다.
readOnlyRootFilesystem 활성화

컨테이너의 루트 파일시스템을 읽기 전용으로 설정하여 런타임 중 악성 파일 생성을 방지합니다.

확인 방법:Pod spec의 securityContext.readOnlyRootFilesystem이 true인지 확인합니다. 쓰기가 필요한 경로는 emptyDir 볼륨으로 마운트합니다.
권한 상승 방지 (allowPrivilegeEscalation: false)

allowPrivilegeEscalation을 false로 설정하여 setuid 바이너리 등을 통한 권한 상승을 차단합니다.

확인 방법:kubectl get pods -o yaml에서 securityContext.allowPrivilegeEscalation 값을 확인합니다. PodSecurityStandard restricted 프로필 적용을 권장합니다.
Linux Capabilities 최소화

모든 Capabilities를 DROP 한 뒤 필요한 것만 ADD하여 컨테이너에 부여되는 커널 권한을 최소화합니다.

확인 방법:securityContext.capabilities에 drop: ["ALL"]이 설정되고, add에는 최소한의 capability만 포함되어 있는지 확인합니다.
Seccomp 프로파일 적용

RuntimeDefault 또는 커스텀 Seccomp 프로파일을 적용하여 허용되지 않은 시스템 콜을 차단합니다.

확인 방법:Pod spec의 securityContext.seccompProfile.type이 RuntimeDefault 또는 Localhost로 설정되어 있는지 확인합니다.
AppArmor/SELinux 프로파일 적용

AppArmor 또는 SELinux 프로파일을 사용하여 컨테이너의 파일 접근 및 프로세스 실행 범위를 제한합니다.

확인 방법:Pod annotation에 container.apparmor.security.beta.kubernetes.io가 설정되어 있거나 seLinuxOptions가 지정되어 있는지 확인합니다.
Pod Security Standards(PSS) 적용

Namespace에 Pod Security Admission을 설정하여 baseline 또는 restricted 보안 표준을 강제합니다.

확인 방법:kubectl get ns <namespace> -o yaml에서 pod-security.kubernetes.io/enforce 레이블이 restricted 또는 baseline으로 설정되어 있는지 확인합니다.
컨테이너 리소스 제한(limits/requests) 설정

CPU와 메모리 리소스 제한을 설정하여 리소스 고갈(DoS) 공격 및 노이지 네이버 문제를 방지합니다.

확인 방법:kubectl describe pod에서 resources.limits와 resources.requests가 모든 컨테이너에 설정되어 있는지 확인합니다. LimitRange도 함께 점검합니다.
NetworkPolicy로 기본 트래픽 차단(Default Deny)

Namespace에 기본 Deny 정책을 적용하여 명시적으로 허용되지 않은 모든 Ingress/Egress 트래픽을 차단합니다.

확인 방법:kubectl get networkpolicy -n <namespace>로 default-deny 정책이 존재하는지 확인합니다. policyTypes에 Ingress, Egress가 모두 포함되어야 합니다.
Pod 간 최소 권한 네트워크 정책 설정

필요한 Pod 간 통신만 허용하는 세분화된 NetworkPolicy를 작성하여 측면 이동(Lateral Movement)을 방지합니다.

확인 방법:각 서비스별 NetworkPolicy가 존재하고, podSelector 및 namespaceSelector가 정확히 지정되어 있는지 확인합니다.
Egress 트래픽 제한 및 모니터링

외부로 나가는 트래픽을 필요한 대상(DNS, API 엔드포인트 등)으로만 제한하여 데이터 유출을 방지합니다.

확인 방법:NetworkPolicy의 egress 규칙에서 허용된 IP/포트 목록을 확인하고, DNS(port 53) 외 불필요한 외부 통신이 없는지 점검합니다.
Ingress Controller TLS 인증서 관리

Ingress 리소스에 유효한 TLS 인증서를 설정하여 외부 트래픽의 암호화를 보장합니다.

확인 방법:kubectl get ingress -o yaml에서 tls 섹션이 올바르게 구성되어 있고, Secret에 저장된 인증서의 만료일을 openssl x509 -enddate로 확인합니다.
서비스 메시(Istio/Linkerd) mTLS 활성화

서비스 메시를 사용하여 Pod 간 통신에 상호 TLS(mTLS)를 적용하여 내부 트래픽도 암호화합니다.

확인 방법:Istio의 경우 kubectl get peerauthentication -A로 mTLS 모드가 STRICT로 설정되어 있는지 확인합니다.
DNS 정책 및 외부 DNS 접근 제한

클러스터 내 CoreDNS 설정을 검토하고, Pod가 불필요한 외부 DNS 서버에 접근하지 않도록 제한합니다.

확인 방법:kubectl get configmap coredns -n kube-system -o yaml로 CoreDNS 설정을 확인하고, forward 플러그인의 대상 DNS 서버를 점검합니다.
API Server 접근 네트워크 제한

Kubernetes API Server에 접근할 수 있는 네트워크 대역을 제한하여 외부로부터의 무단 접근을 차단합니다.

확인 방법:API Server의 --authorized-networks 또는 방화벽/보안그룹 설정에서 허용된 CIDR 범위를 확인합니다.
etcd Secret 암호화 활성화 (EncryptionConfiguration)

etcd에 저장되는 Secret 리소스를 AES-CBC 또는 AES-GCM으로 암호화하여 저장 시 보호합니다.

확인 방법:API Server의 --encryption-provider-config 플래그가 설정되어 있고, EncryptionConfiguration에 aescbc 또는 aesgcm 프로바이더가 지정되어 있는지 확인합니다.
환경변수 대신 볼륨 마운트로 Secret 전달

Secret을 환경변수로 노출하면 로그나 프로세스 목록에 유출될 위험이 있으므로 볼륨 마운트 방식을 사용합니다.

확인 방법:kubectl get pods -o yaml에서 env.valueFrom.secretKeyRef 대신 volumes/volumeMounts를 통해 Secret을 마운트하고 있는지 확인합니다.
외부 Secret 관리 도구 연동 (Vault, AWS SM)

HashiCorp Vault, AWS Secrets Manager 등 외부 시크릿 관리 서비스와 연동하여 Secret의 생명주기를 중앙 관리합니다.

확인 방법:External Secrets Operator 또는 Vault Agent Injector가 클러스터에 배포되어 있고, ExternalSecret 리소스가 올바르게 동기화되는지 확인합니다.
Secret 접근 권한 최소화 (RBAC)

Secret 리소스에 대한 get, list, watch 권한을 필요한 ServiceAccount에만 부여하여 민감 정보 접근을 제한합니다.

확인 방법:kubectl auth can-i get secrets --as=system:serviceaccount:<ns>:<sa>로 각 ServiceAccount의 Secret 접근 권한을 확인합니다.
Secret 자동 로테이션 설정

Secret(비밀번호, API 키, 인증서 등)을 주기적으로 교체하여 유출된 자격 증명의 악용 기간을 최소화합니다.

확인 방법:외부 Secret 관리 도구의 자동 로테이션 설정을 확인하거나, CronJob 등을 통한 주기적 교체 프로세스가 있는지 점검합니다.
Git 리포지토리에 Secret 하드코딩 방지

Secret 값이 소스 코드나 Helm values 파일에 평문으로 포함되지 않도록 git-secrets, gitleaks 등의 도구로 검사합니다.

확인 방법:CI 파이프라인에 gitleaks detect 또는 git-secrets --scan을 추가하여 커밋 시점에 Secret 유출을 탐지합니다.
Sealed Secrets 또는 SOPS로 GitOps 암호화

GitOps 환경에서 Secret을 안전하게 관리하기 위해 Sealed Secrets 또는 Mozilla SOPS를 사용하여 암호화된 상태로 저장합니다.

확인 방법:SealedSecret 리소스가 사용되고 있는지 확인하거나, .sops.yaml 설정 파일이 존재하고 암호화 키가 올바르게 관리되는지 점검합니다.
default ServiceAccount 사용 금지

Pod에 default ServiceAccount 대신 전용 ServiceAccount를 생성하여 할당함으로써 불필요한 권한 부여를 방지합니다.

확인 방법:kubectl get pods -o jsonpath='{.items[*].spec.serviceAccountName}'에서 default가 사용되는 Pod이 없는지 확인합니다.
ServiceAccount 토큰 자동 마운트 비활성화

API Server에 접근할 필요가 없는 Pod에서는 automountServiceAccountToken을 false로 설정하여 토큰 노출을 방지합니다.

확인 방법:kubectl get sa -o yaml에서 automountServiceAccountToken: false가 설정되어 있는지, 또는 Pod spec에서 개별 설정되어 있는지 확인합니다.
ClusterRole/ClusterRoleBinding 최소 권한 검토

cluster-admin 등 광범위한 ClusterRole 바인딩을 최소화하고, 필요한 리소스와 동사(verb)만 허용합니다.

확인 방법:kubectl get clusterrolebindings -o wide로 cluster-admin에 바인딩된 주체를 확인하고, 불필요한 바인딩을 제거합니다.
Namespace 기반 리소스 격리

팀, 환경, 서비스별로 Namespace를 분리하고, ResourceQuota와 LimitRange로 리소스 사용을 제한합니다.

확인 방법:kubectl get ns로 Namespace 분리 현황을 확인하고, kubectl get resourcequota -A로 각 Namespace에 리소스 쿼터가 설정되어 있는지 점검합니다.
Role과 RoleBinding으로 Namespace 범위 권한 관리

ClusterRole 대신 Namespace 범위의 Role/RoleBinding을 사용하여 권한 범위를 최소화합니다.

확인 방법:kubectl get roles,rolebindings -n <namespace>로 Namespace별 권한 설정을 확인하고, 불필요한 ClusterRole 참조가 없는지 점검합니다.
익명(Anonymous) 접근 비활성화

API Server에 대한 익명 요청을 비활성화하여 인증되지 않은 사용자의 클러스터 정보 조회를 차단합니다.

확인 방법:API Server 시작 옵션에서 --anonymous-auth=false가 설정되어 있는지, 또는 RBAC에서 system:anonymous에 바인딩된 역할이 없는지 확인합니다.
사용자 인증에 외부 IdP(OIDC) 연동

API Server에 정적 토큰이나 인증서 대신 OIDC 기반 외부 ID 공급자를 연동하여 중앙 집중식 인증을 구현합니다.

확인 방법:API Server의 --oidc-issuer-url, --oidc-client-id 플래그가 올바르게 설정되어 있는지, kubectl config에서 OIDC 인증이 사용되는지 확인합니다.
RBAC 권한 정기 감사

정기적으로 RBAC 설정을 감사하여 퇴사자, 불필요한 권한, 과도한 와일드카드(*) 사용을 식별하고 정리합니다.

확인 방법:kubectl auth can-i --list --as=<user> 또는 rakkess, rbac-lookup 등의 도구로 현재 권한 현황을 분석하고, 분기별 감사를 수행합니다.
Kubernetes Audit Log 활성화

API Server의 감사 로그를 활성화하여 누가 언제 어떤 리소스에 접근했는지 기록하고 추적합니다.

확인 방법:API Server의 --audit-policy-file 및 --audit-log-path 플래그가 설정되어 있는지 확인하고, 감사 정책(AuditPolicy)의 규칙을 점검합니다.
런타임 위협 탐지 도구 배포 (Falco)

Falco 등의 런타임 보안 도구를 배포하여 비정상적인 시스템 콜, 파일 접근, 네트워크 활동을 실시간 탐지합니다.

확인 방법:kubectl get pods -n falco로 Falco가 DaemonSet으로 배포되어 있는지 확인하고, falco 로그에서 경고 이벤트를 점검합니다.
정책 엔진(OPA/Kyverno) 적용

Open Policy Agent(OPA Gatekeeper) 또는 Kyverno를 배포하여 클러스터 보안 정책을 코드로 정의하고 자동 적용합니다.

확인 방법:kubectl get constrainttemplates (OPA) 또는 kubectl get clusterpolicy (Kyverno)로 적용된 정책 목록을 확인합니다.
중앙 집중식 로그 수집 (EFK/Loki)

Fluentd, Fluent Bit, Loki 등을 사용하여 모든 컨테이너 로그를 중앙 저장소에 수집하고, 보안 이벤트를 분석합니다.

확인 방법:kubectl get daemonset -A에서 로그 수집 에이전트(fluentd, fluent-bit 등)가 모든 노드에 배포되어 있는지 확인합니다.
보안 이벤트 알림 설정

보안 관련 이벤트(권한 상승 시도, 비인가 접근 등) 발생 시 Slack, PagerDuty 등으로 즉시 알림을 전송합니다.

확인 방법:Falco의 falcosidekick 또는 Alertmanager 규칙에서 보안 관련 알림이 적절한 채널로 전송되도록 설정되어 있는지 확인합니다.
Pod/컨테이너 이상 행위 모니터링

Prometheus와 Grafana를 활용하여 CPU 급증, 메모리 누수, 비정상 재시작 등의 이상 행위를 감시합니다.

확인 방법:kubectl top pods로 리소스 사용량을 확인하고, Grafana 대시보드에서 Pod 재시작 횟수, OOMKilled 이벤트 등의 알림 규칙을 점검합니다.
CIS Kubernetes Benchmark 정기 점검

kube-bench를 사용하여 CIS Kubernetes Benchmark 기준으로 클러스터 보안 설정을 정기적으로 점검합니다.

확인 방법:kube-bench run --targets=master,node 명령을 실행하여 FAIL 항목을 확인하고, 분기별 점검 결과를 추적합니다.
감사 로그 보존 및 무결성 보장

감사 로그를 별도 저장소에 장기 보존하고, 변조 방지를 위해 WORM 스토리지 또는 해시 체인을 적용합니다.

확인 방법:감사 로그가 S3 Object Lock, 별도 SIEM 등 변조 방지 스토리지에 전송되고 있는지, 보존 기간 정책이 설정되어 있는지 확인합니다.