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 |