Kubernetes 보안 기본: 견고한 방어 구축

발행: (2026년 1월 4일 오후 05:57 GMT+9)
13 min read
원문: Dev.to

Source: Dev.to

쿠버네티스 공격 표면

Before diving into specific security measures, it’s crucial to understand the various components that constitute the Kubernetes attack surface.

ComponentDescription
Control Plane클러스터의 두뇌 (API Server, etcd, Controller Manager, Scheduler). 이를 손상시키면 공격자는 전체 클러스터에 대한 상당한 제어 권한을 얻습니다.
Worker Nodes애플리케이션 컨테이너가 실행되는 머신. OS, 컨테이너 런타임, kubelet의 취약점을 이용해 노드에 접근하고 전체 클러스터를 장악할 수 있습니다.
Containers컨테이너는 프로세스 격리를 제공하지만, 컨테이너 이미지 자체의 잘못된 구성이나 취약점은 보안 문제를 일으킬 수 있습니다.
Network파드, 서비스 및 외부 엔티티 간의 통신 채널은 주요 공격 벡터입니다. 보안이 취약한 네트워크 구성은 무단 접근이나 데이터 유출을 초래할 수 있습니다.
Data영구 볼륨이나 Secrets에 저장된 민감한 데이터는 무단 접근으로부터 강력히 보호되어야 합니다.
Users & Service Accounts인간 사용자와 쿠버네티스 서비스 계정에 대한 접근 제어가 부적절하면 권한 상승이 발생할 수 있습니다.

Source:

핵심 보안 원칙

포괄적인 Kubernetes 보안 전략은 여러 핵심 원칙을 기반으로 합니다:

1. 최소 권한

엔터티(사용자, 서비스 계정, 프로세스)가 의도된 기능을 수행하는 데 필요한 최소 권한만 부여합니다.

예시: Deployment에 전체 cluster-admin 권한을 부여하는 대신, 해당 네임스페이스 내에서 Deployment, Pod, Service를 관리하도록 명시적으로 허용하는 Role 또는 ClusterRole을 정의합니다.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: deployment-manager
rules:
  - apiGroups: ["apps"]
    resources: ["deployments", "replicasets", "statefulsets"]
    verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch"]

이 Role을 애플리케이션이 사용하는 ServiceAccount에 바인딩합니다.

2. 방어 심층화

여러 보안 제어 레이어를 구현합니다. 하나의 레이어가 실패하더라도 다른 레이어가 남아 전체 침해를 방지합니다.

예시:

  • 파드 간 통신을 제한하는 Network Policy.
  • 보안 모범 사례를 강제하는 Admission Controller.
  • 세밀한 접근 제어를 위한 강력한 RBAC.

3. 불변 인프라

인프라를 일시적인 것으로 취급합니다. 기존 노드/컨테이너를 패치하거나 수정하는 대신, 새로운 보안 버전으로 교체합니다. 이는 구성 드리프트와 지속적인 취약점을 줄여줍니다.

예시: 기본 컨테이너 이미지에서 취약점이 발견되면, 패치를 적용한 새로운 이미지를 빌드하고 업데이트된 이미지를 사용해 애플리케이션을 재배포합니다. 실행 중인 컨테이너에 SSH로 접속해 문제를 수정하는 것은 피합니다.

4. 지속적인 모니터링 및 감사

클러스터를 정기적으로 모니터링하여 의심스러운 활동, 잘못된 구성 및 보안 이벤트를 감시합니다. 누가, 언제, 어디서 무엇을 했는지 추적할 수 있도록 포괄적인 감사를 구현합니다.

예시:

  • API 요청을 캡처하기 위해 Kubernetes 감사 로그를 활성화합니다.
  • kube-audit, Falco와 같은 도구를 사용하거나 로그를 SIEM(보안 정보 및 이벤트 관리) 시스템과 연동해 이상 징후를 탐지합니다.

Essential Security Controls

1. API Server

API 서버는 클러스터의 중앙 게이트웨이입니다.

  • Authentication – 강력한 메커니즘(TLS 클라이언트 인증서, OIDC, 서비스‑계정 토큰)을 적용합니다.
  • Authorization (RBAC) – 세분화된 Roles/ClusterRoles를 정의하고 RoleBindings/ClusterRoleBindings를 통해 바인딩합니다.

2. Network Policies

네트워크 정책은 클러스터를 분리하고 트래픽 흐름을 제어합니다.

기본적으로 모든 파드는 자유롭게 통신할 수 있습니다. 네트워크 정책을 사용하면 이를 변경할 수 있습니다.

예시: 프론트엔드 파드가 백엔드 파드와 포트 80으로 통신하도록 허용하고, 백엔드에 대한 기타 모든 인바운드 트래픽은 차단합니다.

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: backend-allow-frontend
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: backend
  policyTypes:
    - Ingress
  ingress:
    - from:
        - podSelector:
            matchLabels:
              app: frontend
      ports:
        - protocol: TCP
          port: 80

3. Service Mesh (Optional)

고급 네트워크 보안 기능을 위해 Istio 또는 Linkerd와 같은 서비스 메쉬를 고려하십시오.

  • 파드‑간 통신을 암호화하는 Mutual TLS (mTLS).
  • 세밀한 트래픽 제어.
  • 향상된 가시성.

4. Container Image Security

컨테이너 이미지 보안은 기본입니다.

  • Image Scanning – 배포 전 이미지에 알려진 취약점(CVE)이 있는지 스캔하고, CI/CD 파이프라인에 스캔을 통합합니다.
  • Minimal Base Images – 공격 표면을 줄이기 위해 경량이고 신뢰할 수 있는 베이스(예: alpine)를 사용합니다.
  • Don’t Run as Root – 컨테이너를 비루트 사용자로 실행하도록 구성합니다.

Dockerfile Example:

# Use a minimal base image
FROM alpine:3.18

# Add a non‑root user
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# Switch to the non‑root user
USER appuser

# ... rest of the Dockerfile ...

마무리 생각

Kubernetes 보안은 프로세스, 기술, 그리고 사람을 결합한 지속적인 여정입니다. 공격 표면을 이해하고, 핵심 보안 원칙을 적용하며, RBAC, 네트워크 정책, 불변 인프라, 지속적인 모니터링과 같은 구체적인 제어를 구현함으로써 워크로드, 데이터 및 평판을 보호하는 탄력적인 방어 체계를 구축할 수 있습니다.

경계를 유지하고, 도구를 최신 상태로 유지하며, 클러스터의 모든 구성 요소를 강화해야 할 잠재적인 진입점으로 간주하세요.

문서 끝

FROM alpine:latest
# ... other instructions
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
USER appuser
# ... rest of your Dockerfile

Secure the Pods Themselves

Pod Security Standards (PSS) / Pod Security Admission (PSA)

Kubernetes는 포드 수준에서 보안 모범 사례를 적용하기 위한 내장 메커니즘을 제공합니다. PSA는 네임스페이스 수준에서 PSS를 적용하여 포드가 과도한 권한으로 실행되는 것을 방지합니다.

Security Context

포드 또는 컨테이너 사양에 securityContext를 설정하여 권한 상승을 제어하고, Seccomp 프로파일, AppArmor 프로파일, SELinux 컨텍스트 등을 지정합니다.

예시 – 컨테이너에 대한 권한 상승 비활성화

apiVersion: v1
kind: Pod
metadata:
  name: restricted-pod
spec:
  containers:
  - name: my-container
    image: nginx
    securityContext:
      allowPrivilegeEscalation: false

민감한 정보 보호 (API 키, 비밀번호, 인증서)

  • Kubernetes SecretsSecret 객체에 민감한 데이터를 저장합니다.
  • Encryption at Restetcd를 구성하여 비밀을 디스크에 암호화합니다.
  • External Secrets Managers – HashiCorp Vault, AWS Secrets Manager, Azure Key Vault 등과 통합하여 중앙 집중식 관리 및 보안을 강화합니다.

기본 인프라 보안

  • 정기 패치 – 워커 노드의 OS와 컨테이너 런타임을 최신 보안 패치로 최신 상태로 유지합니다.
  • 보안 구성 – 노드 구성을 강화하고 불필요한 서비스와 포트를 비활성화합니다.
  • 런타임 보안 – Falco, Sysdig Secure와 같은 런타임 보안 도구를 배포하여 컨테이너와 노드 내 의심스러운 활동을 감지하고 알립니다.

어드미션 컨트롤러

어드미션 컨트롤러는 인증 및 인가가 완료된 후, 객체가 영구 저장되기 전 Kubernetes API 서버에 대한 요청을 가로챕니다. 보안 정책을 적용할 수 있습니다.

  • 내장 어드미션 컨트롤러 – 예: PodSecurity (PSA용), NamespaceLifecycle, LimitRanger.
  • 동적 어드미션 컨트롤러 – 웹훅을 사용해 고급 정책 적용을 수행합니다. OPA Gatekeeper 또는 Kyverno와 같은 도구를 통해 세밀한 정책 정의와 적용이 가능합니다.

예시 – 모든 컨테이너 이미지가 신뢰할 수 있는 레지스트리에서 가져오도록 하는 OPA Gatekeeper 정책

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedRepos
metadata:
  name: trusted-registry
spec:
  enforcementAction: deny
  parameters:
    repos:
    - "mytrustedregistry.com"

포괄적인 로깅 및 감사

  • Audit Logs – Kubernetes API 서버에 대한 상세 감사 로깅을 활성화합니다.
  • Container Logs – 애플리케이션이 유용한 로그를 출력하고 해당 로그가 수집되도록 보장합니다.
  • Centralized Logging – 모든 클러스터 구성 요소와 애플리케이션의 로그를 중앙 시스템(예: Elasticsearch, Loki, Splunk)으로 전달하여 분석 및 알림에 활용합니다.

최종 생각

Kubernetes 클러스터를 보호하는 것은 지속적인 프로세스이며, 일회성 작업이 아닙니다. 다음과 같이:

  1. 공격 표면을 이해하고,
  2. 최소 권한 및 방어 깊이 원칙을 적용하며,
  3. API 서버, 네트워크, 이미지, 파드, 시크릿 및 노드에 대한 강력한 제어를 구현하고,
  4. 어드미션 컨트롤러를 활용하며,
  5. 포괄적인 로깅 및 지속적인 모니터링을 유지함으로써,

Kubernetes 보안 태세를 크게 강화할 수 있습니다. 정기적인 보안 평가, 지속적인 경계, 그리고 최신 모범 사례를 따르는 것이 안전하고 회복력 있는 Kubernetes 환경을 위해 필수적입니다.

Back to Blog

관련 글

더 보기 »

⚓ 쿠버네티스, 5살 아이에게 설명하듯

소개 수백 개의 컨테이너가 있는 분주한 항구를 상상해 보세요. 누군가가 다음을 해야 합니다: - 어떤 선박이 어떤 컨테이너를 운송할지 결정한다 - 고장 난 컨테이너를 교체한다.

쿠버네티스 클라우드 환경, 전사적 가시성 확보할 때

클라우드 성능은 여전히 안개 속에 있다. 많은 기업이 클라우드 전환을 마쳤거나 진행 중이지만, 정작 클라우드 환경 전반에 대한 가시성을 충분히 확보하고 있는지에 대해서는 여전히 의문이 남는다. 현재 어떤 도구를 사용하고 있는지, 그 도구가 실제로 효과적인지, 그리고 클라우드 뿐 아니라...