설명
COPY --chown으로 애플리케이션 실행 계정에 파일 소유권을 주면, 해당 계정이 파일 권한에 따라 코드를 수정할 수 있습니다. 애플리케이션이 침해되었을 때 실행 파일이나 설정까지 바꿀 수 있다면 피해가 커질 수 있습니다.
--chown 자체가 위험한 설정은 아닙니다. 비루트 실행과 데이터 쓰기를 위해 필요할 수 있으므로 파일 용도, 실제 권한, 디렉터리와 마운트 권한을 함께 확인해야 합니다.
잠재적 영향
- 실행 계정이 코드를 수정할 수 있으면 침해 후 악성 코드를 남기거나 동작을 바꿀 수 있습니다.
- 필요한 데이터 디렉터리의 쓰기 권한까지 없애면 애플리케이션이 실패할 수 있습니다.
해결 방법
- 애플리케이션 코드와 쓰기 가능한 데이터를 분리하고 실행 계정에는 필요한 경로의 쓰기 권한만 주세요.
- 코드의 소유자와 모드를 함께 설정하고 비루트 계정이 읽고 실행할 수 있지만 수정할 수는 없는지 확인하세요. root 소유권만으로 쓰기 금지가 보장되지는 않습니다.
예시
두 예제는 복사한 파일의 소유권을 비교합니다. 빌드 컨텍스트의 파일 모드와 실제 쓰기 경로도 확인해야 합니다.
변경 전
dockerfile
FROM python:3.12-slim
RUN useradd -ms /bin/bash appuser
COPY --chown=appuser:appuser app /app
WORKDIR /app
USER appuser
CMD ["python", "app.py"]
변경 후
dockerfile
FROM python:3.12-slim
RUN useradd -ms /bin/bash appuser
COPY app /app
WORKDIR /app
USER appuser
CMD ["python", "app.py"]
설명:
- 변경 전: 복사한 파일을 appuser가 소유합니다. 실제 수정 가능 여부는 파일과 디렉터리 권한에 달려 있습니다.
- 변경 후: 기본 root 소유권으로 복사하고 appuser로 실행합니다. 필요한 읽기·실행 권한과 코드 쓰기 제한은 별도로 확인해야 합니다.