DeleGate でマウントしているサーバの情報を隠してみる

draft 1 : 2005/9/20 Hiroshi Suzuki < setter  AT  i-red  DOT  info >
( DGbeecon )
この文書は、何も保証していません。
正しいかどうかも怪しいものです。もっといい方法があったら、教えてください(^^;

BACK( DGbeecon )


DeleGate によるリバースプロキシというのは、良く使われているものかと思います。
例えば:

User -> Internet -> DeleGate ->  WebServer@LAN
# DeleGate の起動オプション
delegated -P8080 \
SERVER="http" \
MOUNT="/* http://WebServer/*" \
PERMIT="http:WebServer:*"
のような構成のことをさします。
この時、DeleGate のバージョン情報などは、DeleGate の DGSIGN オプションを使うことで隠すことができます。

しかし、私が隠したかったのは、DeleGate の裏にどんなサーバがいるかということで、DeleGate そのもののバージョンなどは一切隠す気がありません。
DeleGate を晒しているのに、そのほかのサーバそのものの情報が見えているのがイヤだっただけです(^^;;;;;;;;;;;;;;

で、実際には、次ようになっています。

User -> Internet -> DeleGate -> Apache

この時に、隠したいと思った物は、
です。
これだけのことをやるには、 DeleGate だけでは、ちょっときついと考えましたので、色々試行錯誤した結果:

DeleGate の CFI で他の外部プログラムを呼び出す。

しかないと考えられます。しかし、外部プログラムを最初から組むのは一般化しにくいので、既存プログラムをできるだけ使うことにしました。
その結果、次のようなパラメータ (関連部分のみ抜粋) になりました。

# エラーメッセージをマウントしてカスタマイズしておいた(これはお好みで)
MOUNT="/-/builtin/mssgs/404-notfound.dhtml file:/delegate/mssgs/404.dhtml"
MOUNT="/unauth/* file:/delegate/mssgs/401-unauth.dhtml"

# 偽装するアクセスの対象を、 ApacheSV に限定しておく(ループしそうだから)。
CMAP="fake.cfi:FTOCL:*:ApacheSV:*"

# CFI で呼び出すフィルタの内容

--- Contents of fake.cfi ---
#!cfi
X-Status-Code:404
Body-Filter: w3m -dump_source http://DeleGate/-404-/
--
X-Status-Code:401
Body-Filter: w3m -dump_source http://DeleGate/unauth/
--
Remove/Via:
Remove/Server:
Remove/X-Powered-By:
++
Output-Header:Server: %{SERVER_SOFTWARE}
--- End of Contents ---

前半は、エラーメッセージのカスタマイズと、 CMAP  パラメータによるフィルタの振り分けです。
後半は、CMAP パラメータで指定された、 FTOCL  (クライアントに向けたデータの流れに対する) パラメータのフィルタ(CFI)です。

このファイルは、3 つのフィルタで構成されています。
最初のフィルタは、404 エラー用で、
X-Status-Code:404      
     ---   404 エラーに限定して
Body-Filter: w3m -dump_source http://DeleGate/-404-/  
    --- DeleGate がマウントしていない (存在しない) URLに、w3m コマンドを -dump_source オプションつきでアクセスして、結果、 DeleGate が生成する 404 エラーメッセージをフィルタの結果として返しています。
次のフィルタは、cgi や Apache の認証エラー (401) を処理しています。
X-Status-Code:401 
    --- 401 エラーに限定して
Body-Filter: w3m -dump_source http://DeleGate/unauth/
    --- 認証エラーメッセージをマウントした URL に、w3m コマンドを -dump_source オプションつきでアクセスしてその内容を、フィルタの結果として返しています。
 最後のフィルタは、ヘッダ関係のフィルタです。
Remove/Via: 
Remove/Server:
Remove/X-Powered-By:   
    --- 見せたくないヘッダを削除して、
++
Output-Header:Server: %{SERVER_SOFTWARE}
    --- DeleGate の Server ヘッダに挿げ替えます。
Body-Filter は、w3m に代えて、curl も使えます。この場合、次のようにします: ここでの、Remove や、 Output-Header は、 HTTPCONF パラメータ の、  kill-qhead や、 add-qhead  でできるのですが、cfi を使ってしまっているので、そこにまとめて記述しました。 というか、HTTPCONF の処理順序が良くわからなかったからです(^^;
また、PHP の X-Powered-By ヘッダは、PHP の設定で消せるのかもしれません。

こんな感じで、DeleGate がマウントしている Apache や、特に隠したいであろう IIS などを偽装できます。
コンテンツにサーバの特徴がにじみ出ているものなどはこんなことしても意味ないかもしれませんが、ロボット みたいに情報収集して攻撃してくるようなものの排除にはなる...かもしれません。

最後にもう一度。
もっといい方法があったら教えてください。