IPFilter でセキュリティ対策
【概要】
このページでは、IPFilter のインストール法と設定法を説明する。IPFilter はパケットフィルタリングソフトウェアである。「LAN 内からのアクセス」や「指定したポート・アドレスからのアクセス」だけを許可し、それ以外を拒否する設定ができる。用途は次の通りである。
- ルータでの利用:不要なパケットをルーティングしない。
- デスクトップマシン・サーバでの利用:不要なパケットを送受信しない。
Solaris での IPFilter の扱いは、OS のバージョンによって次のように異なる。
- Solaris 9 以前:OS に付属しないため、ソースからインストールする。
- Solaris 10、Solaris 11.3 まで:OS に付属する。SMF サービス network/ipfilter で動作し、設定ファイルは /etc/ipf/ipf.conf である。
- Solaris 11.4 以降:IPFilter は削除され、PF(OpenBSD Packet Filter)に置き換えられた。設定ファイルは /etc/firewall/pf.conf、SMF サービスは firewall である。
【目次】
【関連する外部ページ】
- Oracle Solaris IP Filter の設定手順: https://docs.oracle.com/cd/E19253-01/816-4554/etmhi/index.html
- Oracle Solaris PF(Solaris 11.4 以降のファイアウォール): https://docs.oracle.com/cd/E37838_01/html/E60993/pfovw-intr.html
Solaris 9 以前でのインストール手順
Solaris 10 以降では OS に IPFilter が付属するため、この手順は不要である。次の手順は Solaris 9 で確認したものである。パケットを取得するための pfil モジュールと、IPFilter 本体の 2 つをインストールする。IPFilter 本体のソースは作者による配布サイト(http://coombs.anu.edu.au/~avalon/)で公開されている。ソースからインストールする場合は、入手できる最新版を使う。
cd /tmp gzip -d < /tmp/pfil-2.1.9.tar.gz | tar -xvf - cd /tmp/pfil /usr/ccs/bin/make /usr/ccs/bin/make package pkgadd -d /tmp/pfil.pkg cd /tmp gzip -d < /tmp/ip_fil4.1.31.tar.gz | tar -xvf - cd /tmp/ip_fil4.1.31 /usr/ccs/bin/make solaris cd SunOS5 /usr/ccs/bin/make package
IPFilter ルール設定
ルールを記述するファイルは /etc/ipf/ipf.conf(Solaris 10 以降の付属版)である。ソースからインストールした場合は /etc/opt/ipf/ipf.conf である。
次に示すのはルールの例である。この例では、LAN 内部との通信を許可し、それ以外の受信パケットを拒否する。LAN の外側にサービスを公開しないマシンを想定している。LAN 外部と通信するメールサーバ、DNS サーバ、WWW サーバ、NTP サーバでは、公開するポートを許可するルールを追加する。ルールの方針は次の通りである。
- ループバック(lo0)は許可する。
- 送信(out)パケットは許可する。
- LAN 内部からの受信(in)パケットは許可する。
- 送信元アドレスを偽造したパケットは拒否する。
- IP option が設定されたパケットは拒否する。
- 短すぎる IP fragment をもつパケットは拒否する。
- 以上に当てはまらないパケットは拒否する。
IPFilter では、quick を付けたルールは一致した時点で評価が終わる。quick を付けないルールでは、最後に一致したルールが適用される。そのため、すべてを拒否するルールは quick を付けずにファイルの末尾に置く。また、IPFilter の pass ルールは既定でステートレスであるため、通信の状態を記録して戻りのパケットを通すには keep state を付ける。
次の例は Solaris 10 に付属の IPFilter での設定例である。
# # ループバック(lo0) # pass out quick on lo0 pass in quick on lo0 # # 送信パケット # # tcp/udp と icmp の送信を許可する pass out quick on hme0 proto tcp/udp all keep state pass out quick on hme0 proto icmp all keep state # 特定のポートだけを許可する場合の例 # 20(ftp-data), 21(ftp), 25(smtp), 80(http) # pass out quick on hme0 proto tcp from any to any port = 20 keep state # pass out quick on hme0 proto tcp from any to any port = 21 keep state # pass out quick on hme0 proto tcp from any to any port = 25 keep state # pass out quick on hme0 proto tcp from any to any port = 80 keep state # # 受信パケット # # LAN 内部からの通信を許可する pass in quick on hme0 proto tcp/udp from 133.xx.yy.0/24 to any # 外部に公開するサービスがある場合の例(ssh: 22 番ポート) # pass in quick on hme0 proto tcp from any to any port = 22 flags S/SA keep state # 送信元アドレスを偽造したパケットを拒否する block in log quick on hme0 from 127.0.0.0/8 to any block in log quick on hme0 from 10.0.0.0/8 to any block in log quick on hme0 from 169.254.0.0/16 to any block in log quick on hme0 from 172.16.0.0/12 to any block in log quick on hme0 from 192.168.0.0/16 to any # IP option が設定されたパケットを拒否する block in log quick on hme0 all with ipopts # 短すぎる IP fragment をもつパケットを拒否する block in log quick on hme0 proto tcp all with short # # 上記に一致しないパケットの扱い(デフォルトのルール) # block out log on hme0 all block in log on hme0 all
「hme0」の部分は、実際のネットワークインタフェース名に書き換える。インタフェース名は「ifconfig -a」で確認する(Solaris 11 では「ipadm show-if」または「dladm show-link」で確認する)。
「133.xx.yy.0/24」の部分は、実際の LAN のアドレスとネットマスクに書き換える。「/24」は 255.255.255.0 と同じ意味である。ipf.conf では「133.xx.yy.0/24」と「133.xx.yy.0/255.255.255.0」のどちらの書き方も使える。
LAN が 192.168.0.0/16 や 10.0.0.0/8 などのプライベートアドレスの場合は、送信元アドレスの偽造を拒否するルールのうち、その LAN のアドレスに当てはまる行を削除する。削除しないと、LAN 内部からの通信が拒否される。
IPFilter ルールの読み込みと動作確認
ルールの読み込みで通信が拒否されると、リモートログイン中の接続が切断されることがある。コンソールで操作するか、自分の接続元を許可するルールを先に記述してから読み込む。
Solaris 10 以降に付属のものを使った場合
次のコマンドを順に実行する。
- svcadm enable network/ipfilter(IPFilter を有効にする)
- ipf -Fa(読み込み済みのルールをすべて削除する)
- ipf -f /etc/ipf/ipf.conf(ルールを読み込む)
- ipfstat -io(読み込まれているルールを表示する)
- ipfstat -hio(各ルールに一致したパケット数を表示する)
- ipmon -o I(block log で記録されたパケットのログを表示する)
自前で Solaris に IPFilter をインストールした場合
次のコマンドを順に実行する。
- /etc/init.d/ipfboot reload(ルールを読み込み直す)
- /sbin/ipfstat -i(読み込まれている受信ルールを表示する)
Solaris 11.4 以降での設定(PF)
Solaris 11.4 以降では IPFilter は削除され、PF が標準のファイアウォールである。ipf.conf の記述は PF の文法とは異なるため、書き換えが必要である。PF での作業手順は次の通りである。
- pfedit(設定ファイル /etc/firewall/pf.conf を編集する)
- pfctl -nf /etc/firewall/pf.conf(文法を検査する)
- svcadm enable firewall(ファイアウォールを有効にする)
- pfctl -s rules(読み込まれているルールを表示する)
PF では pass ルールが既定でステートフルであり、ループバックインタフェースのパケットも常に検査される。IP フラグメントの再構成も既定で行われる。