CB정보통신 인프라 보안 구축 — 7개 파트 구축 · 통합 검증 완료 ✓

PART 05 // DB · SERVER SECURITY

데이터는 안쪽,
문은 하나만

서버팜 안쪽의 MySQL 은 웹 서버 한 대만, 딱 3306 으로만 닿게 했습니다. 계정 권한과 iptables 로 이중으로 막고, 막힌 시도는 로그로 남깁니다.

허용은 둘,
나머지는 기록 후 폐기

192.168.30.20CB-DB
1 ACCOUNTWEB HOST ONLY
INPUT DROPDEFAULT POLICY
[DB_DROP]→ LOG SERVER

// WHAT WE BUILT

DB / 서버 보안에서 만든 것

BIND · GRANT

계정부터 좁게

MySQL 은 서버팜 주소에만 바인드하고, 게시판 계정은 웹 서버 주소 172.16.10.10 에서만, 필요한 권한(SELECT · INSERT · UPDATE · DELETE)만 받습니다.

IPTABLES

기본은 전부 거부

INPUT · FORWARD 기본 정책을 DROP 으로 두고, 담당자 PC 의 SSH 2222 와 웹 서버의 3306 만 엽니다.

DROP LOG

막은 것도 남긴다

거부된 패킷은 [DB_DROP] 접두어로 분당 5건까지 기록하고, rsyslog 로 로그 서버에 보냅니다.

// CONFIGURATION

실제로 넣은 설정

장비에 입력한 순서 그대로입니다. 계정 비밀번호는 공개 사이트라 가렸습니다.

STEP 01

MySQL 계정 제한

비밀번호는 가렸습니다.

mysql
sudo sed -i 's/^bind-address.*/bind-address = 192.168.30.20/' \
  /etc/mysql/mysql.conf.d/mysqld.cnf
CREATE DATABASE cbboard CHARACTER SET utf8mb4;
CREATE USER 'boarduser'@'172.16.10.10' IDENTIFIED BY '********';
GRANT SELECT,INSERT,UPDATE,DELETE ON cbboard.* TO 'boarduser'@'172.16.10.10';

STEP 02

iptables 정책

허용 두 줄 뒤에 로그 · 거부를 둡니다.

iptables
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp -s 192.168.10.50 --dport 2222 -j ACCEPT
sudo iptables -A INPUT -p tcp -s 172.16.10.10  --dport 3306 -j ACCEPT
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "[DB_DROP] "
sudo iptables -A INPUT -j DROP
sudo netfilter-persistent save

STEP 03

차단 로그 분리 · 전송

로컬 파일과 로그 서버로 동시에.

/etc/rsyslog.d/10-dbdrop.conf
:msg, contains, "[DB_DROP] " /var/log/db_drop.log
:msg, contains, "[DB_DROP] " @@192.168.30.30:514
& stop

// VERIFICATION

검증 완료

nc -zv
cb-web$ nc -zv 192.168.30.20 3306
Connection to 192.168.30.20 3306 port [tcp/mysql] succeeded!

user-pc$ nc -zv 192.168.30.20 3306
nc: connect to 192.168.30.20 port 3306 (tcp) timed out

cb-db$ sudo tail -1 /var/log/db_drop.log
[DB_DROP] IN=ens160 SRC=192.168.20.14 DST=192.168.30.20 DPT=3306
  • 웹 서버 → 3306 성공nc -zv
  • 다른 PC → 3306 차단timed out
  • 차단 기록 남음/var/log/db_drop.log
  • 재부팅 후에도 정책 유지netfilter-persistent

// PITFALLS

겪었던 문제와 해결

증상원인해결
정책 넣자마자 SSH 끊김ESTABLISHED 허용보다 DROP 을 먼저 적용허용 규칙 먼저, 기본 정책은 마지막에