MySQL 네트워크 및 방화벽 설정¶
운영 서버(Production Server) 에서 MySQL 네트워크 접근과
방화벽 설정을 안전하게 구성하기 위한 표준 운영 절차(runbook) 를 정의함.
단순히 포트를 여는 방법이 아니라,
왜 이 순서로 설정해야 하는지,
어떤 접근만 허용해야 하는지를 명확히 함.
1. 네트워크 설정의 기본 원칙¶
운영 환경에서 MySQL은 다음 원칙을 따름.
- 외부 트래픽의 진입점이 아님
- 애플리케이션 전용 내부 자원임
- 계정/권한 설계가 완료된 이후에만 네트워크를 개방함
방화벽 설정은 보안의 시작이 아니라 마지막 안전장치임
2. 방화벽 설정을 나중에 하는 이유¶
MySQL 네트워크 설정은 02-MySQL 사용자 및 권한 설정 이후에 수행함.
이유는 다음과 같음.
- 접근 주체(계정/Host)가 확정되지 않은 상태에서 포트를 열면
- 과잉 허용으로 이어짐
%계정 사용 가능성이 커짐
- 계정 설계 → 네트워크 제한 순서가
- 사고 범위를 가장 작게 유지함
계정 없는 포트 오픈은 문 열어두고 자물쇠를 고민하는 순서임
3. MySQL 포트 기본 정책¶
- 기본 포트: 3306
- 외부 인터넷 직접 노출 ❌
- 내부 네트워크 또는 지정된 서버만 허용 ⭕
- 가능한 경우:
- Security Group
- Bastion Host
- Private Network 우선 사용
4. 방화벽 포트 허용 (sudo 필요)¶
MySQL 포트가 필요한 경우에도 전체 소스에 전역 오픈하지 않음.
반드시 내부망 또는 지정된 애플리케이션 서버만 허용함.
sudo firewall-cmd --permanent --remove-port=3306/tcp
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="[InternalCIDR]" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
sudo firewall-cmd --permanent --list-rich-rules
- 예:
192.168.0.0/24, 특정 애플리케이션 서버 IP, Bastion 대역 - 필요 없는 서버에서는 포트 오픈하지 않음
- 테스트 후 즉시 닫을 수 있도록 변경 이력 관리함
단일 서버 또는 로컬 연결만 필요한 경우에는
firewalld 에 3306 허용 규칙 자체를 만들지 않는 것이 기본임.
5. MySQL 바인딩 주소 확인¶
MySQL은 기본적으로 모든 인터페이스에 바인딩될 수 있음.
운영 환경에서는 이를 명확히 관리함.
/etc/my.cnf 또는 /etc/mysql/my.cnf 확인.
[mysqld]
bind-address = 127.0.0.1
- 단일 서버 구성에서는
127.0.0.1권장 - 다중 서버 구성 시 내부 IP로 제한
바인딩 주소 제한은 방화벽보다 앞선 1차 방어선임.
6. 포트 변경 시 주의 사항¶
보안 또는 정책상 포트 변경이 필요한 경우 다음을 준수함.
/etc/my.cnf또는/etc/mysql/my.cnf의[mysqld] port변경- 애플리케이션 설정 동시 수정
- SELinux 정책 반드시 함께 수정
포트 변경은 보안을 “강화”하지 않음.
관리 복잡도만 증가시킬 수 있음.
7. SELinux 연계 고려 사항¶
SELinux가 활성화된 환경에서는 포트 변경 시 MySQL 접근이 차단될 수 있음.
SELinux 정책은 별도 문서에서 상세히 다룸.
👉 05-MySQL SELinux 설정 (Production 기준)
8. 금지 패턴 (운영 환경)¶
운영 환경에서 다음 패턴은 금지함.
- 3306 외부 전체 오픈
- 테스트 목적 임시 오픈 후 미회수
%Host 계정 + 포트 오픈 조합- 방화벽 설정 변경 이력 미기록
대부분의 DB 침해 사고는 계정 + 네트워크 설정의 조합 실패에서 발생함.
9. 작업 완료 기준¶
다음 조건을 만족해야 네트워크 및 방화벽 설정이 완료된 것으로 간주함.
- MySQL 포트 외부 노출 없음
- 접근 가능한 Host 명확히 제한됨
- 계정/권한 설계와 일치함
- 방화벽 변경 이력 기록됨