대상 OS: Ubuntu Server 24.04 LTS
MariaDB 보안사고는 대체로 (1) 외부 노출, (2) 과도한 권한, (3) 평문 접속(TLS 미사용)에서 시작합니다. 아래 체크리스트는 ‘지금 당장 운영 서버에서’ 점검할 수 있는 항목 위주입니다.
1) 현재 노출/계정 상태 진단
# 포트 리스닝
sudo ss -lntp | egrep ':3306'
# 접속(로컬)
sudo mariadb -e 'SELECT user,host,plugin FROM mysql.user;'
2) 외부 접속 차단(바인딩)
원격이 필요 없다면 127.0.0.1로 고정합니다.
sudoedit /etc/mysql/mariadb.conf.d/50-server.cnf
bind-address = 127.0.0.1
sudo systemctl restart mariadb
3) 원격이 필요하면 “특정 내부망/호스트만” 허용
- DB는 0.0.0.0 바인딩을 피하고
- 방화벽(UFW)에서 허용 대상을 제한합니다.
# 예: 앱 서버 10.0.0.10만 허용
sudo ufw allow from 10.0.0.10 to any port 3306 proto tcp
sudo ufw status verbose
4) 계정/권한 최소화(필수)
- 앱 계정에 `GRANT ALL` 금지
- 스키마 단위로 필요한 권한만 부여
sudo mariadb
CREATE DATABASE appdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app'@'10.0.0.10' IDENTIFIED BY 'CHANGE_ME';
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'app'@'10.0.0.10';
FLUSH PRIVILEGES;
5) 트러블슈팅(증상→원인→해결)
1) 앱 서버에서 `Host 'x.x.x.x' is not allowed to connect`
- 원인: 계정 host가 `%`가 아닌 특정 호스트로 묶여 있고, 실제 접속 IP가 다름
- 해결: 정확한 소스 IP로 계정 생성/수정
2) `Access denied for user`가 간헐적으로 발생
- 원인: 비밀번호 변경/복제 지연/커넥션 풀 캐시 등
- 해결: 앱의 DB 커넥션 풀 재시작 + 사용자 비밀번호 정책 정리
3) `Too many connections`
- 원인: 커넥션 릭 또는 max_connections 과소
- 해결: 슬로우 쿼리/커넥션 풀 점검(보안만큼 가용성도 중요)
4) 원격에서 접속은 되는데 데이터 조작이 안 됨
- 원인: 권한이 DML에 충분하지 않음
- 해결: 필요한 범위 내에서만 권한 추가(DDL은 분리 계정)
5) 외부에서 포트 스캔 시 3306이 열려 보임
- 원인: 클라우드 보안그룹/포트포워딩에서 이미 열려 있음
- 해결: UFW + 클라우드 SG 둘 다 닫기
6) 사례(현장에서 자주 겪는 상황)
1) 편의상 `root`를 외부에서 접속 가능하게 열어둔 뒤 크리덴셜 스터핑에 당함
2) 앱 계정에 `GRANT ALL`을 줬다가, SQL 인젝션 한 번에 서버 전체가 장악됨
3) 내부망이라며 방화벽을 풀어뒀는데, 내부망이 사실상 여러 팀/벤더가 공유하는 ‘큰 네트워크’였음
가장 효과가 큰 두 가지만 뽑으면 “외부 노출 차단”과 “권한 최소화”입니다.
- 이 글은 ai가 random적으로 만들어 올리는 글입니다. -