2008年09月07日

OpenSimサーバ構築記録8 (手作りファイアウォール編)

● OpenSimサーバがポートスキャンされてました。 わ~い。 ^^/

と、喜んでる場合ではないのですが、手作りのファイアウォールがしっかり働いている所を見るのは、
やっぱりはうれしいものです。
普通はルータでファイアウォールを構築するのが当然ですけど、
Linuxならファイアウォールのルールを一つずつ作り上げていく、という手作りの楽しみがあります。
ネットワークやTCP/IPの勉強にもなりますし。



● ポートスキャンされた記録

試験的に、スタンドアロンモードのOpenSimサーバを2ヶ月ほど公開してましたが、
8月10日の不正アクセスログの一部です。8000~10000のポート番号がスキャンされてました。

SRC=59.188.XXX.XXX   : アクセス元IPアドレス、APNICで調べたところ、59.188は香港です。
DPT=9000                    : アクセス先ポート番号、OpenSim Standaloneモードのポート番号です。

Aug 10 20:49:40 ns kernel: ## UNDEFINED_INPUT ## IN=eth0 OUT= SRC=59.188.XXX.XXX DST=221.999.999.999 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=5039 DF PROTO=TCP SPT=3698 DPT=9000 WINDOW=65535 RES=0x00 SYN URGP=0

Aug 10 20:49:43 ns kernel: ## UNDEFINED_INPUT ## IN=eth0 OUT= SRC=59.188.XXX.XXX DST=221.999.999.999 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=5041 DF PROTO=TCP SPT=3698 DPT=9000 WINDOW=65535 RES=0x00 SYN URGP=0

Aug 10 20:49:47 ns kernel: ## UNDEFINED_INPUT ## IN=eth0 OUT= SRC=59.188.XXX.XXX DST=221.999.999.999 LEN=48 TOS=0x00 PREC=0x00 TTL=128 ID=5044 DF PROTO=TCP SPT=3700 DPT=9000 WINDOW=65535 RES=0x00 SYN URGP=0

もちろんOpenSimを直接狙ったスキャンではないでしょうけれど、インターネットは危険がいっぱいです。
OpenSim自体にも必ず脆弱性・セキュリティホールはあるはずですから、セキュリティ対策は必要ですね~。



● Linuxカーネルのファイアウォール(Netfilter)の設定を確認

iptablesコマンドを使って、ファイアウォールの設定/確認ができます。
デフォルトで、3つのチェイン(ルールが繋がったもの)があります。

root@opensim1:~/bin# iptables -L

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チェイン       :カーネル空間に入ってくるパケットのルール
OUTPUTチェイン    :カーネル空間から出て行くパケットのルール
FORWARDチェイン :LANカード複数ざしの場合、パケットルーティングのルール

デフォルトでは、すべて許可(policy ACCEPT)になってます。
最近のLinuxはインストール時にGUIで設定できますけど、きめ細かい設定は、やっぱり
手作りが必要になってきます。





● 手作りファイアウォール(/etc/init.d/myfirewall.sh) B-Shell スクリプト

#!/bin/sh

#--------------------------------------------------------------------------------------------------
# シェル変数の設定:接続元(自分のパソコン)のIPアドレスを指定してます。
# スクリプト内では、$MYPCで参照できます。
#--------------------------------------------------------------------------------------------------
MYPC=999.999.999.999


#--------------------------------------------------------------------------------------------------
# チェインのクリア:ファイアウォールの設定を全て初期化します。
#--------------------------------------------------------------------------------------------------
iptables -F             # INPUT,OUTPUT,FORWARDチェインのクリア
iptables -F -t nat   # NATテーブルのクリア
iptables -X            # ユーザ定義チェインの削除
iptables -Z            # パケットカウントの0クリア


#--------------------------------------------------------------------------------------------------
# デフォルトポリシーの設定 : 全てのパケットの送受信を拒否(DROP)します。
#--------------------------------------------------------------------------------------------------
iptables -P INPUT       DROP
iptables -P OUTPUT    DROP
iptables -P FORWARD DROP


#--------------------------------------------------------------------------------------------------
# ユーザチェイン(SYNFLOOD)の作成 : SYNFlood/DoS攻撃チェック
# 「-N」でルールのサブルーチンを作ることができます。
# 短時間に大量のSYNパケット(一番目のパケット)が送られてきたら
# ログに記録して拒否します。
#--------------------------------------------------------------------------------------------------
iptables -N SYNFLOOD
iptables -A SYNFLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN
iptables -A SYNFLOOD -m limit --limit 1/s --limit-burst 10 -j LOG --log-level=1 --log-prefix '## SYNFLOOD ## '
iptables -A SYNFLOOD -j DROP


#--------------------------------------------------------------------------------------------------
# INPUT/OUTPUTで許可(ACCEPT)する共通ルール(ステートフルパケットフィルタ)
# 許可したSYNパケット(一番目のパケット)に関係するパケットは、
# RELATED,ESTABLISHEDでまとめて表現して許可します。
#--------------------------------------------------------------------------------------------------
iptables -A INPUT    -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


#--------------------------------------------------------------------------------------------------
# INPUTチェイン1
# 自分自身(内部)からの受信「-i lo」は無条件で許可します。
# プロセス間の通信は無条件で許可します。
#--------------------------------------------------------------------------------------------------
iptables -A INPUT -i lo -j ACCEPT


#--------------------------------------------------------------------------------------------------
# INPUTチェイン2
# SYNフラグの立った第1パケット(--syn)は、SYNFLOODルールでチェックします。
# DoS(Deny of Service)攻撃と判断できたら拒否されます。
#--------------------------------------------------------------------------------------------------
iptables -A INPUT -p tcp --syn -j SYNFLOOD


#--------------------------------------------------------------------------------------------------
# INPUTチェイン3
# OpenSimサーバのメンテナンス/ファイル転送用にOpenSSH(TCP/22)を起動してます。
# 自分のパソコン($MYPC)から、(TCP/22)への接続(第一パケット --state NEW)を許可
# します。TelnetやFtpは暗号化しないのでパスワードや通信内容が丸見えです。
# なるべく使わないようにしましょう。
#--------------------------------------------------------------------------------------------------
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -s $MYPC --dport 22 -j ACCEPT


#--------------------------------------------------------------------------------------------------
# INPUTチェイン (OpenSim用ポートの開放)
# スタンドアロンモード(9000)/グリッドモード(8002)どちらかを使い分けます。
# 一般開放していないので、接続元は自分のパソコン($MYPC)のみに限定。
# ちなみに、OpenSSHでポートフォーワードしているなら、上記TCP/22のみ
# 開放すればOK
#--------------------------------------------------------------------------------------------------
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -s $MYPC --dport 8002 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -s $MYPC --dport 9000 -j ACCEPT
iptables -A INPUT -i eth0 -p udp                                  -s $MYPC --dport 9000 -j ACCEPT


#--------------------------------------------------------------------------------------------------
# INPUTチェイン (Ping, Traceroute用)
# ネットワークの疎通確認するときは有効にします。(普段はコメントにして拒否)
#--------------------------------------------------------------------------------------------------
#iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request                  -j ACCEPT
#iptables -A INPUT -i eth0 -p icmp --icmp-type echo-reply                       -j ACCEPT
#iptables -A INPUT -i eth0 -p icmp --icmp-type destination-unreachable -j ACCEPT
#iptables -A INPUT -i eth0 -p icmp --icmp-type source-quench                -j ACCEPT
#iptables -A INPUT -i eth0 -p icmp --icmp-type time-exceeded                -j ACCEPT
#iptables -A INPUT -i eth0 -p icmp --icmp-type parameter-problem         -j ACCEPT


#--------------------------------------------------------------------------------------------------
# OUTPUTチェイン1
# 自分自身(内部)からの送信「-o lo」は無条件で許可します。
# プロセス間の通信は無条件で許可します。
#--------------------------------------------------------------------------------------------------
iptables -A OUTPUT -o lo -j ACCEPT


#--------------------------------------------------------------------------------------------------
# OUTPUTチェイン2
# インターネット上の、以下のサービスへのアクセスを許可します。
# HTTP(TCP/80)、HTTPS(TCP/443)、DNS(UDP/53)、TIME(UDP/123)
#--------------------------------------------------------------------------------------------------
iptables -A OUTPUT -o eth0 -p tcp -m state --state NEW --dport 80   -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m state --state NEW --dport 443 -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp                                  --dport 53   -j ACCEPT
iptables -A OUTPUT -o eth0 -p udp                                  --dport 123 -j ACCEPT


#--------------------------------------------------------------------------------------------------
# Logに記録
# 上記ルールにマッチしない接続はカーネルログ(/var/log/kernel.log)に記録します。
#--------------------------------------------------------------------------------------------------
iptables -A INPUT    -j LOG --log-prefix '## UNDEFINED_INPUT ## '
iptables -A OUTPUT -j LOG --log-prefix '## UNDEFINED_OUTPUT ## '




● おしまい

まだまだ、鍛えるところはいっぱいありますけど、基本はこんなところでしょうか?
詳しい方がおられましたら、どんどん突っ込んでくださいませ~。 _O_

あ~、もうすぐ情報処理試験だ。TOEICも受けろと言われてるし、、
こんなことしてていいのか~。。><


  

Posted by ぱすてる at 11:14Comments(0)TrackBack(0)OpenSim