컨테이너/K8s 보안 체크리스트
컨테이너 및 Kubernetes 환경의 보안 설정을 점검하세요. · 2025.02 기준
공식 레지스트리 또는 조직 내부에서 검증된 베이스 이미지만 사용하여 공급망 공격 위험을 줄입니다.
CI/CD 파이프라인에 Trivy, Grype 등의 취약점 스캐너를 통합하여 빌드 시점에 알려진 CVE를 탐지합니다.
latest 등 변경 가능한 태그 대신 이미지 다이제스트를 지정하여 배포 시 이미지 무결성을 보장합니다.
Cosign 또는 Notary를 활용하여 이미지에 서명하고, 배포 전 서명을 검증하여 변조를 방지합니다.
불필요한 패키지와 셸을 제거한 최소 이미지를 사용하여 공격 표면을 줄입니다.
컨테이너 레지스트리에 인증 및 권한 관리를 적용하여 무단 이미지 푸시/풀을 방지합니다.
멀티스테이지 빌드를 사용하여 컴파일러, 빌드 도구 등이 최종 이미지에 포함되지 않도록 합니다.
securityContext에서 runAsNonRoot: true를 설정하여 컨테이너가 root 권한으로 실행되지 않도록 합니다.
컨테이너의 루트 파일시스템을 읽기 전용으로 설정하여 런타임 중 악성 파일 생성을 방지합니다.
allowPrivilegeEscalation을 false로 설정하여 setuid 바이너리 등을 통한 권한 상승을 차단합니다.
모든 Capabilities를 DROP 한 뒤 필요한 것만 ADD하여 컨테이너에 부여되는 커널 권한을 최소화합니다.
RuntimeDefault 또는 커스텀 Seccomp 프로파일을 적용하여 허용되지 않은 시스템 콜을 차단합니다.
AppArmor 또는 SELinux 프로파일을 사용하여 컨테이너의 파일 접근 및 프로세스 실행 범위를 제한합니다.
Namespace에 Pod Security Admission을 설정하여 baseline 또는 restricted 보안 표준을 강제합니다.
CPU와 메모리 리소스 제한을 설정하여 리소스 고갈(DoS) 공격 및 노이지 네이버 문제를 방지합니다.
Namespace에 기본 Deny 정책을 적용하여 명시적으로 허용되지 않은 모든 Ingress/Egress 트래픽을 차단합니다.
필요한 Pod 간 통신만 허용하는 세분화된 NetworkPolicy를 작성하여 측면 이동(Lateral Movement)을 방지합니다.
외부로 나가는 트래픽을 필요한 대상(DNS, API 엔드포인트 등)으로만 제한하여 데이터 유출을 방지합니다.
Ingress 리소스에 유효한 TLS 인증서를 설정하여 외부 트래픽의 암호화를 보장합니다.
서비스 메시를 사용하여 Pod 간 통신에 상호 TLS(mTLS)를 적용하여 내부 트래픽도 암호화합니다.
클러스터 내 CoreDNS 설정을 검토하고, Pod가 불필요한 외부 DNS 서버에 접근하지 않도록 제한합니다.
Kubernetes API Server에 접근할 수 있는 네트워크 대역을 제한하여 외부로부터의 무단 접근을 차단합니다.
etcd에 저장되는 Secret 리소스를 AES-CBC 또는 AES-GCM으로 암호화하여 저장 시 보호합니다.
Secret을 환경변수로 노출하면 로그나 프로세스 목록에 유출될 위험이 있으므로 볼륨 마운트 방식을 사용합니다.
HashiCorp Vault, AWS Secrets Manager 등 외부 시크릿 관리 서비스와 연동하여 Secret의 생명주기를 중앙 관리합니다.
Secret 리소스에 대한 get, list, watch 권한을 필요한 ServiceAccount에만 부여하여 민감 정보 접근을 제한합니다.
Secret(비밀번호, API 키, 인증서 등)을 주기적으로 교체하여 유출된 자격 증명의 악용 기간을 최소화합니다.
Secret 값이 소스 코드나 Helm values 파일에 평문으로 포함되지 않도록 git-secrets, gitleaks 등의 도구로 검사합니다.
GitOps 환경에서 Secret을 안전하게 관리하기 위해 Sealed Secrets 또는 Mozilla SOPS를 사용하여 암호화된 상태로 저장합니다.
Pod에 default ServiceAccount 대신 전용 ServiceAccount를 생성하여 할당함으로써 불필요한 권한 부여를 방지합니다.
API Server에 접근할 필요가 없는 Pod에서는 automountServiceAccountToken을 false로 설정하여 토큰 노출을 방지합니다.
cluster-admin 등 광범위한 ClusterRole 바인딩을 최소화하고, 필요한 리소스와 동사(verb)만 허용합니다.
팀, 환경, 서비스별로 Namespace를 분리하고, ResourceQuota와 LimitRange로 리소스 사용을 제한합니다.
ClusterRole 대신 Namespace 범위의 Role/RoleBinding을 사용하여 권한 범위를 최소화합니다.
API Server에 대한 익명 요청을 비활성화하여 인증되지 않은 사용자의 클러스터 정보 조회를 차단합니다.
API Server에 정적 토큰이나 인증서 대신 OIDC 기반 외부 ID 공급자를 연동하여 중앙 집중식 인증을 구현합니다.
정기적으로 RBAC 설정을 감사하여 퇴사자, 불필요한 권한, 과도한 와일드카드(*) 사용을 식별하고 정리합니다.
API Server의 감사 로그를 활성화하여 누가 언제 어떤 리소스에 접근했는지 기록하고 추적합니다.
Falco 등의 런타임 보안 도구를 배포하여 비정상적인 시스템 콜, 파일 접근, 네트워크 활동을 실시간 탐지합니다.
Open Policy Agent(OPA Gatekeeper) 또는 Kyverno를 배포하여 클러스터 보안 정책을 코드로 정의하고 자동 적용합니다.
Fluentd, Fluent Bit, Loki 등을 사용하여 모든 컨테이너 로그를 중앙 저장소에 수집하고, 보안 이벤트를 분석합니다.
보안 관련 이벤트(권한 상승 시도, 비인가 접근 등) 발생 시 Slack, PagerDuty 등으로 즉시 알림을 전송합니다.
Prometheus와 Grafana를 활용하여 CPU 급증, 메모리 누수, 비정상 재시작 등의 이상 행위를 감시합니다.
kube-bench를 사용하여 CIS Kubernetes Benchmark 기준으로 클러스터 보안 설정을 정기적으로 점검합니다.
감사 로그를 별도 저장소에 장기 보존하고, 변조 방지를 위해 WORM 스토리지 또는 해시 체인을 적용합니다.