Lennyのiptablesをデーモン化

■自分のブログのiptablesの設定が散らばっているので、
 後で見たときに少し困る。

 openssh-server設定
 http://d.hatena.ne.jp/labunix/20110122

 iptablesの設定の見直し
 http://d.hatena.ne.jp/labunix/20111104

 iptables にnetbios名前解決用のポートを追加する
 http://d.hatena.ne.jp/labunix/20111105

■ただまとめるのもつまらないので、OUTPUTも基本ポリシーをDROPにする。
 また、vmplayerのvmnet8に対して設定を行う。

■ポートスキャン(nmap)とパケットキャプチャ(tcpdump)の準備

$ sudo apt-get install nmap tcpdump

■既存のポートチェック
 ssh,smtp,?,squid,?

$  netstat -tan --protocol inet | awk -F\: '{print $2}' | awk '{print $1}' | sort -n | uniq | column
22      25      111     7080    53826

■「?」にした箇所を調べる。
 ※1024以下ならまずは「/etc/services」を。
  まあ、RPCなんですけど。。。

$ grep '111' /etc/services
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper
sunrpc          111/udp         portmapper

$ sudo lsof -i | grep "53826\|sunrpc"
portmap   1912      daemon    4u  IPv4   4541       UDP *:sunrpc
portmap   1912      daemon    5u  IPv4   4544       TCP *:sunrpc (LISTEN)
rpc.statd 1923       statd    8u  IPv4   4587       TCP *:53826 (LISTEN)

$ sudo rpcinfo -p vmlenny86
   プログラム バージョン プロトコル ポート
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  54227  status
    100024    1   tcp  53826  status

■マスカレードの無効確認

$ netstat -M
netstat: no support for `ip_masquerade' on this system.
■ssh宛てのブルートフォースアタックの禁止

 参考:sshへの総当り攻撃をiptablesの2行で防ぐ方法
 http://blog.browncat.org/2007/07/sshiptables2.html

■通常のポートスキャンとクリスマススキャンに違いが出る。

$ sudo nmap -p 22 vmlenny86 2> /dev/null | grep ssh
22/tcp open  ssh

$ sudo nmap -p 22 -sX vmlenny86 2> /dev/null | grep ssh
22/tcp open|filtered ssh

■詳細スキャンをすると「/etc/hosts.allow」「/etc/hosts.deny」で
 制御されていることが分かる。

$ sudo nmap -A -T4 -v vmlenny86 2>&1 | grep "ssh\|22\/"
Discovered open port 22/tcp on 192.168.72.109
22/tcp open  tcpwrapped

■ブロックログの確認
 ※例えば、よくあるNETBIOS。

$ sudo cat /var/log/syslog | sed s/" "/"\n"/g | grep "IPTABLES\|TCP\|UDP\|SPT=\|DPT=" | tail -8
IPTABLES_INPUT_LOG
PROTO=UDP
SPT=138
DPT=138
IPTABLES_INPUT_LOG
PROTO=UDP
SPT=138
DPT=138

$ grep 138 /etc/services
netbios-dgm     138/tcp                         # NETBIOS Datagram Service
netbios-dgm     138/udp

$ whereis net | grep bin || echo "Not Found \"net\" command"
Not Found "net" command

■どんなパケットが来るのかはtcpdumpで。

$ sudo tcpdump -n port 138

■対象にWebサーバが無いとnmapのすべてのテストを正常終了出来ないのだが。。。
 とりあえず実行結果をシステムメールで通知

$ sudo nmap -A -T4 vmlenny86 2>&1 | mail -s "penetration test report" root

■Javaがあるシステムでした。

$ sudo grep 1099 /etc/services
rmiregistry     1099/tcp                        # Java RMI Registry
rmiregistry     1099/udp

$ su root -c 'lsof -i | head -1;sleep 1;lsof -i | grep -i RMI' | awk '{print $1 "," $5 "," $7}'
COMMAND,TYPE,SIZE
java,IPv6,TCP
java,IPv6,TCP

■上記テストから、ICMPには応答しないことにする
 Windowsがいない環境だとnetbios系のログが静かだが、sshも名前ベースなら必要かも知れない。
 nmapでスキャンされたログがsyslogに大量に載るので、不要なら更にカスタマイズする。
 ログを出さないという方法もあるが、問題を闇に葬るだけなのでお勧めはしない。
 各種ゾーンで分けるのはまた後日。
 snortのレポートも減るので、別の事象に気が付くようになるかも。。。

$ sudo cat firewall.sh
#!/bin/sh -x
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 5
# Default-Stop:      2 3 5
# Short-Description: iptables & iptables-save
# Description:       Custom Firewall                 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

if [ `id -u` -ne "0" ];then
  echo "Operation is not permitted."
  exit 1
fi

test -f /etc/iptables-save || touch /etc/iptables-save

# clear setting
iptables -F

# clear packet counter
iptables -Z

# policy
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

# allow lo
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# allow established
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# allow icmp
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j DROP

# DNS
iptables -A INPUT -p tcp --dport 53 -j DROP
iptables -A INPUT -p udp --dport 53 -j DROP
iptables -A OUTPUT -p tcp --dport 53 -j DROP
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Java RMI 1099
iptables -A OUTPUT -p tcp --dport 1099 -j ACCEPT

# for ssh attack
iptables -A INPUT -ieth0 -p tcp --dport 22 -m state --state NEW \
  -m recent --set --name SSH
iptables -A INPUT -ieth0 -p tcp --dport 22 -m state --state NEW \
  -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

# normal ssh start
#SSHPORT='22'
#iptables -A INPUT -p tcp --dport ${SSHPORT} -j ACCEPT
#iptables -A FORWARD -i eth0 -p tcp --dport ${SSHPORT} -j ACCEPT
# normal ssh end

# squid
iptables -A INPUT -p tcp --dport 7080 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 3128 -j ACCEPT
iptables -A OUTPUT -p udp --dport 3130 -j ACCEPT

# netbios drop
iptables -A INPUT -p tcp --sport 138 -j DROP
iptables -A INPUT -p tcp --dport 138 -j DROP

# netbios accept
#iptables -A INPUT -p udp --sport 138 -j ACCEPT
#iptables -A INPUT -p udp --dport 138 -j ACCEPT
#iptables -A OUTPUT -p udp --sport 138 -j ACCEPT
#iptables -A OUTPUT -p udp --dport 138 -j ACCEPT

# ntp accept
#iptables -A INPUT -p tcp --dport 119 -j ACCEPT

# disallow else
iptables -A INPUT -j LOG --log-prefix "IPTABLES_INPUT_LOG : " --log-level=info
iptables -P INPUT DROP

iptables -A OUTPUT -j LOG --log-prefix "IPTABLES_OUTPUT_LOG : "
iptables -P OUTPUT DROP

# save configuration
iptables-save > /etc/iptables-save

# system mail
cat /etc/iptables-save | mail -s "iptables report" root

■サービス登録
 今の所、停止方法も無く、ルールにも沿っていないのでご注意を。
 /etc/rc2.d/S*sshの最後にひっそりと実行パスを入れておくのもひとつの手です。
 networkの起動の方が先であれば、その短い間にicmpに応答します。

$ sudo mv firewall.sh /etc/init.d/
$ sudo /sbin/insserv -v firewall.sh
$ sudo ls /etc/rc*/*firewall.sh
/etc/rc0.d/K01firewall.sh  /etc/rc3.d/S19firewall.sh  /etc/rc6.d/K01firewall.sh
/etc/rc1.d/K01firewall.sh  /etc/rc4.d/S19firewall.sh
/etc/rc2.d/S19firewall.sh  /etc/rc5.d/S19firewall.sh