OS 디렉터리 마운트 보호 점검이 필요한 Kubernetes 컨테이너

민감한 OS 경로에 쓰기 가능한 볼륨을 마운트하면 시스템 파일이나 설정을 변경할 위험이 있습니다.

설명

/bin, /etc 같은 민감한 경로에 쓰기 가능한 볼륨을 마운트하면 컨테이너가 사용하는 바이너리나 설정이 변경될 수 있습니다. 볼륨의 실제 원본이 hostPath 등으로 호스트 파일을 제공한다면 노드에도 영향을 줄 수 있습니다. 컨테이너의 mountPath만으로 호스트 디렉터리가 연결되었다고 판단할 수는 없습니다.

Linux에서 readOnly: true만으로는 하위 마운트까지 읽기 전용이 되지 않습니다. 하위 마운트도 보호해야 한다면 지원되는 환경에서 recursiveReadOnly: Enabled를 사용하세요.

잠재적 영향

  • 쓰기 가능한 바이너리나 설정이 변조되어 애플리케이션 동작에 영향을 줄 수 있습니다.
  • 호스트 파일을 제공하는 볼륨이라면 노드나 다른 워크로드까지 피해가 확대될 수 있습니다.
  • 읽기 전용으로 바꿔도 파일 내용에 대한 읽기 접근은 남습니다.

해결 방법

  • 불필요한 민감 경로 마운트를 제거하고 필요한 파일만 목적에 맞는 볼륨으로 제공하세요.
  • 쓰기가 필요하지 않은 마운트에는 readOnly: true를 설정하세요. 하위 마운트 보호가 필요하면 recursiveReadOnly: Enabled도 적용하세요.
  • 재귀적 읽기 전용 기능은 Kubernetes 1.33에서 안정화되었습니다. Linux 5.12 이상과 지원 런타임이 필요하며 mountPropagation은 생략하거나 None이어야 합니다. 호환성과 애플리케이션 동작을 확인하세요.

예시

다음은 마운트 옵션을 비교하는 Pod 발췌입니다. vol-0의 볼륨 정의는 생략되어 있으므로 실제 원본과 이미지를 확인하고 구성해야 합니다.

변경 전

yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-0
spec:
  containers:
    - name: pod-0
      image: k8s.gcr.io/test-webserver
      volumeMounts:
        - mountPath: /bin
          name: vol-0
          readOnly: false
          recursiveReadOnly: Disabled

이 마운트는 쓰기를 허용합니다. 실제 파일 접근 범위는 생략된 볼륨 원본과 파일 권한에 따라 달라집니다.

변경 후

yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-0
spec:
  containers:
    - name: pod-0
      image: k8s.gcr.io/test-webserver
      volumeMounts:
        - mountPath: /bin
          name: vol-0
          readOnly: true
          recursiveReadOnly: Enabled

해당 컨테이너의 마운트와 하위 마운트를 읽기 전용으로 요청합니다. 필수 커널·런타임 조건을 충족하지 않으면 Enabled 설정은 실패하며, 다른 컨테이너나 경로의 쓰기 권한까지 차단하지는 않습니다.

참조