セキュリティ強化対策(SuSE編)


セキュリティ強化策として、SuSE でも iptables を使ったファイヤウォールを動作させることにしました。
実は、SuSE には、「SuSEfirewall2」という立派なファイヤウォールがあるのですが、おやじの場合、仮想IPアドレスを使用したバーチャルホストを使用していることや、 NIC1枚でのアクセスだと(eth0だけだと)、outは全てallowになってしまうこと、firewall2の規制は、source distnation がほとんど全てanywhereなので、例えば、ファイル共有でnetbios関係をあけると、インターネット側からもアクセスできてしまうことなどがあり、おやじは、このツールは使用せずに RedHat の時と同様に自分で設定することにしました。

■ネットワーク構成

前提となるネットワークは、以下のようにNTT-MEのMN8300Wを使用した自宅サーバとしては極オーソドックスな構成です。

 

■フィルタリングポリシー

ここでは、iptablesの使い方については言及しません。インターネット上に数多くの情報がありますので、そちらを参考にしてください。
HOMEのネットワークアドレスのところと、サービス毎に必要なポートを調べ、通信が始まる方向を考慮して下記を参考に追加すればいいと思います。
おやじのフィルタリングポリシーは、以下のとおりです。
  1. 設定は面倒くさいが、デフォルトルールは暗黙のdeny(DROP)とし、パケットを通過させる必要があるものだけを明示的に指定する。
  2. 基本的に新規にセッションが設定されるものを制御し、セッション確立後の応答パケット(ESTABLISHED)やセッション確立したプロトコルに関連したパケット(FTP-DATA等。RELATED)の通過は許可する。
  3. パケットの出入り口がeth0しかないので、INPUT/OUTPUTチェーンのみを使用し、インターネット側との通信か家庭内との通信かは、アドレスで識別して制御する。(ルータでのプラベートアドレス偽装対策は行っているが、フィルタとしては少し弱い。)
  4. アタック対策(Dos攻撃やsyn flood等)は、ルータに任せる。

iptablesはコマンド投入時点から有効になりますが、セーブしないと再起動すると元の設定に戻ってしまうこと、いちいち入力するには量が多くミスをしやすいことなどから、RedHat ではスクリプト書いて実行結果を保存しておきました。ところが、SuSE には iptables の起動スクリプトがありません。自分で作成すればいいのかもしれませんが、SuSE の決まりごとを調べるのも大変なのとシステム起動時に実行させればいいだけなので、rc.local にスクリプトを書いてしまうことにしました。ところが、SuSE には いくら探しても rc.local がありません。 SuSE の rc.local は boot.local といい、/etc/init.d 配下にあるので、ここに書いてあげれば rc.local と同様に システム起動時に実行されます。

boot.local に直接書いてしまってもいいのですが、他にも起動時に実行したいものがあるとゴチャゴチャになるので、下記内容を /usr/local/bin/firewall.sh として作成し、boot.local には/usr/local/bin/firewall.sh とだけ書きました。
ntpdの初期同期のためのntpdateコマンドへの配慮が不足していました。ntpdateコマンドによるntpサーバへのアクセスはソースポートは不定なので、対応するサーバ(ここではNTP1とする)のフィルタにはソースポートは指定しないようにした。
 
#!/bin/sh

### IPアドレス、ネットワークアドレスの定義 ###
# サーバ機のアドレス #
MYHOST='192.168.1.100'
# 家庭内のアドレス(192.168.0.0/24と1.0/24を合わせて指定)#
HOME='192.168.0.0/23'
# NTPサーバのアドレス #
# NTP1: xxx.xxx.xxx.xxx -- プロバイダ
# NTP2: 210.173.160.57 --- MFEED(ntp2.jst.mfeed.ad.jp)
NTP1='xxx.xxx.xxx.xxx'
NTP2='210.173.160.57'

# ip_conntrack_ftpのロード #
modprobe ip_conntrack_ftp

### iptablesのコマンドパスの定義 ###
IPTABLES='/usr/sbin/iptables'

### IPフォワードの停止 ###
echo 0 > /proc/sys/net/ipv4/ip_forward

### iptablesのチェーンの初期化 ###
$IPTABLES -F

### 暗黙のdeny(デフォルトで拒否)とするルールの設定 ###
$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

### 家庭内からのDNS問い合わせを許可 ###
$IPTABLES -A INPUT  -p udp -s $HOME --dport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $HOME --sport 53 -j ACCEPT
$IPTABLES -A INPUT  -p tcp -m state --state NEW -s $HOME --dport 53 -j ACCEPT
### DNSサーバからの外部DNS問い合わせを許可 ###
$IPTABLES -A OUTPUT -p udp --dport 53 -j ACCEPT
$IPTABLES -A INPUT  -p udp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 53 -j ACCEPT

### 家庭内からのNTP問い合わせを許可 ###
$IPTABLES -A INPUT  -p udp -s $HOME --dport 123 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -o $HOME --sport 123 -j ACCEPT
### NTPサーバからの外部NTP問い合わせを許可 ###
$IPTABLES -A OUTPUT -d $NTP1 -p udp --dport 123 -j ACCEPT
$IPTABLES -A INPUT  -s $NTP1 -p udp --sport 123 -j ACCEPT
$IPTABLES -A OUTPUT -d $NTP2 -p udp --dport 123 --sport 123 -j ACCEPT
$IPTABLES -A INPUT  -s $NTP2 -p udp --dport 123 --sport 123 -j ACCEPT

### 家庭内でのファイル共有(NetBIOS)を許可 ###
$IPTABLES -A INPUT  -p udp -s $HOME --dport 137:138 -j ACCEPT
$IPTABLES -A OUTPUT -p udp -d $HOME --sport 137:138 -j ACCEPT
$IPTABLES -A INPUT  -p tcp -m state --state NEW -s $HOME --dport 139 -j ACCEPT


### 家庭内からのSWAT(SWAT:901)アクセスを許可 ###
$IPTABLES -A INPUT -p tcp -m state --state NEW -s $HOME --dport 901 -j ACCEPT

### 家庭内からのProxyアクセス(PROXY:8080)を許可 ###
$IPTABLES -A INPUT -p tcp -m state --state NEW -s $HOME --dport 8080 -j ACCEPT

### 家庭内でのSSH(22)の使用を許可 ###
$IPTABLES -A INPUT  -p tcp -m state --state NEW -s $HOME --dport 22 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m state --state NEW -d $HOME --dport 22 -j ACCEPT

### WWWサーバへのアクセス(HTTP:80,HTTPS:443)を許可 ###
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT

### 外部WWWサーバへのアクセス(HTTP:80,HTTPS:443)を許可 ###
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 443 -j ACCEPT

### FTPサーバへのアクセス(Active/Passive)を許可 ###
$IPTABLES -A INPUT  -p tcp -m state --state NEW --dport 21 -j ACCEPT
$IPTABLES -A INPUT  -p tcp -m state --state NEW --dport 4000:4029 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --sport 20 -j ACCEPT

### 外部FTPサーバへのアクセス(Active/Passive)を許可 ###
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT
$IPTABLES -A INPUT  -p tcp -m state --state NEW --sport 20 -j ACCEPT

### メールサーバへのアクセス(SMTP:25/465)を許可 ###
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 25 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 465 -j ACCEPT

### 外部メールサーバへのアクセス(SMTP:25,POP3:110)を許可 ###
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 25 -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 110 -j ACCEPT

### メールサーバへのアクセス(POP3:110/995,IMAP:143/993)を許可 ###
### 非SSL系は家庭内のみ許可 ###
$IPTABLES -A INPUT -p tcp -m state --state NEW -s $HOME --dport 110 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW -s $HOME --dport 143 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 993 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW --dport 995 -j ACCEPT


### Ident(113)を拒否(DROPするとレスポンスが遅くなるのでReject) ###
$IPTABLES -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset

### PINGに対する処理 ###
$IPTABLES -A INPUT  -p icmp --icmp-type 8 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
$IPTABLES -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
$IPTABLES -A INPUT  -p icmp --icmp-type 0 -j ACCEPT

### セッション確立後のパケット疎通は許可 ###
$IPTABLES -A INPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

### IPフォワードの開始 ###
echo 1 > /proc/sys/net/ipv4/ip_forward



Top Pageへ