Docker 포트 바인딩 및 컨테이너 보안
도커 환경은 매우 빠르고 효율적이지만, 기본 설정 그대로 네트워크 포트를 포워딩하여 구동할 경우 로컬 개발 PC나 클라우드 가상 서버 전체의 민감한 내부 네트워크 경로가 공용 인터넷망 전체로 무단 노출되어 공격 대상이 되는 주요 보안 위협이 존재합니다.
따라서 컨테이너 인프라망을 올바르게 방어하기 위해 다음 4가지 핵심 보안 수칙을 의무적으로 준수하여 환경을 구성해야 합니다.
1. 도커 포트 격리 및 네트워크 보안 구조
아래 다이어그램은 외부 공용 IP 인터페이스 전체(0.0.0.0)에 포트를 대기시켜 해커의 침입 경로가 되는 불완전한 상태와, 루프백(127.0.0.1) 제어 및 DB 외부 포트 매핑을 생략하여 완벽한 보안 격리를 구현하는 방식의 비교입니다.
2. 보안 가이드라인 및 구성법
1) 포트 바인딩 IP 제한 (루프백 잠금)
- 보안 취약점:
ports: - "8080:80"과 같이 단순히 포트 번호만 지정하면 도커 엔진은 호스트 컴퓨터가 가진 모든 무선/유선 네트워크 인터페이스 IP(0.0.0.0)로 수신 대기 상태에 들어갑니다. 만약 카페 공용 와이파이에 연결되어 있거나 공인 IP 환경이라면, 다른 네트워크 사용자가 나의 개발용 임시 웹서버 웹페이지 주소로 무단 침투할 수 있습니다. - 방어 대책: 개발 스테이지에서는 오직 나의 컴퓨터 터미널에서만 통신할 수 있도록 바인딩 포트 앞에 로컬 루프백 주소인
127.0.0.1을 반드시 강제 적용 기입합니다. ```yaml ports:- “127.0.0.1:8080:80” # 외부 타 컴퓨터의 임의 접근 시도를 호스트 커널 레벨에서 원천 거부 처리 ```
2) 데이터베이스 외부 노출 완전 제거 (Port mapping 제거)
- 보안 취약점: 로컬 개발 시 DBeaver나 DataGrip 등 호스트의 DB 뷰어 툴로 접속하기 위해 MySQL 컨테이너의 3306 포트를 호스트 컴퓨터 포트와 매핑(
3306:3306)해 두는 경우가 많습니다. 이는 외부 크래커 세력의 패스워드 무작위 대입(Brute-Force) 공격의 타겟이 되어 DB 전체가 탈취되는 초대형 취약점이 됩니다. - 방어 대책: Docker Compose 내부망에 존재하는 Nginx와 PHP-FPM 컨테이너는 별도로 외부 포트를 열지 않더라도 가상 브릿지망 내에 격리 구성된 가상 호스트명인
db:3306을 통해 자유롭게 내부 쿼리를 보낼 수 있습니다. - 따라서 관리 목적으로 잠시 연 경우를 제외하고는
db서비스의ports설정을 완전히 주석 처리하거나 제거하는 것을 권장합니다.services: db: image: mysql:8.0 # ports: # - "127.0.0.1:3306:3306" <-- 보안을 위해 주석 처리 또는 제거
3) 설정 파일 읽기 전용 볼륨 마운트 (:ro)
- 보안 취약점: Nginx의 가상 호스트 설정 파일(
nginx.conf)이나 PHP의 서버 환경설정 파일(php.ini)은 악성 공격 파일 주입 취약점 발생 시 타겟이 되는 주요 변조 대상입니다. - 방어 대책: 호스트의 설정 파일을 마운트 연결할 때, 볼륨 설정 최하단 부분에
:ro(Read-Only) 플래그 지시어를 부여합니다. 이를 통해 컨테이너 안의 프로세스는 설정을 가져와 읽을 수만 있으며, 스크립트 엔진 내에서 설정 파일을 강제로 수정하거나 덮어쓰는 행위 자체를 물리적으로 무력화합니다. ```yaml volumes:- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro # 읽기 전용 마운트 강제 ```
4) 중요 자격 증명 외부 환경변수 관리 (.env)
- 보안 취약점: 데이터베이스의 루트 계정 비밀번호나 API 인증 키를
docker-compose.yml파일에 날것의 평문 문자열로 노출해 적어 두면, 소스 제어 관리 도구(GitHub 등) 원격 저장소에 커밋되어 소스코드가 퍼블릭으로 유출되는 심각한 사고로 이어집니다. - 방어 대책: 프로젝트 루트 폴더에 자격 증명만을 모아두는 기밀 환경변수 파일인
.env를 만들고 변수값을 저장합니다..env파일 예시:DB_ROOT_PASSWORD=MySecurePassword123!docker-compose.yml에서는 환경변수 지칭 변수 구조인${DB_ROOT_PASSWORD}로 호출하여 매핑합니다.- 그리고 반드시 소스 관리 설정 파일인
.gitignore에.env항목을 추가 등록하여 원격 커밋 파일 리스트에서 격리 및 배포 방지 처리를 해 주어야 합니다.
이전 학습
« 게시판 만들기
서브목차