Security - 도커 보안 기초 + 쿠버네티스의 Security Context

2026. 1. 2. 17:43·CKA

Kubernetes의 securityContext(보안 컨텍스트)는 “컨테이너 런타임이 리눅스에서 제공하는 보안 메커니즘(사용자/권한/capabilities 등)을 어떻게 적용할지”를 YAML로 선언하는 기능입니다.

그래서 먼저 Docker 보안 개념을 정리하고, 그 개념이 Kubernetes securityContext로 어떻게 매핑되는지까지 한 번에 연결합니다.


1) 컨테이너는 VM이 아니다: 커널을 공유한다

가상 머신(VM)은 게스트 OS 커널을 따로 갖지만, 컨테이너는 호스트와 동일한 커널을 공유합니다.
그럼에도 분리된 것처럼 보이는 이유는 Linux namespaces 덕분입니다.

  • 호스트는 호스트 네임스페이스
  • 컨테이너는 컨테이너 네임스페이스
  • 컨테이너 프로세스는 “실제로는 호스트에서 실행”되지만, 네임스페이스로 인해 자기 영역만 보이도록 격리됩니다.

2) 프로세스 격리: PID namespace로 프로세스가 다르게 보인다

예를 들어 1시간 sleep 하는 Ubuntu 컨테이너를 띄우면:

docker run -d --name sleepy ubuntu:22.04 sleep 3600

컨테이너 내부에서 프로세스를 보면:

docker exec -it sleepy ps aux

컨테이너 내부에서는 sleep가 PID 1로 보이기도 합니다. 반면 호스트에서 보면:

ps aux | grep sleep

같은 프로세스가 보이지만 PID는 다릅니다.
이는 프로세스가 “서로 다른 PID 네임스페이스”에 속해 있기 때문입니다.


3) 사용자 격리: 컨테이너 기본은 root로 실행된다

Docker는 기본적으로 컨테이너 내 프로세스를 root 사용자로 실행합니다.

확인:

docker exec -it sleepy id
# uid=0(root) gid=0(root) ...

3.1 실행 시점 사용자 지정: --user

docker run --rm -it --user 1000:1000 ubuntu:22.04 id
# uid=1000 gid=1000 ...

3.2 이미지 자체에 사용자 지정: Dockerfile USER

FROM ubuntu:22.04
RUN useradd -u 1000 -m appuser
USER 1000
CMD ["sleep", "3600"]

4) “컨테이너 root”는 위험하지 않나? → capabilities로 제한된다

컨테이너 내 root는 “호스트 root와 완전히 동일한 무제한 권한”이 아닙니다.
Docker는 Linux capabilities(권한 조각) 로 root의 능력을 제한합니다.

  • root가 할 수 있는 일을 여러 capability로 쪼개고
  • 컨테이너에는 기본적으로 제한된 capability 셋만 부여합니다.

따라서 컨테이너 프로세스는 기본 설정만으로는 호스트 재부팅, 커널 레벨 변경, 다른 컨테이너 방해 등 고위험 작업을 쉽게 할 수 없습니다.


5) Docker 권한 조정: --cap-add, --cap-drop, --privileged

5.1 capability 추가

docker run --rm -it --cap-add NET_ADMIN ubuntu:22.04 bash

5.2 capability 제거(드롭)

docker run --rm -it --cap-drop ALL ubuntu:22.04 bash

5.3 --privileged (운영에서는 매우 위험)

docker run --rm -it --privileged ubuntu:22.04 bash

6) Kubernetes SecurityContext: Docker에서 하던 보안 옵션을 YAML로 선언한다

이전 강의에서 본 것처럼 Docker는 컨테이너 실행 시:

  • 어떤 사용자 ID로 실행할지
  • 어떤 Linux capability를 추가/제거할지

같은 “보안 표준”을 옵션으로 제어할 수 있었습니다.
Kubernetes에서도 동일한 종류의 보안 설정을 securityContext로 구성할 수 있습니다.

그리고 Kubernetes에서 컨테이너는 보통 Pod로 캡슐화됩니다.


7) 보안 컨텍스트 적용 범위: Pod 레벨 vs Container 레벨

Kubernetes에서는 securityContext를:

  • Pod 레벨
  • Container 레벨

둘 중 어디에 설정할지 선택할 수 있습니다.

7.1 Pod 레벨에 설정하면?

  • Pod에 포함된 모든 컨테이너에 적용됩니다.

7.2 Pod와 Container 둘 다 설정하면?

  • 컨테이너 레벨 설정이 우선합니다.
    즉, “Pod 공통 기본값 + 컨테이너별 예외” 패턴이 가능합니다.

8) 예제: sleep로 테스트하는 Pod 정의 파일

강의처럼 ubuntu 이미지에서 sleep 명령으로 동작을 확인하는 Pod를 예로 들겠습니다.

8.1 Pod 레벨 securityContext로 실행 사용자 설정 (runAsUser)

Pod 스펙 아래(= spec 아래)에 securityContext를 둡니다.

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleep-pod
spec:
  securityContext:
    runAsUser: 1000
  containers:
  - name: ubuntu
    image: ubuntu:22.04
    command: ["bash", "-lc", "id && sleep 3600"]

이 설정은 Pod 내 모든 컨테이너에 적용됩니다.


8.2 동일 설정을 Container 레벨로 옮기기

컨테이너 수준에서 설정하려면 containers[].securityContext 아래로 이동합니다.

apiVersion: v1
kind: Pod
metadata:
  name: ubuntu-sleep-pod
spec:
  containers:
  - name: ubuntu
    image: ubuntu:22.04
    command: ["bash", "-lc", "id && sleep 3600"]
    securityContext:
      runAsUser: 1000

8.3 Pod와 Container 둘 다 있을 때: 컨테이너가 우선

예: Pod는 1000, 특정 컨테이너만 2000으로 실행

apiVersion: v1
kind: Pod
metadata:
  name: mixed-users
spec:
  securityContext:
    runAsUser: 1000
  containers:
  - name: c1
    image: ubuntu:22.04
    command: ["bash", "-lc", "id && sleep 3600"]
  - name: c2
    image: ubuntu:22.04
    command: ["bash", "-lc", "id && sleep 3600"]
    securityContext:
      runAsUser: 2000

9) capabilities 추가: capabilities.add / 제거: capabilities.drop

Docker의 --cap-add/--cap-drop과 같은 개념을 Kubernetes에서는 capabilities로 설정합니다.

예: 특정 capability를 추가하고 싶다면:

apiVersion: v1
kind: Pod
metadata:
  name: cap-add-demo
spec:
  containers:
  - name: ubuntu
    image: ubuntu:22.04
    command: ["bash", "-lc", "capsh --print && sleep 3600"]
    securityContext:
      capabilities:
        add: ["NET_ADMIN"]

반대로 전부 드롭하고 필요한 것만 최소로 추가하는 패턴:

securityContext:
  capabilities:
    drop: ["ALL"]
    add: ["NET_BIND_SERVICE"]

10) 확인 커맨드(실습용)

Pod 생성:

kubectl apply -f pod.yaml

Pod 안에서 사용자 확인:

kubectl exec -it ubuntu-sleep-pod -- id

capability 확인(이미지에 따라 도구가 없을 수 있음):

kubectl exec -it cap-add-demo -- sh -lc 'capsh --print || cat /proc/1/status | grep Cap'

11) 정리

  • Docker에서 컨테이너 보안은 namespaces(격리) + user(사용자) + capabilities(권한 조각)로 구성된다.
  • Docker 실행 옵션(--user, --cap-add, --cap-drop, --privileged)으로 보안 수준을 조절할 수 있다.
  • Kubernetes에서는 컨테이너가 Pod로 캡슐화되며, 동일한 개념을 securityContext로 설정한다.
  • securityContext는 Pod 레벨 또는 Container 레벨에 설정 가능하다.
    • Pod 레벨: 모든 컨테이너에 적용
    • 둘 다 설정: 컨테이너 설정이 우선

 

 

Practice Test: https://uklabs.kodekloud.com/topic/practice-test-security-contexts-2/

'CKA' 카테고리의 다른 글

Security - Context & 네임스페이스 전환을 빠르게 하는 도구  (0) 2026.01.02
Security - NetworkPolicy  (0) 2026.01.02
Security - Secret of Docker Registry  (0) 2026.01.02
Security - Service Account  (0) 2026.01.02
Security - ClusterRole / ClusterRoleBinding  (0) 2026.01.02
'CKA' 카테고리의 다른 글
  • Security - Context & 네임스페이스 전환을 빠르게 하는 도구
  • Security - NetworkPolicy
  • Security - Secret of Docker Registry
  • Security - Service Account
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (119)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      스레드
      조회 성능 최적화
      고급
      버퍼
      프록시
      단방향 맵핑
      reentarantlock
      requset scope
      양방향 맵핑
      log trace
      gesingleresult
      자바
      jdk 동적 프록시
      @within
      typequery
      빈 후처리기
      JPQL
      프록시 팩토리
      락
      @discriminatorvalue
      @discriminatorcolumn
      페치 조인
      김영한
      Thread
      hibernate5module
      jpq
      WAS
      Target
      @args
      cglib
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Security - 도커 보안 기초 + 쿠버네티스의 Security Context
    상단으로

    티스토리툴바