본문 바로가기
클라우드/쿠버네티스

👮‍♂️ 내 컨테이너의 경호원! 쿠버네티스 SecurityContext 기초 다지기

by gasbugs 2025. 9. 3.

안녕하세요, 보안을 생각하는 쿠버네티스 사용자 여러분! 🛡️ 우리는 애플리케이션을 멋지게 컨테이너화해서 쿠버네티스에 배포했지만, 혹시 보안에 대해서는 잠시 잊고 계시진 않았나요? 특히 여러 팀이 함께 사용하는 멀티-테넌트 클러스터 환경에서 보안은 아무

리 강조해도 지나치지 않습니다.

 

컨테이너가 'root'라는 막강한 권한으로 실행된다면, 해커가 컨테이너를 탈취했을 때 해당 노드 전체에 심각한 피해를 줄 수 있습니다. 😱 이를 방지하기 위해 쿠버네티스는 우리에게 securityContext 라는 강력한 보안 설정 도구를 제공합니다.

 

오늘은 CKAD 시험 수준에서 꼭 알아야 할 securityContext의 핵심 기능, 즉 컨테이너의 권한을 최소화하여 더 안전하게 만드는 방법에 대해 알아보겠습니다.

 


SecurityContext: 컨테이너를 위한 맞춤형 보안 규칙

securityContext는 파드(Pod) 또는 개별 컨테이너 수준에서 정의할 수 있는 보안 관련 옵션들의 모음입니다. 이를 통해 "이 컨테이너는 어떤 사용자로 실행되어야 하는가?", "파일 시스템을 수정할 수 있는가?" 와 같은 세세한 규칙을 지정할 수 있습니다.

핵심은 바로 '최소 권한의 원칙(Principle of Least Privilege)'을 적용하는 것입니다. 컨테이너가 작업을 수행하는 데 필요한 딱 그만큼의 권한만 부여하여, 만일의 사태가 발생하더라도 피해를 최소화하는 것이죠.

1. runAsUser: root가 아닌 일반 사용자로 컨테이너 실행하기 👤

리눅스에서 root (UID 0) 사용자는 모든 것을 할 수 있는 신과 같은 존재입니다. 컨테이너가 root 권한으로 실행되는 것은 보안 상 매우 위험합니다. securityContext의 runAsUser 필드를 사용하면 컨테이너 내의 프로세스가 지정된 사용자 ID(UID)로 실행되도록 강제할 수 있습니다.

  • 역할: 컨테이너가 시작될 때 실행되는 프로세스의 사용자 ID(UID)를 지정합니다.
  • 왜 중요한가?: root가 아닌 일반 사용자(예: UID 1000)로 실행하면, 컨테이너가 해킹당하더라도 공격자는 시스템 파일을 수정하거나, 패키지를 설치하거나, 다른 프로세스를 건드리는 등의 위험한 행동을 할 수 없게 됩니다.
  • YAML 예시:위 파드를 실행하고 kubectl exec -it non-root-pod -- whoami를 실행해보면, root가 아닌 1001 (또는 해당 UID의 사용자 이름)이 출력되는 것을 볼 수 있습니다.
    apiVersion: v1
    kind: Pod
    metadata:
      name: non-root-pod
    spec:
      containers:
      - name: my-app
        image: busybox:1.28
        command: ["sh", "-c", "sleep 1h && whoami"]
        securityContext:
          runAsUser: 1001 # 이 컨테이너는 UID 1001 사용자로 실행된다.
          # runAsGroup: 3000 # GID를 지정할 수도 있다.
    

2. runAsNonRoot: "root 사용자 절대 금지!" 스위치 🚫

runAsUser로 특정 사용자를 지정하는 대신, "그냥 root만 아니면 돼!"라고 선언하고 싶을 때가 있습니다. runAsNonRoot: true는 바로 그런 역할을 하는 간편한 안전 스위치입니다.

  • 역할: 이 값이 true로 설정되면, 쿠버네티스는 해당 컨테이너가 root(UID 0)로 실행되려고 할 경우 컨테이너 시작 자체를 막아버립니다.
  • 왜 중요한가?: Dockerfile에서 USER를 지정하는 것을 잊었거나, root로 실행되도록 만들어진 써드파티 이미지를 실수로 사용하는 것을 방지하는 강력한 정책 도구가 됩니다.
  • YAML 예시:
    apiVersion: v1
    kind: Pod
    metadata:
      name: non-root-enforced-pod
    spec:
      securityContext:
        runAsNonRoot: true # 이 파드의 모든 컨테이너는 non-root로만 실행 가능
      containers:
      - name: my-app
        image: redis # Redis 이미지는 기본적으로 non-root(redis) 사용자로 실행됨 (성공)
        # image: busybox:1.28 # busybox는 기본적으로 root로 실행되므로 이 파드는 실패함!
    

🎉 결론: 작은 설정으로 큰 보안 효과를!

securityContext는 복잡한 보안 솔루션이 아닙니다. YAML 파일에 단 몇 줄을 추가하는 것만으로도 컨테이너의 보안 수준을 크게 향상시킬 수 있는, 개발자가 반드시 알아야 할 기본적이면서도 효과적인 기능입니다.

  • runAsUser로 특정 사용자를 지정하거나,
  • runAsNonRoot: true로 root 실행을 원천 봉쇄하는 습관을 들이세요.

이러한 작은 노력이 모여 여러분의 쿠버네티스 클러스터를 훨씬 더 안전한 환경으로 만들어 줄 것입니다. 지금 바로 여러분의 Pod 정의를 열어 securityContext를 추가해보는 것은 어떨까요?

 

 

Tags: 쿠버네티스, Kubernetes, 보안, SecurityContext, CKAD, DevOps, 컨테이너보안, non-root