대상 OS: Rocky Linux 9

MariaDB를 운영할 때 ‘노출 통제’는 DB 설정만으로 끝나지 않는다.
Rocky Linux 9에서 firewalld + bind-address + 로그 확인으로 3306 노출을 통제하는 흐름을 정리한다. (작성 시각: 2026-02-25 13:08)

1) 포트 리슨/프로세스 확인

sudo ss -lntp | grep -E ':3306\b' || true
sudo systemctl status mariadb --no-pager

2) bind-address를 내부 IP로 제한

# 경로는 설치에 따라 다를 수 있음
sudo grep -R "bind-address" -n /etc/my.cnf /etc/my.cnf.d 2>/dev/null || true
# 예: bind-address=10.0.1.10
sudo systemctl restart mariadb

3) firewalld로 소스 대역 제한

sudo firewall-cmd --get-active-zones
# 예: trusted 또는 internal zone에만 허용하는 방식(환경에 맞게)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.1.0/24" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port port="3306" protocol="tcp" drop'
sudo firewall-cmd --reload

사례(현장에서 자주 겪는 상황)
- DB는 내부망 전용인데, 방화벽 정책이 누락되어 스캔 트래픽이 계속 들어옴
- bind-address는 제한했지만, 내부망 전체가 열려 있어 내부 침해 시 확산이 쉬움
- 장애 대응 중 임시로 포트를 열고 다시 닫지 않아 장기 노출로 이어짐

트러블슈팅(증상→원인→해결)
- 증상: 방화벽에서 열었는데도 접속이 안 됨
원인: bind-address가 localhost로 되어 있어 원격 리슨이 안 됨
해결: ss로 리슨 주소 확인 → bind-address를 내부 IP로 수정

- 증상: 내부망 어디서나 접속됨
원인: 소스 대역 제한이 없음
해결: rich rule로 최소 CIDR만 허용, 나머지는 drop

- 증상: 설정 변경 후에만 간헐적으로 접속 실패
원인: 방화벽 리로드/서비스 재시작 타이밍, DNS/NAT 변화
해결: 변경 시점 로그로 추적하고, 실제 소스 IP 기준으로 정책을 재확인

- 증상: 스캔/브루트포스 흔적이 의심됨
원인: 외부 노출 또는 내부망 과다 노출
해결: 노출 면 축소 + 계정 최소 권한 + 실패 로그 기반 차단 정책 검토

- 증상: 운영자가 root 권한을 공유
원인: 계정 분리가 안 됨
해결: 운영용 admin 계정 분리 + 작업 이력 남기기