설명
Dockerfile의 EXPOSE 22는 이미지가 해당 포트를 사용한다는 메타데이터입니다. SSH 서버를 실행하거나 호스트에 포트를 공개하는 명령은 아닙니다. 다만 -P 같은 자동 포트 공개 기능은 EXPOSE 정보를 사용할 수 있습니다.
SSH 서비스가 실제로 실행되고 외부에 공개된다면 인증과 접근 범위를 확인해야 합니다. EXPOSE를 지워도 명시적인 포트 매핑이나 다른 네트워크 경로까지 차단되지는 않습니다.
잠재적 영향
- 불필요한 포트 선언이 자동 공개 설정과 결합되면 의도하지 않은 접근 경로가 생길 수 있습니다.
- 외부에서 접근 가능한 SSH 서비스의 인증이나 소프트웨어가 취약하면 컨테이너가 침해될 수 있습니다.
해결 방법
- 필요하지 않은 EXPOSE 22 선언을 제거하고 실제 실행 서비스, 포트 매핑과 방화벽을 함께 확인하세요.
- 관리에는 접근 통제된 실행·로그 기능을 우선 검토하세요. SSH가 필요한 경우에는 신뢰할 수 있는 관리 경로와 강한 인증으로 제한하세요.
예시
두 예제는 포트 선언만 비교합니다. EXPOSE 22를 넣는 것만으로 Nginx 이미지에 SSH 서버가 생기지는 않습니다.
변경 전
dockerfile
FROM nginx:1.27-alpine
EXPOSE 80 22
CMD ["nginx", "-g", "daemon off;"]
변경 후
dockerfile
FROM nginx:1.27-alpine
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
설명:
- 변경 전: 80과 22 포트를 선언합니다. 실제 공개 여부와 서비스 실행 여부는 별도 설정에 달려 있습니다.
- 변경 후: 22 선언을 제거합니다. 명시적인 포트 공개나 네트워크 접근을 차단하는 설정은 아닙니다.