NATサーバに必要なファイアウォール設定とデータベースサーバ、メールサーバ
2006年12月27日(水)
NATサーバに必要なファイアウォール設定
インターネットのようなセキュアでないネットワークとエンタープライズ用途のLANセグメントを接続する場合、企業内に設置したサーバの不要なポートやサービスを停止する作業が必要です。さらに、企業内LAN全体を守るためにはこういった対処と同時に、ファイアウォールを導入するべきでしょう。
Red Hat Enterprise Linuxにおいては、ファイアウォールはiptablesコマンドを駆使することで実現可能です。しかし現在では高機能なファイアウォール製品が提供されており、エンタープライズ用途ではそういった専用の機材を導入するのが一般的です。
とはいえ予算の都合上、高いセキュリティを実現するファイアウォール製品を購入できないこともあります。このようなケースでは、NATサーバを設置してiptablesによるファイアウォールを設定することも考えられます。
また、小規模なオフィスやSOHO環境などではブロードバンドルータ側にファイアウォール機能が搭載されていることがあります。簡易なファイアウォール機能のみが必要な場合はこれらの機能で充分ですが、独自の規制を行いたいといった場合はLinuxによるサーバを設置し、iptablesによるファイアウォールを設定することとなります。
一般にファイアウォールを含め、Linuxにおけるセキュアシステムの構築方法としては以下の3種類があげられます。
- ホストベースのセキュリティ(例:tcp_wrapper)
- ユーザベースのセキュリティ(例:PAM)
- パケットベースのセキュリティ(例:iptables)
tcp_wrapperやPAMといったセキュリティ対策は、LANセグメント内でユーザやホストを限定して行うものですが、iptablesはパケットレベルでのアクセス制限をかけるため非常に強力です。ファイアウォールにiptablesが利用されているのも、パケットレベルでのアクセス制限を掛けることができるためです。
本連載の第3回「IPアドレスを管理する『DHCPサーバ』と通信の橋渡し『NATルータ』」で解説したNATサーバの環境では、グローバルIPアドレスを持つLANをインターネットと考えた場合、NATサーバがインターネットに晒された状態となり非常に危険です。
クラッカーがクラッキングソフトウェアを使ってインターネット経由でしらみつぶしにサーバを攻撃することを考えると、セキュリティ要件を満たすための最低限の設定ではあまりにも危険であることがわかると思います。
精度の高いファイアウォールの設定を行うことは非常に難しいものですが、ここでは、ある程度定石となっているLinuxサーバで実現したNATルータのファイアウォール設定を紹介します。ファイアウォール設定の前提条件として、NATルータとなるLinuxサーバ上で以下のスクリプトが実行されているものとします。
#!/bin/sh
# eth1: Internet
# eth0: Local LAN: 172.16.X.X/16
# [Internet/Global IP LAN]]]---[eth1][NAT Box][eth0]---[Private IP Local LAN]
MYHOST=`/sbin/ifconfig eth1|grep inet|cut -d':' -f 2 |cut -d ' ' -f 1`
← グローバルIPアドレスを取得
MYLOCAL=`/sbin/ifconfig eth0|grep inet|cut -d':' -f 2 |cut -d ' ' -f 1`
← プライベートIPアドレスを取得
LOCALNET='172.16.0.0/16'
echo 1 > /proc/sys/net/ipv4/ip_forward
← IPフォワーディングを有効化
/sbin/iptables ?F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P FORWARD DROP ← フォワードされるパケットをドロップ
/sbin/iptables -P INPUT DROP ← NATサーバ宛のパケットをドロップ
/sbin/iptables -P OUTPUT DROP ← NATサーバから出て行くパケットをドロップ
上記のスクリプトは、NATルータとして利用しているLinuxサーバに存在するNICがeth0とeth1に設定されている場合のものです。ここでは、eth1がグローバルIPアドレスのLANに、eth0がプライベートIPアドレスのLAN環境に接続されていると仮定しています。
スクリプト内において-Pオプションで指定されているFORWARD/INPUT/OUTPUTの各チェインは、それぞれNATルータを経由するパケットと入ってくるパケット、送出されるパケットについて規則を適用します。
ファイアウォールを設定する場合、まず最初に一番厳しい設定を施し、そこから徐々に利用を許可するポートを追加していきます。ここではすべてのパケット通信を遮断するため、それぞれの項目をDROPと指定しています。
以下は、一般的に外部から接続する必要があるサービスについて、iptablesを使ってパケットフィルタリングを行う場合の設定例です。システム要件によっても設定内容は異なるため、あくまでも一例として参照してください。
Webサーバについて
外部のマシンからWebサーバへアクセスするには、80番ポートと443番ポートへ接続できる環境が必要です。このため80番ポートと443番ポートでNATルータへ出入りするパケットについて、通信を許可しておく必要があります。
/sbin/iptables -A INPUT -p tcp --dport 80 -d $MYHOST -j ACCEPT
← $MYHOST宛のパケットのうち、80番ポートで通信するものは許可
/sbin/iptables -A OUTPUT -p tcp --dport 80 -s $MYHOST -j ACCEPT
← $MYHOSTから出て行くパケットのうち、80番ポートで通信するものは許可
/sbin/iptables -A INPUT -p tcp --dport 443 -d $MYHOST -j ACCEPT
← $MYHOST宛のパケットのうち、443番ポートで通信するものは許可
/sbin/iptables -A OUTPUT -p tcp --dport 443 -s $MYHOST -j ACCEPT
← $MYHOSTから出て行くパケットのうち、443番ポートで通信するものは許可
連載バックナンバー
Think ITメルマガ会員登録受付中
Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。