마지막 사용자가 root인 Dockerfile

빌드에 필요한 root 작업을 마친 뒤 애플리케이션의 기본 실행 사용자를 비루트 계정으로 바꾸세요.

설명

최종 이미지에서 USER root를 유지하면 런타임에서 별도로 바꾸지 않는 한 컨테이너 프로세스가 root로 실행됩니다. 빌드 과정에는 root가 필요할 수 있지만, 애플리케이션 실행까지 같은 권한을 유지하면 침해 시 피해 범위가 커질 수 있습니다.

컨테이너 안의 root가 곧 호스트의 모든 권한을 뜻하지는 않습니다. 실제 영향은 capability, 마운트와 런타임 격리 설정에도 달려 있습니다.

잠재적 영향

  • 침해된 애플리케이션이 컨테이너 내부 파일과 프로세스에 더 넓게 접근할 수 있습니다.
  • 민감한 호스트 마운트나 과도한 권한과 결합되면 호스트 자원까지 영향을 받을 수 있습니다.

해결 방법

  • 패키지 설치나 계정 생성 등 root 작업을 먼저 수행한 뒤 마지막에는 일반 사용자로 전환하세요.
  • 최종 실행 단계에 필요한 비루트 계정을 준비하고 USER를 지정하세요. 필요한 파일과 디렉터리에만 접근 권한을 부여하세요.
  • 이미지의 기본 사용자와 실제 배포의 사용자 재정의를 모두 확인하고, 변경 후 애플리케이션을 시험하세요.

예시

계정 생성과 기본 실행 사용자만 비교하는 예시입니다. 애플리케이션 파일과 시작 명령은 별도로 준비하세요.

변경 전

dockerfile
FROM alpine:3.22
USER root
RUN adduser -D appuser

appuser를 만들어도 실행 사용자는 바뀌지 않아 마지막 지정은 root로 남습니다.

변경 후

dockerfile
FROM alpine:3.22
USER root
RUN adduser -D appuser
USER appuser

계정 생성 후 USER appuser로 기본 사용자를 전환합니다. 실제 파일 권한과 런타임 설정도 확인하세요.

참조