Kubernetes 보안 체크 포인트
Kubernetes 클러스터의 보안은 다층적 접근이 필요한 복잡한 영역으로, 인프라 계층부터 애플리케이션 계층까지 광범위한 보안 통제가 요구된다. 효과적인 보안 관리를 위해서는 체계적인 체크 포인트를 기반으로 정기적인 점검과 개선이 이루어져야 한다.
클러스터 구성 및 API 서버 보안
API 서버는 Kubernetes 클러스터의 중심 통제점으로 모든 작업이 이를 통해 이루어지므로 가장 중요한 보안 대상이다. API 서버 접근은 반드시 TLS를 통해 암호화되어야 하며, 자체 서명된 인증서가 아닌 신뢰할 수 있는 인증 기관의 인증서를 사용해야 한다. 익명 접근은 반드시 비활성화해야 하며, anonymous-auth 플래그를 false로 설정하여 인증되지 않은 요청을 차단한다. 안전하지 않은 포트는 완전히 비활성화하고 insecure-port를 0으로 설정해야 한다. API 서버는 공개 인터넷에 직접 노출되어서는 안 되며, 방화벽이나 VPN을 통해 접근을 제한해야 한다. 감사 로깅을 활성화하여 모든 API 호출을 기록하고, 이상 행위를 탐지할 수 있도록 로그를 중앙 집중식으로 관리해야 한다.
인증 및 권한 관리
강력한 인증 메커니즘 구현은 필수적이다. 클라이언트 인증서 기반 인증보다는 OIDC나 webhook 토큰 인증을 사용하는 것이 관리 측면에서 유리하다. 서비스 어카운트 토큰은 자동 마운트를 비활성화하고 필요한 경우에만 명시적으로 마운트해야 한다. 장기 유효 토큰 사용을 피하고 토큰 만료 시간을 적절히 설정해야 한다. RBAC은 반드시 활성화해야 하며, 최소 권한 원칙에 따라 역할을 설계한다. 클러스터 전체 권한을 부여하는 ClusterRole 사용은 최소화하고, 네임스페이스 단위의 Role을 우선 사용해야 한다. cluster-admin 역할의 사용은 극도로 제한적이어야 하며, 일반 사용자나 서비스 어카운트에 부여해서는 안 된다. 모든 역할 바인딩은 정기적으로 검토하여 불필요한 권한을 제거해야 한다. 기본 서비스 어카운트에 추가 권한을 부여하지 않으며, 각 워크로드는 전용 서비스 어카운트를 사용해야 한다.
네트워크 보안 및 격리
네트워크 정책은 반드시 구현해야 하며, 기본적으로 모든 트래픽을 거부하고 필요한 통신만 명시적으로 허용하는 화이트리스트 방식을 채택한다. Pod 간 통신은 필요한 경우에만 허용하며, 네임스페이스 간 통신은 더욱 엄격히 제한한다. Ingress와 Egress 정책을 모두 정의하여 인바운드와 아웃바운드 트래픽을 통제한다. 프로덕션 환경에서는 네트워크 정책을 지원하는 CNI 플러그인을 사용해야 하며, Calico, Cilium, Weave 등이 일반적으로 사용된다. 서비스 메시를 도입하는 경우 Istio나 Linkerd를 통해 mTLS 기반의 서비스 간 암호화 통신을 구현할 수 있다. 외부 로드밸런서나 NodePort 서비스는 신중하게 사용하며, 가능한 경우 Ingress 컨트롤러를 통한 접근을 권장한다.
Pod 보안 표준 및 정책
Pod Security Standards는 Kubernetes 1.23부터 베타로 제공되는 보안 프레임워크로, restricted 프로파일을 기본으로 적용하고 필요한 경우에만 완화해야 한다. 특권 컨테이너 실행은 절대적으로 필요한 경우를 제외하고 금지해야 하며, privileged 플래그를 false로 설정한다. 호스트 네임스페이스 사용은 hostNetwork, hostPID, hostIPC를 모두 false로 설정하여 차단한다. 루트 사용자로 컨테이너를 실행하지 않으며, runAsNonRoot를 true로 설정하고 runAsUser로 특정 UID를 지정한다. 읽기 전용 루트 파일시스템을 사용하여 readOnlyRootFilesystem을 true로 설정하고, 쓰기가 필요한 경로는 emptyDir 볼륨으로 마운트한다. 리소스 제한은 모든 컨테이너에 대해 설정하여 리소스 고갈 공격을 방지하며, requests와 limits를 적절히 구성한다. 보안 컨텍스트에서 capabilities는 필요한 최소한만 추가하고, 위험한 capabilities는 명시적으로 드롭한다.
시크릿 및 민감 데이터 관리
Kubernetes Secret은 기본적으로 base64 인코딩만 되어 있어 암호화되지 않으므로, etcd 암호화를 반드시 활성화해야 한다. EncryptionConfiguration을 사용하여 저장 시 암호화를 구현하며, 주기적으로 암호화 키를 로테이션한다. 외부 시크릿 관리 솔루션인 HashiCorp Vault, AWS Secrets Manager, Azure Key Vault 등의 사용을 고려한다. External Secrets Operator를 통해 외부 시크릿 저장소와 Kubernetes를 통합할 수 있다. 시크릿은 환경 변수가 아닌 볼륨 마운트로 주입하는 것이 더 안전하며, 프로세스 리스팅을 통한 노출을 방지한다. ConfigMap에는 절대 민감 정보를 저장하지 않으며, 민감하지 않은 설정 데이터만 포함한다. RBAC을 통해 시크릿 접근 권한을 엄격히 제한하고, 불필요한 네임스페이스의 시크릿 접근을 차단한다.
컨테이너 이미지 보안
신뢰할 수 있는 레지스트리만 사용하며, 공개 레지스트리의 이미지는 검증 없이 사용하지 않는다. 프라이빗 레지스트리를 운영하거나 AWS ECR, Google GCR, Azure ACR 등 관리형 서비스를 활용한다. 이미지 서명과 검증을 구현하여 Notary나 Sigstore Cosign을 통해 이미지 무결성을 보장한다. 이미지 스캐닝은 CI/CD 파이프라인에 통합하여 빌드 시점과 런타임에 모두 수행한다. Trivy, Clair, Anchore 등의 도구를 사용하여 취약점을 탐지하고, 심각도가 높은 취약점이 발견된 이미지는 배포를 차단한다. 최신 태그나 latest 태그 사용을 금지하고, 명시적인 버전 태그나 다이제스트를 사용한다. 최소한의 베이스 이미지를 사용하여 공격 표면을 줄이며, Alpine, Distroless, Scratch 기반 이미지를 고려한다. 정기적으로 이미지를 업데이트하고 재빌드하여 최신 보안 패치를 적용한다.
노드 보안
노드 운영체제는 최신 보안 패치를 적용한 상태로 유지하며, 자동 업데이트나 정기적인 패치 사이클을 수립한다. 불필요한 서비스와 포트는 비활성화하고, 방화벽 규칙을 통해 필요한 통신만 허용한다. SSH 접근은 키 기반 인증만 허용하고 루트 로그인을 비활성화한다. Kubelet 보안 설정에서 익명 인증을 비활성화하고, 인증서 기반 인증을 사용한다. 읽기 전용 포트를 비활성화하여 무단 접근을 차단한다. 노드에 직접 접근하는 대신 bastion 호스트나 점프 서버를 통한 접근을 강제한다. 컨테이너 런타임 보안을 강화하여 containerd나 CRI-O의 최신 버전을 사용하고, 런타임 보안 정책을 적용한다. AppArmor나 SELinux를 활성화하여 커널 수준의 보안을 강화한다.
감사 및 모니터링
포괄적인 감사 로깅을 구현하여 모든 API 서버 요청을 기록하고, 감사 정책을 통해 중요한 이벤트를 필터링한다. 로그는 중앙 집중식 로깅 시스템으로 전송하여 ELK Stack, Splunk, Datadog 등에서 분석한다. 보안 이벤트 모니터링을 위해 Falco를 배포하여 런타임 이상 행위를 탐지한다. 예상치 못한 시스템 콜, 네트워크 연결, 파일 접근 등을 실시간으로 감지하고 알림을 발생시킨다. 메트릭 수집 및 알림 시스템을 구축하여 Prometheus와 Grafana를 통해 클러스터 상태를 모니터링한다. 비정상적인 리소스 사용, 실패한 인증 시도, 권한 상승 이벤트 등에 대한 알림을 설정한다. 정기적인 보안 스캔을 수행하여 kube-bench로 CIS Kubernetes Benchmark 준수 여부를 확인하고, kube-hunter로 클러스터 취약점을 탐색한다.
공급망 보안
소프트웨어 구성 요소 명세서인 SBOM을 생성하고 유지하여 모든 의존성을 추적한다. Helm 차트나 Operator를 사용하는 경우 신뢰할 수 있는 소스에서만 설치하고, 차트 검증을 수행한다. 써드파티 컨트롤러나 애드온은 철저히 검토한 후 설치하며, 필요한 권한만 부여한다. CI/CD 파이프라인 보안을 강화하여 파이프라인 자체가 공격 벡터가 되지 않도록 한다. 빌드 환경을 격리하고, 시크릿을 안전하게 관리하며, 배포 승인 프로세스를 구현한다.
재해 복구 및 백업
etcd 백업을 정기적으로 수행하고 암호화하여 저장한다. 백업 복구 절차를 정기적으로 테스트하여 실제 재해 상황에서 신속히 대응할 수 있도록 한다. 네임스페이스별 리소스 백업을 수행하여 Velero 등의 도구를 활용한다. 재해 복구 계획을 수립하고 정기적으로 훈련을 실시하며, 복구 목표 시간과 복구 시점 목표를 명확히 정의한다.
컴플라이언스 및 거버넌스
조직의 보안 정책을 코드로 구현하여 OPA나 Kyverno를 통해 정책 엔진을 배포한다. 규정 준수 요구사항을 자동으로 검증하고, 위반 사항을 사전에 차단한다. 정기적인 보안 감사를 수행하고, 내부 감사와 외부 감사를 병행한다. 보안 사고 대응 계획을 수립하고, 인시던트 발생 시 대응 절차를 문서화한다. 보안 교육을 정기적으로 실시하여 개발자와 운영자가 보안 모범 사례를 이해하고 적용할 수 있도록 한다.
결론적으로 Kubernetes 보안은 단일 도구나 기술로 해결할 수 없는 복합적인 과제이다. 체계적인 체크 포인트를 기반으로 지속적인 점검과 개선을 수행하고, 자동화된 도구와 인간의 전문성을 결합하여 다층 방어 체계를 구축해야 한다. 보안은 일회성 작업이 아닌 지속적인 프로세스로, 위협 환경의 변화에 따라 계속 진화해야 한다.
