컨테이너는 단순한 패키징 수단이 아닙니다. 제대로 설정하면 ‘보안 울타리(Security Fence)’가 될 수 있습니다. 이 글에서는 애플리케이션 코드 보안 외에도 쿠버네티스에서 설정할 수 있는 런타임 권한 격리를 통해 “컨테이너 안에서 일어난 일은 컨테이너 안에 머물게” 만드는 방법을 설명합니다.
컨테이너는 기본적으로 호스트 커널을 공유합니다. 따라서 컨테이너 내부 프로세스가 과도한 권한을 가지면, 이를 통해 호스트 시스템이나 클러스터 전체에 영향을 줄 수 있는 위험이 있습니다. 이때 프로세스 격리(Process Containment) 패턴은 다음을 목표로 합니다:
이 패턴은 클라우드 네이티브 보안의 “런타임 레이어”에 해당합니다. 코드를 아무리 검사해도 새로운 취약점은 계속 등장하므로, 운영 중인 컨테이너 자체의 권한을 낮추는 것이 두 번째 방어선입니다.

spec.securityContextspec.containers[].securityContext| 설정 항목 | 예시 | 설명 |
|---|---|---|
runAsNonRoot | true | root 사용자 실행 차단 |
allowPrivilegeEscalation | false | sudo/setuid 제한 |
readOnlyRootFilesystem | true | 루트 FS를 읽기 전용으로 |
capabilities | drop: ALL | 커널 권한 최소화 |
seccompProfile | RuntimeDefault | 시스템콜 필터 적용 |
루트 파일시스템을 RO로 설정하면, 앱이 /tmp나 로그 경로에 쓰기를 시도할 때 "Read-only file system" 에러가 발생하며 크래시 루프에 빠질 수 있습니다. 반드시 예제처럼 필요한 경로만 emptyDir로 열어주는 '화이트리스트' 방식의 쓰기 허용이 병행되어야 합니다.
apiVersion: v1
kind: Pod
metadata:
name: secure-app
spec:
securityContext:
runAsNonRoot: true
containers:
- name: app
image: nginx:latest
securityContext:
runAsUser: 1000
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
capabilities:
drop: ["ALL"]
add: ["NET_BIND_SERVICE"]
seccompProfile:
type: RuntimeDefault
volumeMounts:
- name: tmp
mountPath: /tmp
volumes:
- name: tmp
emptyDir: {}

PSA 정책은 네임스페이스 라벨로 적용할 수 있으며, warn 모드를 활용한 dry-run 식 점검이 가능해 운영 안정성을 높일 수 있습니다.
hostUsers: false 설정으로, 컨테이너 내 root(UID 0)가 호스트에선 일반 사용자로 매핑됨Process Containment는 사전 설정을 통해 사고를 예방하는 전략입니다. 하지만 완벽한 설정이란 존재하지 않기에, 런타임에서의 행위 감지(Observability) 또한 중요합니다.
다음과 같은 오픈소스 도구들이 추천됩니다:
이 도구들은 쿠버네티스 설정 외부에서 행위 기반 감시를 통해 마지막 방어선을 제공합니다.
Process Containment는 쿠버네티스 환경에서 최소 권한 원칙을 실현하기 위한 핵심 패턴입니다. 설정 자체는 단순하지만, 보안 사고의 확산을 막는 마지막 방어선으로 작동합니다.
보안은 설정만으로 끝나는 것이 아니라, 정책 + 감시 + 점진적 적용 전략이 모두 어우러져야 완성됩니다.
참고: