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


セキュリティを強化するため、こちらでネットワーク構成とルータの設定を大幅に変更しましたが、今まで手を抜いていたサーバ機のファイヤウォールの設定を合わせて見直しました。
サーバ機で使用しているRedHat 8.0では、iptablesを使ったファイヤウォールがインストールされていますので、この設定を見直しました。

DNSはUDP:53と思っていたのですが、クライアントが名前解決するときに512byteを越えた場合、DNSは512byte以上のデータはUDPで送信できないため、クライアントは再度TCPで牽き直していることが判明したので、TCPの設定を追加しました。
外部FTPサーバへのPASVアクセス時のデータコネクション設定を、ip_conntrack_ftpでのステートフルインスペクション対応に変更しました。
ntpdの初期同期のためのntpdateコマンドへの配慮が不足していました。ntpdateコマンドによるntpサーバへのアクセスはソースポートは不定なので、対応するサーバ(ここではNTP1とする)のフィルタにはソースポートは指定しないようにした。

■ネットワーク構成

前提となるネットワークは、以下のようにNTT-MEのBA8000 ProのVLAN機能でサーバとクライアントを別セグメントで分離した構成です。

 

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

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

iptablesはコマンド投入時点から有効になりますが、セーブしないと再起動すると元の設定に戻ってしまうこと、いちいち入力するには量が多くミスをしやすいことなどから、下記のようなスクリプトを適当な名前で作成・保存しておけば、設定変更も楽です。
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='/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
$IPTABLES -A OUTPUT -p tcp -m state --state NEW --dport 1024: -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

### 設定内容の保存 ###
/etc/rc.d/init.d/iptables save

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



Top Pageへ