■自分のブログの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
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-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
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
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
iptables -F
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p icmp -j DROP
iptables -A OUTPUT -p icmp -j DROP
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
iptables -A OUTPUT -p tcp --dport 1099 -j ACCEPT
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
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
iptables -A INPUT -p tcp --sport 138 -j DROP
iptables -A INPUT -p tcp --dport 138 -j DROP
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
iptables-save > /etc/iptables-save
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