설명
hostPath로 /proc, /etc, /var, /root, / 같은 민감한 호스트 디렉터리를 컨테이너에 마운트하면 노드의 설정, 프로세스 정보나 시스템 파일에 접근할 수 있습니다. 시스템 에이전트에 필요한 경우도 있지만 일반 애플리케이션에서는 불필요한 호스트 접근을 피해야 합니다.
실제 영향은 마운트한 경로와 파일 권한에 따라 달라집니다. 읽기 전용 마운트는 쓰기를 줄여도 정보 노출까지 막지는 못합니다.
잠재적 영향
- 노드 설정, 로그와 자격 증명 등 민감한 정보가 노출될 수 있습니다.
- 쓰기가 허용되면 호스트 파일 변조나 서비스 장애로 이어질 수 있습니다.
- 컨테이너 침해가 다른 워크로드나 노드에 영향을 줄 가능성이 커집니다.
해결 방법
- 불필요한 민감 디렉터리 마운트를 제거하세요. 설정은 ConfigMap, 비밀정보는 Secret, 영구 데이터는 적절한 저장소의 PVC로 제공하는 방안을 검토하세요.
- 필수 예외는 승인된 워크로드와 최소 경로로 제한하고, 쓰기가 필요하지 않으면 읽기 전용으로 마운트하세요.
- 저장소를 바꿀 때 필요한 데이터와 권한을 이전하고 애플리케이션이 실제로 새 경로를 사용하는지 확인하세요.
예시
다음 두 예제는 서로 다른 워크로드의 저장소 구성을 보여 줍니다. 두 번째 예제는 첫 번째의 애플리케이션을 그대로 이전하는 절차가 아닙니다.
변경 전
yaml
apiVersion: v1
kind: Pod
metadata:
name: web-server-pod
spec:
volumes:
- name: nginx-host-config
hostPath:
path: /etc/nginx
containers:
- name: nginx-container
image: nginx
volumeMounts:
- mountPath: /etc/nginx
name: nginx-host-config
노드의 /etc/nginx를 컨테이너에 직접 연결합니다. 파일 권한이 허용하면 컨테이너에서 호스트 설정을 읽거나 변경할 수 있습니다.
변경 후
yaml
apiVersion: v1
kind: Pod
metadata:
name: redis-empty-dir
spec:
containers:
- name: redis
image: redis
volumeMounts:
- name: redis-storage
mountPath: /data/redis
volumes:
- name: redis-storage
emptyDir: {}
emptyDir는 지정한 민감한 호스트 디렉터리를 직접 노출하지 않습니다. Pod가 노드에서 제거되면 데이터도 삭제되므로 영구 저장소의 대체재는 아닙니다. 애플리케이션이 /data/redis에 데이터를 저장하도록 별도 설정해야 합니다.