ServersMan@VPSはインターネットから到達可能なポートに制限がありません。
逆に言うと仮想OSは丸裸同然でインターネットに公開されていることになります。
これは色々とまずいです。
ファイアウォールやルータなどフィルタリングしてくれる機器がないとなると自分で何とかしなければなりません。
Linuxであればローカルファイアウォールとしてiptablesというものがありますので、活用したいと思います。
最初は何もルールが登録されていません。
[root@dti-vps-srv20 ~]# /sbin/iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
必要に応じてルールを追加していきます。
外部に公開するサーバであればINPUTに制限をかける必要があります。
・localhostからの通信は全て許可
・プライベートIPアドレスからの通信は拒否し、ログを取得する
・SSHは特定のIPアドレスからのみ許可
・SMTPとHTTPとHTTPSを許可
・ICMPは特定のIPアドレスからのみ許可
・上記ルールに一致しないものは全てログを取得する
# /sbin/iptables -A INPUT -i lo -j ACCEPT # /sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # /sbin/iptables -A INPUT -s 10.0.0.0/8 -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Spoofed_source_IP):" # /sbin/iptables -A INPUT -s 10.0.0.0/8 -j DROP # /sbin/iptables -A INPUT -s 172.16.0.0/12 -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Spoofed_source_IP):" # /sbin/iptables -A INPUT -s 172.16.0.0/12 -j DROP # /sbin/iptables -A INPUT -s 192.168.0.0/16 -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Spoofed_source_IP):" # /sbin/iptables -A INPUT -s 192.168.0.0/16 -j DROP # /sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT # /sbin/iptables -A INPUT -p tcp -m tcp --dport 25 -m state --state NEW -j ACCEPT # /sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT # /sbin/iptables -A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT # /sbin/iptables -A INPUT -s xxx.xxx.xxx.xxx -p icmp -m icmp --icmp-type 8 -j ACCEPT # /sbin/iptables -A INPUT -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Default_INPUT):" # /sbin/iptables -A FORWARD -m limit --limit 1/sec -j LOG --log-prefix "DROPPED(Default_FORWARD):" # /sbin/iptables -P FORWARD DROP
まだルールに一致しない通信も許可されています。
最後にルールに一致しない通信を拒否するようにします。
※iptablesの設定が間違っていると一切通信ができなくなる可能性もあるので注意してください。
# /sbin/iptables -P INPUT DROP
最終的なiptablesの設定は下記のようになりました。
# /sbin/iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED LOG all -- 10.0.0.0/8 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Spoofed_source_IP):' DROP all -- 10.0.0.0/8 0.0.0.0/0 LOG all -- 172.16.0.0/12 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Spoofed_source_IP):' DROP all -- 172.16.0.0/12 0.0.0.0/0 LOG all -- 192.168.0.0/16 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Spoofed_source_IP):' DROP all -- 192.168.0.0/16 0.0.0.0/0 ACCEPT tcp -- xxx.xxx.xxx.xxx 0.0.0.0/0 tcp dpt:22 state NEW ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:25 state NEW ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 state NEW ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 state NEW ACCEPT icmp -- xxx.xxx.xxx.xxx 0.0.0.0/0 icmp type 8 LOG all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Default_INPUT):' Chain FORWARD (policy DROP) target prot opt source destination LOG all -- 0.0.0.0/0 0.0.0.0/0 limit: avg 1/sec burst 5 LOG flags 0 level 4 prefix `DROPPED(Default_FORWARD):' Chain OUTPUT (policy ACCEPT) target prot opt source destination
このままだとOS再起動でiptablesの設定が消えてしまうので保存します。
# /sbin/service iptables save Saving firewall rules to /etc/sysconfig/iptables: [ OK ]
iptablesのログはkernelログとして出力されます。
2個所修正します。
/etc/syslog.conf
kern.* /var/log/kernel.log *.info;mail.none;authpriv.none;cron.none,kern.none /var/log/messages
ファイルを作成してからSYSLOGの設定変更を反映させます。
# touch /var/log/kernel.log # chmod 600 /var/log/kernel.log # kill -HUP syslogのプロセス
ログが出ているか確認します。
ロ、ログが出ません。。。
dmesgには出ているのでiptablesの設定は問題ないようです。
これについては次回Entryで。
# tail -f /var/log/kernel.log # dmesg DROPPED(Default_INPUT):IN=venet0 OUT= MAC= SRC=xxx.xxx.xxx.xxx DST=yyy.yyy.yyy.yyy LEN=60 TOS=0x00 PREC=0x00 TTL=45 ID=58637 DF PROTO=TCP SPT=39655 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0