[Monitoring, Logging and Runtime Security] Kubernetes에서 파드 불변성 유지하기: 보안과 효율성을 위한 전략

IMKUNYOUNG·2024년 6월 29일
0

CKS

목록 보기
69/70

컨테이너화된 애플리케이션 환경에서 불변성은 중요한 개념입니다. 컨테이너는 본질적으로 불변성을 갖도록 설계되었지만, 실제 운영에서는 컨테이너를 직접 수정할 수 있는 여러 방법이 존재합니다. 이번 글에서는 쿠버네티스(Kubernetes) 파드가 불변성을 유지하도록 하는 다양한 방법을 다루겠습니다.

컨테이너의 불변성 문제

컨테이너는 기본적으로 불변성을 갖고 있지만, 실제로는 컨테이너 내부를 수정할 수 있습니다. 예를 들어, 파일을 파드에 직접 복사하거나, 컨테이너 내부에 셀을 열어 변경할 수 있습니다. 이러한 변경을 방지하기 위해서는 어떻게 해야 할까요? 한 가지 방법은 파드가 시작된 후 파일 시스템에 쓰기 작업을 할 수 없도록 하는 것입니다.

Security Context를 이용한 파일 시스템 읽기 전용 설정

파드의 불변성을 유지하기 위해 쿠버네티스의 시큐리티 컨텍스트(security context)를 사용할 수 있습니다. Nginx 파드 정의 파일을 예로 들어 설명하겠습니다. 컨테이너 레벨에서 시큐리티 컨텍스트를 사용하여 루트 파일 시스템을 읽기 전용으로 설정할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    securityContext:
      readOnlyRootFilesystem: true

위 설정을 적용하면 Nginx 컨테이너는 읽기 전용 루트 파일 시스템으로 시작되어, 컨테이너 내부에 파일을 복사하거나 쓰는 것이 불가능해집니다.

emptyDir 볼륨을 통한 쓰기 가능 디렉토리 설정

루트 파일 시스템을 읽기 전용으로 설정하면 애플리케이션이 정상적으로 작동하지 않을 수 있습니다. 예를 들어, Nginx /var/run 디렉토리와 /var/cache/nginx 디렉토리에 쓰기를 해야 합니다. 이를 해결하기 위해 emptyDir 타입의 볼륨을 해당 디렉토리로 마운트할 수 잇습니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    securityContext:
      readOnlyRootFilesystem: true
    volumeMounts:
    - mountPath: /var/run
      name: run
    - mountPath: /var/cache/nginx
      name: cache
  volumes:
  - name: run
    emptyDir: {}
  - name: cache
    emptyDir: {}


이렇게 하면 /var/run/var/cache/nginx 디렉토리에 쓰기가 가능해지며, 나머지 루트 파일 시스템은 여전히 읽기 전용 상태로 유지됩니다.

Privileged 플래그 사용의 위험성

'privileged' 플래그를 사용하면 컨테이너가 호스트 시스템에 광범위한 권한을 가지게 되어, 컨테이너의 불변성이 깨질 수 있습니다. 예를 들어, 다음과 같이 설정하면 루트 파일 시스템이 읽기 전용임에도 불구하고 호스트 머신에 변경을 가할 수 있습니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    securityContext:
      readOnlyRootFilesystem: true
      privileged: true

이 설정 파일을 사용하여 Nginx 컨테이너를 생성하면, 루트 파일 시스템은 여전히 읽기 전용이지만, /proc 파일 시스템을 통해 호스트의 설정을 변경할 수 있습니다. 이는 보안상의 큰 위험을 초래할 수 있습니다.

최선의 보안 관행

  1. 읽기 전용 루트 파일 시스템: 가능한 한 루트 파일 시스템을 읽기 전용으로 설정하고, 임시 데이터에는 emptyDir 타입의 볼륨을 사용하며, 상태를 유지해야 하는 경우에는 영구 볼륨(persistent volumes)을 사용합니다.
  2. 'privileged' 플래그 사용 금지: 'privileged' 플래그를 사용하지 않고, 가능한 한 루트 권한이 없는(non-root) 사용자로 컨테이너를 실행합니다.
  3. 최소 권한 원칙: 최소 권한 원칙을 준수하고, 컨테이너가 작업을 수행하는 데 필요하지 않은 모든 권한을 제거합니다.
  4. 파드 보안 정책(Pod Security Policies): 파드 보안 정책을 사용하여 보안 설정을 강제합니다.

마무리

쿠버네티스 환경에서 파드의 불변성을 유지하는 것은 보안과 안정성을 위한 필수 요소입니다. 이번 글을 통해 불변성을 유지하는 다양한 방법을 이해하고 적용해 보시길 바랍니다.

0개의 댓글