컨테이너 포트 바인딩 범위 과다

공개 포트를 서비스에 필요한 호스트 인터페이스로 제한하세요.

설명

포트 바인딩을 단순히 7000:8000처럼 지정하면 기본적으로 모든 네트워크 인터페이스에서 접근 가능해질 수 있습니다.

개발용이나 내부 전용 서비스라면 127.0.0.1처럼 필요한 인터페이스에만 포트를 노출하는 편이 안전합니다. 그렇지 않으면 의도하지 않은 외부 접근 경로가 생길 수 있습니다.

잠재적 영향

  • 내부 전용 서비스가 외부 네트워크에 노출될 수 있습니다.
  • 포트 스캔과 무단 접근 시도가 더 쉽게 들어올 수 있습니다.
  • 서비스별 네트워크 노출 범위를 통제하기 어려워집니다.

해결 방법

  • ports에 호스트 IP를 명시해 필요한 인터페이스에만 바인딩하세요.
  • 외부 공개가 필요 없는 서비스는 127.0.0.1 같은 로컬 인터페이스로 제한하세요.
  • 공개 서비스와 내부 서비스를 Compose 수준에서 분리해 노출 정책을 명확히 하세요.

예시

실제 서비스가 컨테이너의 8000 포트에서 수신해야 합니다. 다른 호스트에서 접속해야 한다면 루프백 대신 승인된 인터페이스와 방화벽 규칙을 사용하세요.

변경 전

yaml
services:
  webapp:
    image: sample/webapp:latest
    ports:
      - "7000:8000"

변경 후

yaml
services:
  webapp:
    image: sample/webapp:latest
    ports:
      - "127.0.0.1:7000:8000"

설명:

  • 변경 전: 포트가 모든 인터페이스에 바인딩될 수 있어 서비스가 예상보다 넓게 노출됩니다.
  • 변경 후: 호스트의 루프백 주소에 바인딩해 이 공개 포트를 통한 원격 접근을 제한합니다. 애플리케이션 인증과 컨테이너 간 접근은 별도로 관리하세요.

참조