BIND · GRANT
계정부터 좁게
MySQL 은 서버팜 주소에만 바인드하고, 게시판 계정은 웹 서버 주소 172.16.10.10 에서만, 필요한 권한(SELECT · INSERT · UPDATE · DELETE)만 받습니다.
// WHAT WE BUILT
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
장비에 입력한 순서 그대로입니다. 계정 비밀번호는 공개 사이트라 가렸습니다.
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';
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
:msg, contains, "[DB_DROP] " /var/log/db_drop.log :msg, contains, "[DB_DROP] " @@192.168.30.30:514 & stop
// VERIFICATION
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
// PITFALLS
| 증상 | 원인 | 해결 |
|---|---|---|
| 정책 넣자마자 SSH 끊김 | ESTABLISHED 허용보다 DROP 을 먼저 적용 | 허용 규칙 먼저, 기본 정책은 마지막에 |