K01/K8s 보안 강화 - 안전하지 않은 워크로드 설정
OWASP(Open Web Application Security Project)은
인터넷 세상에서 발생가능한 가장 중요한 보안 취약점을 정리한 문서입니다.
Before Started
D01 ~ D06/Docker 보안 강화[P1]를 통해서 OWASP Docker Top 10[1]의 다양한 보안 시나리오, 취약점 탐색 방법, 개선 방법에 대해서 배웠습니다.
다만 현업에서는 오케스트레이션 도구인 K8s를 사용하고 있으므로 Dockerfile까지는 해당 시리즈[1]를 참조하되 그 이후에는 OWASP Kubernetes Top 10[2]을 딥아비으하여 이를 현업에 적용하는 것이 좋은 방향이라고 생각했습니다.
Overview
K8s에서 안전하지 않은 워크로드 설정[3]과 관련된 기본적인 설정사항들을 준수하여야 합니다.
root 유저 설정을 피하라
읽기 전용 파일 시스템을 사용할 것
특권 컨테이너를 사용하지 말 것
리소스에 요청과 제한을 사용할 것
지속적인 보안 방법
Insecure Workload Configurations
root 유저 설정을 피하라
컨테이너를 runAsUser: 0 옵션으로 루트로 실행해서는 안됩니다.
apiVersion: v1
kind: Pod
...
spec:
...
securityContext:
runAsUser: 0
반드시 아래와 같이 runAsUser: <num> 옵션으로 별도의 사용자로 실행해야 합니다.
apiVersion: v1
kind: Pod
...
spec:
...
securityContext:
runAsUser: 0
읽기 전용 파일 시스템을 사용할 것
컨테이너에서 루트 시스템에 쓰기 작업을 할 수 없도록 readOnlyRootFilesystem: true를 사용해야 합니다.
다만 이 경우는 D02/패치 관리 전략 [P2]에서 다른 Dirty COW Vulnerability[T1] 예시와 같이, 컨테이너가 호스트 커널의 보안 취약점을 통해서 권한 상승, 읽기 전용 마운트에서의 쓰기 작업 등이 가능합니다.
apiVersion: v1
kind: Pod
...
spec:
...
securityContext:
readOnlyRootFilesystem: true
특권 컨테이너를 사용하지 말 것
특권 컨테이너로 실행되지 않도록 강력한 제약사항을 유지해야 합니다. privileged: false 옵션을 사용할 수 있습니다.
apiVersion: v1
kind: Pod
...
spec:
...
securityContext:
privileged: false
allowPrivilegeEscalation: false
공격자가 컨테이너 내부에 침입한 이후,
일반 컨테이너를 특권 컨테이너로 승격시키는 것을 방지 하기 위해서 allowPrivilegeEscalation: false 옵션을 사용할 수 있습니다.
리소스에 요청과 제한을 사용할 것
특정한 컨테이너의 작업이 전체 호스트, 컨테이너에 영향을 미치지 않도록 limits, requests 설정이 필요합니다. 경우에 따라 네임스페이스에서 해당되는 각 객체 종류에 대한 리소스 할당을 제한 하기 위해서는 LimitRange를 사용할 수도 있습니다.
apiVersion: v1
kind: Pod
...
spec:
...
containers:
resources:
limits:
cpu: "0.5"
memory: "512Mi"
requests:
cpu: "0.2"
memory: "256Mi"
공격자가 컨테이너 내부에 침입한 후,
악의적인 방법으로 CPU, MEM 등의 사용량을 늘리지 못하도록 리소스의 요청과 제한을 두어야 합니다.
지속적인 보안
지속적으로 보안을 강화하고 유지하기 위해서는 아래의 방법을 활용할 수도 있습니다.
Open Policy Agent를 활용한 Docker, K8s 거버넌스 수립 [T2]
CIS benchmark를 사용한 K8s 보안 벤치카밍 [T2]
Pod 보안 표준 적용하기 [T3]