문제점

자료 (변경 전 코드)

외부망만 환경 변수로 제어하고, 내부망은 1883 표준 포트를 그대로 사용하는 형태

services:
  mqtt:
    image: eclipse-mosquitto:latest
    container_name: mqtt-broker
    ports:
      # 외부 포트만 변수로 숨기고, 컨테이너 내부 통신은 1883을 사용
      - "${MQTT_EXT_PORT}:1883" 
    volumes:
      - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf:ro
      - ./mosquitto/log:/mosquitto/log
    networks:
      - compose-net

자료 (변경 후 코드)

외부/내부 망을 모두 분리하고, 프로세스 실행 시점에 내부 포트를 강제 주입하는 형태

services:
  mqtt:
    image: eclipse-mosquitto:latest
    container_name: mqtt-broker
    ports:
      # 외부 포트와 내부 포트를 모두 비표준 환경 변수로 매핑
      - "${MQTT_EXT_PORT}:${MQTT_INT_PORT}" 
    volumes:
      - ./mosquitto/mosquitto.conf:/mosquitto/config/mosquitto.conf:ro
      - ./mosquitto/log:/mosquitto/log
    # 정적 설정 파일의 하드코딩을 방지하기 위해, OS(도커)가 부팅 시 프로세스 실행 인자(-p)로 내부 포트를 직접 하달
    command: mosquitto -c /mosquitto/config/mosquitto.conf -p ${MQTT_INT_PORT}
    networks:
      - compose-net

외부 망의 변경 목적

요새(시스템)로 들어오는 외부 출입문을 비표준 포트(예: 5098)로 숨겨, 전 세계 인터넷에서 1883 포트를 노리고 들어오는 자동화된 악성 스크립트 및 봇(Bot)들의 무작위 스캔 공격을 1차적으로 회피하기 위함입니다.

내부 망의 변경 목적

도커의 내부 네트워크(compose-net)는 이미 외부망과 철저히 격리되어 있기 때문에, 원래라면 내부 포트(1883)를 굳이 변경하지 않아도 보안상 상관이 없습니다.

하지만 이 프로젝트는 도커 컴포즈(Docker Compose)를 단순한 컨테이너 배포 도구가 아닌 '하나의 OS(운영체제)'로 취급하여 설계하고 있습니다. 따라서 실제 OS 환경이라고 가정하고, 내부 프로세스(데몬) 간의 통신(IPC)에서도 철저한 보안(Zero Trust)을 유지하기 위해 내부 포트를 변경했습니다. 내부망이 뚫렸을 경우를 대비해 공격자가 스캔을 통해 어떤 서비스가 돌아가는지 쉽게 파악(핑거프린팅)하지 못하도록 비표준 포트(예: 5009)로 꼬아두었으며, 이를 .env를 통해 전역 통제하도록 구성했습니다.