kube-system 외 네임스페이스에서 hostPath를 사용하는 워크로드

일반 애플리케이션의 hostPath 사용은 노드 파일 접근 범위를 넓히므로 필요성과 권한을 제한해야 합니다.

설명

hostPath 볼륨을 컨테이너에 마운트하면 노드 파일시스템에 직접 접근할 수 있습니다. 시스템 에이전트처럼 꼭 필요한 경우가 아니라면 일반 애플리케이션에서는 사용을 피하고 목적에 맞는 저장소를 사용해야 합니다.

kube-system으로 옮기는 것만으로 파일 접근이 제한되지는 않습니다. 위험은 실제 호스트 경로, 컨테이너의 마운트 설정과 파일 권한에 따라 달라집니다.

잠재적 영향

  • 노드의 설정, 로그나 자격 증명이 컨테이너에 노출될 수 있습니다.
  • 쓰기 권한이 있으면 호스트 파일을 변경해 다른 워크로드나 노드 동작에 영향을 줄 수 있습니다.
  • 노드별 파일 상태에 의존해 워크로드의 동작이 달라질 수 있습니다.

해결 방법

  • 일반 데이터는 적절한 저장소의 PVC, 설정은 ConfigMap, 비밀정보는 Secret 등으로 대체할 수 있는지 검토하세요.
  • 필수 시스템 워크로드만 필요한 호스트 경로를 사용하도록 제한하고, 읽기만 필요하면 readOnly: true를 설정하세요.
  • 해당 워크로드를 생성하거나 변경할 수 있는 권한도 제한하세요. 네임스페이스 이름만을 보안 경계로 삼지 마세요.

예시

다음은 볼륨 선언을 보여 주는 발췌입니다. 선택자, Pod 레이블과 volumeMounts 등은 생략했습니다. 실제 사용 시 필요한 항목과 지원되는 이미지를 구성하세요.

변경 전

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  template:
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
      volumes:
        - name: static-page-dir
          hostPath:
            path: /var/local/static
            type: DirectoryOrCreate

일반 애플리케이션에 /var/local/static 호스트 디렉터리를 제공하는 구성입니다. 이 볼륨을 마운트하면 애플리케이션이 노드의 파일에 의존하게 됩니다.

변경 후

yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd-elasticsearch
  namespace: kube-system
spec:
  template:
    spec:
      containers:
        - name: fluentd-elasticsearch
          image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2
      volumes:
        - name: varlog
          hostPath:
            path: /var/log

시스템 로그 수집기의 /var/log 접근은 정당한 사용 사례가 될 수 있습니다. 하지만 kube-system에 있다는 이유로 보호되는 것은 아니며, 실제 volumeMounts를 읽기 전용으로 제한하고 로그 접근 권한을 검토해야 합니다.

참조