.env)로 제어하려 했으나, Mosquitto의 정적 설정 파일(mosquitto.conf)은 환경 변수를 스스로 파싱(Parsing)하지 못함..env 하나로 통제하려는 아키텍처의 '중앙 집중식 관리' 원칙을 훼손하는 기술 부채를 유발함.외부망만 환경 변수로 제어하고, 내부망은 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를 통해 전역 통제하도록 구성했습니다.