Firewall設定
       を
        遠隔地からPDAで更新可能に。

サーバー環境:FreeBSD4.2R
 動作サーバー:Apache,Sendmail
 付加機能:Webmin,Swatch,Firewall

PDA MENU
1.

 PDA用のメニュー

 背景の黄色い部分が主として監視用で利用するプログラム類。
 監視系は全てBASIC認証でログインする。

RouterLogViewer
2.

 これはルータログを監視する画面。
 ルータは常時Linuxへログを転送する。そのログをWebから閲覧可能なように一定時間で編集している。現在の間隔は15分。
 このログの中で注意が必要な主なのは「ポートスキャン」 である。

 ログに出力される物は定義情報からはずれる物、つまり「許可されていないもの」が出力される。ポートスキャンの場合はグローバルアドレス全てに対してサービススキャンを実施してくるためログには明らかに落ちてくる。

 また不審なICMP、特に経路変更などは注意が必要。
FirewallLogViewer
3.

 こちらはFirewallがはき出すログ。

 ルール番号に応じてLog指定されたものだけ出力される。
 通常はMAX番号の65515が監視対象のログとなる。

 ルータをすり抜けてもFirewallで引っかかればここで捕まえられる。


 相手先のIPはSwatchがメールに添付してくるため、ここで必要な判断は「サブネットマスク」。

WhoisIP
4.

 捕まえたIPアドレスから所属するネットワークやプロバイダ、企業などを割り出す際に
利用する”Whois"。ARINは全体の構成を把握しているため、問い合わされたものが自分以外のどこであるかも教えてくれる。
 最近は国別に用意されているものもあるが、各国対応までは考えていない。当面はある程度の範疇で把握できればよしと見ている。

 なお時々WhoisDatabaseの問い合わせプログラムが変更される事もあるようなので、各サイトのアナウンスには注意が必要>パクる方

WhoisDomain
5.

 判別されたドメイン名からさらに詳細な情報を調査する際に利用する。

 ネットワークによってはSPAMや不正な行為があった場合に連絡先を明記している場合もあるので、悪質な物はここで調査する。
 国外でもいくつかはメールを送るとすぐに対応してきた。ドメイン管理の立場ではどこの世界も厳格なようだ。

DataEntry
6.

 Firewallの定義済み情報を確認するスクリプト。
 表示される画面は至ってシンプルだが中身は濃い。

  ここでIPアドレスをエントリすると、下の画面となる。
RuleCheck1
7.

 これは未登録の場合。
 登録画面へ遷移するか尋ねて来る。

RuleCheck
8.

 登録済みの場合は、登録情報を表示する。

 ここで実際のルールは
サブネットは”11” となっている。
エントリしたのは、もちろん32ビット単位である。
  定義済みの範囲に含まれるかどうかを瞬時に判断してくれる。これは便利。。。

DataEntryForm
9.

 制御したいIPが決定すれば、ここで登録する。

 意志決定が必要なのは「サブネットマスク」である。
 これ以外のコマンドなどはCGIが決定する。

 ログが必要かどうかもここで設定する。"Off"であればipfwコマンドはこのIPルールに限りログを出力しない。
RegistPreview
10.

 登録完了画面。
 どのように登録されたか確認できる。ここまで来ると取り消しは出来ない。
DataSetRecoganizer
11.

 確認画面その2。

 登録された情報と次回更新予定の内容、またこれまで登録されているPDA用更新情報(再下段)を確認する。

 トリガの有無は常時確認できる。今回定義情報の更新と共にPDA用のトリガファイルが作成されているのがわかる。
 これは最大5分後に消える。
OnlineEditor
12.

   Telnetで接続し定義ファイルを更新するのと同じようなインターフェースがCGIで実現できないか模索しているところで
「オンラインエディタ」 を考えた。ネットサーフィンでみつけたスクリプトに改良を加えて実行。

 図中赤字で表示されているようにPDAデータも確認している。データの重複があれば無駄にリソースを消費してしまうので、極力重複の無いように双方のデータ有無を確認しながらエントリ出来る。

 また、PDAデータも含めて更新するのであればチェックボックスをOnにする。

FreeBSDのFirewallはKernelレベルで動作する。コンパイル時に色々な設定を施し、その動作を決定する。
通常設定ファイルは /etc/rc.firewall になる。
本環境では独自設定により /etc/ipfw.bridge を設定ファイルとしている。
このファイルは管理者権限でのみ更新が可能。これをOnlineでしかもPDAを使って管理しようと言うのが今回の目的。

システム仕様

◎PCからはEdit.cgiを使用する。
 前提: /etc/ipfw.bridge は直接編集されていない。
    PDAの更新が正常に行われており、今更新時に設定が含まれる。確認フラグ表示。 PDA用トリガファイルが存在すれば更新できない。トリガが無くなるのを待つ。
 更新するとデータファイルと共にPC用トリガファイルを作成する。/ipfw/ipfw.bridge
 cron は5分おきにトリガ有無を確認し、存在すれば /etc/ipfw.bridge へ上書きする。
 上書きした ipfw.bridge を実行しPC用トリガファイルを削除する。
◎PDAからは write.cgi を使用する。
 前提:特になし 更新するとPDA用のトリガファイル /data/updt.dat と /data/trigger.dat とデータファイル /data/ipfw.dat と
/data/store/ipfw2.dat を出力する。
 cronは5分おきにトリガ trigger.dat の有無を確認し存在すれば起動スクリプト ipfw.dat を実行。
 トリガ trigger.dat はこの時点で削除される。
 トリガ updt.dat が存在する間は再起動ごとに /data/store/ipfw2.dat も加えてipfwリストを更新する。
 この繰り返しは Edit.cgi による更新が完了するまで行われる(削除確認)。
 従って ipfw2.dat はEdit.cgiから削除指示が出るまでは常に追加されていく。
発動

 ポートスキャンなど不正なアクセスを検知するとルータログとFirewallログを常時監視するSwatchが携帯電話へ
メールを送信する。
 メールの内容を吟味し、必要な場合にFirewallへ定義情報へ追加し、新たに制御を開始する。

サーバー側での動作

 サーバーでは5分おきにPCからデータ更新があったか、PDAからデータ更新があったか、を確認している。
Crontabでの設定は以下の通り。

○/etc/crontab
# IPF Transaction
*/5 * * * * root sh /root/.ipfwedit
*/5 * * * * root sh /root/.ipfwpda

 それぞれのファイルの中身は、

/etc# cat /root/.ipfwedit
if [ -f /home/foo/public_html/cgi-bin/ipfw/ipfw/trigger.dat ]; then     #トリガチェック
    cp /etc/ipfw.bridge /etc/ipfw/ipfw.bak                   #念のためバックアップ
    cp /home/foo/public_html/cgi-bin/ipfw/ipfw/ipfw.bridge /etc/    #Onlineファイルをコピー
    rm -f /home/foo/public_html/cgi-bin/ipfw/ipfw/trigger.dat      #トリガ削除
    sh /etc/ipfw.bridge                               #定義追加
fi


/etc# cat /root/.ipfwpda
if [ -f /home/foo/public_html/cgi-bin/ipfw/data/trigger.dat ]; then
    sh /home/foo/public_html/cgi-bin/ipfw/data/ipfw.dat
    rm -f /home/foo/public_html/cgi-bin/ipfw/data/trigger.dat
    rm -f /home/foo/public_html/cgi-bin/ipfw/data/ipfw.dat
    touch /home/foo/public_html/cgi-bin/ipfw/data/ipfw.dat
fi

 バックアップ用にコピーを頻繁に行っている。これは処理の途中で停電や動作異常などが発生した場合にバック
アップを使用してリカバリを可能とする目的である。どこぞのBANKみたいなRCでの失敗はしたくないから・・・

◎サーバー起動スクリプトへの追加項目

if [ -f /home/foo/public_html/cgi-bin/ipfw/data/updt.dat ] ; then
    sh /home/foo/public_html/cgi-bin/ipfw/data/store/ipfw2.dat
fi

◎利用シーンの区別

 1.から11.までの図はそれぞれPDAに表示される画面。
 制御したいIPアドレスが発生した際に9.で入力し10.で確認する。
 外出時はこの二つだけを意識すれば良いことになる。
 尚、定義ルールはルールセット(650セット)の最後尾にセットされるがスクリプトを変更し、最後尾では無い後半部分へ
追加されるように変更。こうする事で万が一すり抜け可能な定義の後に追加される事を防ぐ。  25/Apr/2002 追加

 12.の図はPCでメンテナンスする場合の画面。従来はTelnetログインにて設定ファイルを直接更新していたが、このCGI
の採用によりTelnetの必要が無くなった。ただしエラートラップなどは不十分であるため随時修正して行く。

○今後の応用
 CGI実行ユーザーが書き込み権限のあるファイルは3.のスクリプトを利用するとOnlineで更新できる事になる。
 また書き込み権限が無くても一旦別のファイルに保存し、定期的に入れ替える事も可能となる。
 従ってサーバーに存在するあらゆるファイル(スクリプトプログラム、データファイルなどでバイナリを除く)はOnlineでの
更新が可能と言うことになる。もちろんこれは管理者として作業できるサーバーに限定される。

 将来的にはApacheの設定ファイル"httpd.conf"、Bindの"named.conf"や正引き、逆引き情報、Squidの"squid.conf"
など色々な設定ファイルのトランザクションが可能となる。最もそう言ったメジャーな設定はWebminが容易であるが。


24/Apr/2002 密かに公開。。。
25/Apr/2002 ちょろっと変更。。。
01/May/2002 大幅に変更。。。
07/Jun/2002 Web公開用に修正。初期画像サイズ変更

トップへ戻る

07/June/2002