Docker Daemon Socket 노출

불필요한 Docker 소켓 마운트를 제거하고 호스트 런타임 접근을 격리하세요.

설명

컨테이너에 /var/run/docker.sock를 마운트하고 해당 소켓에 연결할 권한을 주면 Docker 데몬 API를 직접 사용할 수 있습니다. 일반적인 root 권한의 호스트 데몬에서는 다른 컨테이너나 호스트 파일 시스템을 제어하는 경로가 될 수 있습니다.

대부분의 애플리케이션에는 이 접근이 필요하지 않습니다. 읽기 전용 마운트로 바꾸는 것만으로 소켓 API 작업이 읽기 전용으로 제한되지는 않습니다.

잠재적 영향

침해된 컨테이너가 데몬 권한으로 다른 워크로드를 생성·변경하거나 호스트 데이터에 접근할 수 있습니다. 실제 범위는 데몬의 권한과 소켓 접근 통제에 달려 있지만, 애플리케이션 격리를 크게 약화할 수 있습니다.

해결 방법

  • 불필요한 Docker 소켓 볼륨과 마운트를 제거하세요.
  • 빌드·운영 자동화는 전용 빌더나 별도 격리 환경을 사용하고 필요한 API 접근만 제한적으로 허용하세요.
  • 제거 후 정상 기능을 확인하고 일반 데이터 볼륨도 호스트 경로와 파일 권한을 최소화하세요.

예시

해당 호스트에 Docker 소켓과 데이터 디렉터리가 존재하는 경우의 마운트 비교입니다. 이미지 접근과 애플리케이션 설정은 환경에 맞게 준비하세요.

변경 전

yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
    - image: k8s.gcr.io/test-webserver
      name: test-container
      volumeMounts:
        - mountPath: /test-pd
          name: test-volume
  volumes:
    - name: test-volume
      hostPath:
        path: /var/run/docker.sock
        type: Socket

실제 Unix 소켓을 Socket 유형으로 마운트합니다. 컨테이너가 파일 권한을 통해 연결할 수 있으면 Docker API를 사용할 수 있습니다.

변경 후

yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
    - image: k8s.gcr.io/test-webserver
      name: test-container
      volumeMounts:
        - mountPath: /test-pd
          name: test-volume
  volumes:
    - name: test-volume
      hostPath:
        path: /data
        type: Directory

Docker 소켓 대신 데이터 디렉터리를 마운트합니다. /data에 대한 호스트 접근은 여전히 남으므로 필요한 범위·파일 권한·읽기 전용 여부를 검토하세요.

참조