Opengateシステムフロー

Opengateシステムは以下のように処理する。:

  1. クライアントマシン上の利用者が、任意のURL( http://www.some.site/ または http://www.some.site/some/path )をアクセスする。
  2. そのURLがIPv6とIPv4のアドレスを持つとする。クライアントマシンはIPv6 HTTPを優先して使用する。しかしファイアウォールipfw(IPv6)は閉じているので、IPv6 HTTPはタイムアウトする。

  3. クライアントマシンはIPv4 HTTPを使って自動的に再試行する。

  4. ファイアウォールipfwはルータを通過するパケットを検査する。その結果、閉鎖中のクライアントからのパケットについては、フォワードルール[ipfw add 60000 fwd localhost tcp from 192.168.1.0/16 to any http]が適用される。

  5. ルータ上のWebサーバがHTTPパケット[GET / or /some/path]を受け取る。

  6. httpd.confにおいて[ErrorDocument 404 /]が設定されているために、いずれの場合でもドキュメントルートのインデックスファイル[index.html.var]がアクセスされる。

  7. インデックスファイルがCGIプログラム[opengatefwd.cgi?en]を起動する。オプションはクライアントが望む言語[en]である。

  8. CGIプログラム[opengatefwd.cgi]はクライアントのIPv4アドレスを環境変数[REMOTE_ADDR]から取得する(フォワードされたパケットなのでIPv6ではない)。そして、アドレスをエンコードし、読み込んだテンプレートファイル[topindex.html]中に、他のパラメータと一緒に挿入してクライアントへ送信する。

  9. ブラウザが[topindex.html]の応答を受け取る。この時点では、ブラウザはそれをwww.some.siteからの応答と誤って解釈する。

  10. この誤った解釈を回避するために、[topindex.html]はルータのURLへジャンプするように記述する[META HTTP-EQUIV="Refresh" CONTENT="1; URL=http://opengate.og.saga-u.ac.jp/cgi-bin/opengateauth.cgi?333333333-3-11111111&en"]。 ここでオプション[333333333-3-11111111]はエンコードしたIPv4アドレスである(チェックコードを含む)。また[en]は、クライアントが望む言語である。[Refresh]命令によって、ブラウザは指定したURLを自動的にアクセスする。

  11. CGIプログラム[opengateauth.cgi]は、取得したオプションを読み込んだテンプレートファイル[index.html]中に挿入して、クライアントへ送信する。

  12. ブラウザが認証要求ページ[index.html]を受け取る。エンコードしたIPv4アドレスと言語はページ内のhiddenタグに記述されている。

  13. 利用者は、利用者IDとパスワードを入力してボタンを押して、OpengateのメインCGIを呼ぶ[FORM METHOD="POST" ACTION="http://opengate.saga-u.ac.jp/cgi-bin/opengate/opengatesrv.cgi"]。

  14. OpengateのメインCGI[opengatesrv.cgi]が開始し、以下の処理を実行する。

  15. メインCGIはPOSTデータから、利用者ID[例: user1 or user1@id1]、パスワード、エンコードIPv4アドレス[例: 333333333-3]、言語、監視モード[H or T]を取得する。また、IPv6アドレス(無効ならIPv4)を環境変数[REMOTE_ADDR]から、MACアドレスをNDP/ARPから取得する。

  16. CGIは、設定ファイル[opengatesrv.conf]から認証サーバの設定情報を取得する(利用者IDに拡張ID[id1]が付加されていれば[id1]の、付加されてなければ[default]の設定)。

  17. CGIは、利用者IDとパスワードを指定された認証サーバ([default]や[id1])に送信する。

  18. 認証通過後、CGIは、IPv4ファイアウォールルールを挿入する(例:[ipfw add 10000 allow ip from 192.168.1.111 to any] と [ipfw add 10000 allow ip from any to 192.168.1.111])とIPv6ファイアウォールルール(例:[ipfw add 10000 allow ipv6 from 2001:e38:10::111 to any] と [ipfw add 10000 allow ipv6 from any to 2001:e38:10::111])。*新しいVersionでは、Allowルール挿入の代わりにTagルールを挿入して制御するように変更した(例: [10000 count tag 123 ip from 192.168.1.111 to any]と[10000 count tag 123 ip from any to 192.168.1.111])。

  19. CGIは、syslogにファイアウォール開放を報告する(例:[Jun 16 19:14:11 ... START: user user1 use IPv6 and IPv4 at 00:00:00:00:00:00], [Jun 16 19:14:11 ... OPEN: user user1 from 192.168.1.111...] and [Jun 16 19:14:11 ... OPEN: user user1 from 2001:e38:10::111])。

  20. CGIは、監視モードに依存した許可ページのテンプレートファイル[accept-http.html/accept-time.html]を読み、キーワードを置き換えてクライアントに送信する。

  21. CGIは、監視プロセスを生成したら終了する。

  22. 監視プロセスは、http-keepスクリプトが接続するのを待つ。

  23. 指定した時間内に接続が確立されなければ、CGIはファイアウォールルールを削除して終了する。乗っ取りに対応するため、監視プロセスは定期的なARPチェックおよびファイアウォール問い合わせを行う。ファイアウォール問い合わせでは、挿入ルールにマッチした通過パケットの数をActiveCheckInterval(秒)ごとに取得する。もしもパケット数がNoPacketInterval(秒)の間に増えていなければ、監視プロセスはファイアウォールルールを削除して終了する。また、MACアドレスとIPアドレスのリストをARPコマンドによってActiveCheckInterval(秒)ごとに取得する。もしもその関係が変化していたら、監視プロセスはファイアウォールルールを削除して終了する。

  24. http-keepスクリプトとの接続が確立したら、監視プロセスはクライアントとのTCPコネクションを監視する。TCPコネクションが閉鎖されたら、監視プロセスはファイアウォールルールを削除して終了する。よってネットワークアクセスは即時に無効になる。

  25. ケーブル切断をチェックするために、監視プロセスはhttp-keepスクリプトとのコネクションを通じて'GET /hello'を受信し、ActiveCheckInterval(秒)後に'hello'を送信する。

  26. ネットワークから切断されたとき、監視プロセスはsyslogにファイアウォールが閉鎖されたと報告する(例:[Jun 16 22:11:55 ... CLOS: user user1 from 192.168.0.111...], [Jun 16 22:11:55 ... CLOS: user user1 from 2001:e38:10::111...], [Jun 16 22:11:55 ... END: user user1 at 00:00:00:00:00:00])。