2011年5月25日水曜日

Saasesのサーバー借りてみました その2(/4)

4. NTPの設定
# yum -y install ntp
パッケージを入れたら設定します
# vi /etc/ntp.conf
server 0.centos.pool.ntp.org
server 1.centos.pool.ntp.org
server 2.centos.pool.ntp.org
 ↓ に変更
server -4 ntp.nict.jp
server -4 ntp.jst.mfeed.ad.jp
保存したら、起動します。
# ntpdate ntp.nict.jp
# service ntpd start
# chkconfig ntpd on

5. iptables設定
OpenVPNで接続したクライアント用に192.168.11.0/24を割り当てるように想定して設定します。サーバーで開放するポートはSSH用10022番とOpenVPN用1194番です。OpenVPNで接続されたクライアントはIP Masqueradeで外に出れるようにします。
設定用ファイルを作ります。
# vi iptables.sh
下記を記述
#!/bin/bash

#---------------------------------------#
# 設定開始 #
#---------------------------------------#

# LANインタフェース名定義
WAN=eth0

# OpenVPN用設定
$LAN=tun0
LOCALNET_MASK=255.255.255.0
LOCALNET_ADDR=192.168.11.0
LOCALNET=$LOCALNET_ADDR/$LOCALNET_MASK

#---------------------------------------#
# 設定終了 #
#---------------------------------------#

# 自ホストIPアドレス取得
IPADDR=`ifconfig $WAN|sed -e 's/^.*inet addr:\([^ ]*\).*$/\1/p' -e d`

# ファイアウォール停止(すべてのルールをクリア)
/etc/rc.d/init.d/iptables stop

# パスMTU問題対処
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

# デフォルトルール(以降のルールにマッチしなかった場合に適用するルール)設定
iptables -P INPUT DROP # 受信はすべて破棄
iptables -P OUTPUT ACCEPT # 送信はすべて許可
iptables -P FORWARD DROP # 通過はすべて破棄

# SYN Cookiesを有効にする
# ※TCP SYN Flood攻撃対策
sysctl -w net.ipv4.tcp_syncookies=1 > /dev/null
sed -i '/net.ipv4.tcp_syncookies/d' /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies=1" >> /etc/sysctl.conf

# ブロードキャストアドレス宛pingには応答しない
# ※Smurf攻撃対策
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null
sed -i '/net.ipv4.icmp_echo_ignore_broadcasts/d' /etc/sysctl.conf
echo "net.ipv4.icmp_echo_ignore_broadcasts=1" >> /etc/sysctl.conf

# ICMP Redirectパケットは拒否
sed -i '/net.ipv4.conf.*.accept_redirects/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_redirects=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_redirects=0" >> /etc/sysctl.conf
done

# Source Routedパケットは拒否
sed -i '/net.ipv4.conf.*.accept_source_route/d' /etc/sysctl.conf
for dev in `ls /proc/sys/net/ipv4/conf/`
do
sysctl -w net.ipv4.conf.$dev.accept_source_route=0 > /dev/null
echo "net.ipv4.conf.$dev.accept_source_route=0" >> /etc/sysctl.conf
done

# フラグメント化されたパケットはログを記録して破棄
iptables -N LOG_FRAGMENT
iptables -A LOG_FRAGMENT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FRAGMENT] : '
iptables -A LOG_FRAGMENT -j DROP
iptables -A INPUT -f -j LOG_FRAGMENT
iptables -A FORWARD -f -j LOG_FRAGMENT

# 外からの送信元がプライベートIPアドレスのパケットはログを記録して破棄
# ※IP spoofing攻撃対策
iptables -N LOG_SPOOFING
iptables -A LOG_SPOOFING -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES SPOOFING] : '
iptables -A LOG_SPOOFING -j DROP
iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j LOG_SPOOFING
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j LOG_SPOOFING
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j LOG_SPOOFING
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j LOG_SPOOFING
iptables -A FORWARD -i eth0 -s 127.0.0.0/8 -j LOG_SPOOFING
iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -j LOG_SPOOFING
iptables -A FORWARD -i eth0 -s 172.16.0.0/12 -j LOG_SPOOFING
iptables -A FORWARD -i eth0 -s 192.168.0.0/16 -j LOG_SPOOFING

# 外とのNetBIOS関連のアクセスはログを記録せずに破棄
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A INPUT -i eth0 -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A OUTPUT -o eth0 -p udp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A FORWARD -i eth0 -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A FORWARD -i eth0 -p udp -m multiport --dports 135,137,138,139,445 -j DROP
iptables -A FORWARD -o eth0 -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
iptables -A FORWARD -o eth0 -p udp -m multiport --sports 135,137,138,139,445 -j DROP

# 1秒間に4回を超えるpingはログを記録して破棄
iptables -N LOG_PINGDEATH
iptables -A LOG_PINGDEATH -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A LOG_PINGDEATH -j LOG --log-prefix '[IPTABLES PINGDEATH] : '
iptables -A LOG_PINGDEATH -j DROP
iptables -A INPUT -p icmp --icmp-type echo-request -j LOG_PINGDEATH

# 送信元IPアドレスがLANネットワーク範囲外のアクセスはログを記録して破棄
# ※Ingress対策
iptables -N LOG_INGRESS
iptables -A LOG_INGRESS -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INGRESS] : '
iptables -A LOG_INGRESS -j DROP
iptables -A FORWARD -i $LAN -s ! $LOCALNET -j LOG_INGRESS

# 自ホストからのアクセスをすべて許可
iptables -A INPUT -i lo -j ACCEPT

# LANからのアクセスをすべて許可
iptables -A INPUT -i $LAN -j ACCEPT
iptables -A FORWARD -i $LAN -j ACCEPT

# LANからのインターネットへの同時接続を可能にする
# ※IP masquerade(NAPT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# LANから行ったアクセスに対する外からの返答アクセスを許可
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# 外からの必須ICMPパケットを許可
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type source-quench -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type parameter-problem -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type source-quench -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type parameter-problem -j ACCEPT

# 113番ポート(IDENT)へのアクセスには拒否応答
# ※メールサーバ等のレスポンス低下防止
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
iptables -A FORWARD -p tcp --dport 113 -j REJECT --reject-with tcp-reset

# ACCEPT_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを許可するユーザ定義チェイン作成
ACCEPT_COUNTRY_MAKE(){
for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
do
iptables -A ACCEPT_COUNTRY -s $addr -j ACCEPT
done
}

# DROP_COUNTRY_MAKE関数定義
# 指定された国のIPアドレスからのアクセスを破棄するユーザ定義チェイン作成
DROP_COUNTRY_MAKE(){
for addr in `cat /tmp/cidr.txt|grep ^$1|awk '{print $2}'`
do
iptables -A DROP_COUNTRY -s $addr -m limit --limit 1/s -j LOG --log-prefix '[IPTABLES DENY_COUNTRY] : '
iptables -A DROP_COUNTRY -s $addr -j DROP
done
}

# IPアドレスリスト取得
. /root/iptables_functions
IPLISTGET

# 日本からのアクセスを許可するユーザ定義チェインACCEPT_COUNTRY作成
iptables -N ACCEPT_COUNTRY
ACCEPT_COUNTRY_MAKE JP
# 以降,日本からのみアクセスを許可したい場合はACCEPTのかわりにACCEPT_COUNTRYを指定する

# 中国・韓国・台湾※からのアクセスをログを記録して破棄
# ※全国警察施設への攻撃元上位3カ国(日本・アメリカを除く)
# http://www.cyberpolice.go.jp/detect/observation.htmlより
iptables -N DROP_COUNTRY
DROP_COUNTRY_MAKE CN
DROP_COUNTRY_MAKE KR
DROP_COUNTRY_MAKE TW
iptables -A INPUT -j DROP_COUNTRY
iptables -A FORWARD -j DROP_COUNTRY

#----------------------------------------------------------#
# 自ホストが各種サービスを公開する場合の設定(ここから) #
#----------------------------------------------------------#

# WANからの22番ポート(SSH)へのアクセスを許可
# ※SSHサーバーを公開する場合のみ
iptables -A INPUT -i $WAN -p tcp --dport 10022 -j ACCEPT_COUNTRY

# WANからのTCP/UDP53番ポート(DNS)へのアクセスを許可
# ※WAN向けDNSサーバーを運用する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 53 -j ACCEPT
#iptables -A INPUT -i $WAN -p udp --dport 53 -j ACCEPT

# WANからの80番ポート(HTTP)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 80 -j ACCEPT

# WANからの443番ポート(HTTPS)へのアクセスを許可
# ※Webサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 443 -j ACCEPT

# WANからの21番ポート(FTP)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 21 -j ACCEPT_COUNTRY

# WANからのPASV用ポート(FTP-DATA)へのアクセスを許可
# ※FTPサーバーを公開する場合のみ
# ※PASV用ポート60000:60030は当サイトの設定例
#iptables -A INPUT -i $WAN -p tcp --dport 60000:60030 -j ACCEPT_COUNTRY

# WANからの25番ポート(SMTP)へのアクセスを許可
# ※SMTPサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 25 -j ACCEPT

# WANからの465番ポート(SMTPS)へのアクセスを許可
# ※SMTPSサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 465 -j ACCEPT_COUNTRY

# WANからの110番ポート(POP3)へのアクセスを許可
# ※POP3サーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 110 -j ACCEPT_COUNTRY

# WANからの995番ポート(POP3S)へのアクセスを許可
# ※POP3Sサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 995 -j ACCEPT_COUNTRY

# WANからの143番ポート(IMAP)へのアクセスを許可
# ※IMAPサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 143 -j ACCEPT_COUNTRY

# WANからの993番ポート(IMAPS)へのアクセスを許可
# ※IMAPSサーバーを公開する場合のみ
#iptables -A INPUT -i $WAN -p tcp --dport 993 -j ACCEPT_COUNTRY

# WANからのUDP1194番ポート(OpenVPN)へのアクセスを許可
# ※IMAPSサーバーを公開する場合のみ
iptables -A INPUT -i $WAN -p udp --dport 1194 -j ACCEPT_COUNTRY

# 上記のルールにマッチしなかったアクセスはログを記録して破棄
iptables -A INPUT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES INPUT] : '
iptables -A INPUT -j DROP
iptables -A FORWARD -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES FORWARD] : '
iptables -A FORWARD -j DROP

# 再起動時にも上記設定が有効となるようにルールを保存
/etc/rc.d/init.d/iptables save

# ファイアウォール起動
/etc/rc.d/init.d/iptables start
IPアドレスリスト取得用スクリプトを作ります。
# vi iptables_functions
下記を記述
# IPアドレスリスト取得関数定義
IPLISTGET(){
# http://nami.jp/ipv4bycc/から最新版IPアドレスリストを取得する
wget -q http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip cidr.txt.gz
# 最新版IPアドレスリストが取得できなかった場合
if [ ! -f cidr.txt ]; then
if [ -f /tmp/cidr.txt ]; then
# バックアップがある場合はその旨をroot宛にメール通知して処理を打ち切る
echo cidr.txt was read from the backup! | mail -s $0 root
return
else
# バックアップがない場合はその旨をroot宛にメール通知して処理を打ち切る
echo cidr.txt not found!|mail -s $0 root
exit 1
fi
fi
# 最新版IPアドレスリストを /tmpへバックアップする
/bin/mv cidr.txt /tmp/cidr.txt
}
IPアドレスリスト更新チェック
# vi /etc/cron.daily/iplist_check-router.sh
下記を記述
#!/bin/bash

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

# 新旧IPLIST差分チェック件数(0を指定するとチェックしない)
# ※新旧IPLIST差分がSABUN_CHKで指定した件数を越える場合はiptables設定スクリプトを実行しない
# ※新旧IPLIST差分チェック理由はhttp://centossrv.com/bbshtml/webpatio/1592.shtmlを参照
SABUN_CHK=100
[ $# -ne 0 ] && SABUN_CHK=${1}

# チェック国コード
COUNTRY_CODE='JP CN KR TW'

# iptables設定スクリプトパス
IPTABLES=/root/iptables-router.sh

# iptables設定スクリプト外部関数取り込み
. /root/iptables_functions

# IPアドレスリスト最新化
rm -f IPLIST.new
IPLISTGET
for country in $COUNTRY_CODE
do
if [ -f /tmp/cidr.txt ]; then
grep ^$country /tmp/cidr.txt >> IPLIST.new
else
grep ^$country /tmp/IPLIST >> IPLIST.new
fi
done
[ ! -f /tmp/IPLIST ] && cp IPLIST.new /tmp/IPLIST

# IPアドレスリスト更新チェック
diff -q /tmp/IPLIST IPLIST.new > /dev/null 2>&1
if [ $? -ne 0 ]; then
if [ ${SABUN_CHK} -ne 0 ]; then
if [ $(diff /tmp/IPLIST IPLIST.new | egrep -c '<|>') -gt ${SABUN_CHK} ]; then
(
diff /tmp/IPLIST IPLIST.new
echo
echo "$IPTABLES not executed."
) | mail -s 'IPLIST UPDATE' root
rm -f IPLIST.new
exit
fi
fi
/bin/mv IPLIST.new /tmp/IPLIST
$IPTABLES > /dev/null
else
rm -f IPLIST.new
fi
保存したら実行します。
# chmod 700 iptables.sh
# chmod +x /etc/cron.daily/iplist_check-router.sh
# ./iptables.sh

0 件のコメント:

コメントを投稿