IIS7 の機能を拡張してみる-レスポンスヘッダー内のサーバー名の改ざん

Web サーバーが返す HTTP レスポンス内 のヘッダー Server には、Web サーバーの名前が含まれています。

以下は、実際に IIS 7.5 が返すレスポンスヘッダー中の Server の値です。

Server: Microsoft-IIS/7.5

この情報は、インターネットでどのような Web サーバーが使用されているかの調査等に利用されていますが、管理者の方からは、セキュリティの観点からこの情報を隠蔽、あるいは削除したいというご要望を受けることがあります。

残念ながら、IIS 7 の標準の機能では、この機能は提供されておりません。(※)

(※) IIS 管理ツールにある [HTTP 応答ヘッダー] の機能を使用してカスタムヘッダーの追加/削除などは可能です

しかし、先日の記事でご紹介したように、.NET を使用して IIS の機能を拡張することでその機能を実装することができます。

この処理に使用する コードの量は非常に少なくシンプルであり、コンパイルも不要かつ、配置も容易ということで、驚くほど簡単にその機能を実装することが可能です。

セキュリティを強化するため、使用している Web サーバーが Microsoft 社の Internet Information Server 7 であることを世間の目からひた隠しに覆い隠す、という行為は、セキュリティの向上という観点から理解できますが、しかし、これは、あくまでも私一個人の心情の問題にすぎないのですが、日々仕事で IIS にかかわる者としては少々複雑な気分にならざるをえません。

たとえばもし、お子さんから "同級生に見られたくないから授業参観に来ないで"とか、あるいは恋人から "人に見られなくないから離れて歩いて" とか言われたらどうでしょう?

この悲惨な心情たるや、あえてここで語るまでもないでしょう。

しかし、心ある人であればあるほど、無理をしてまで、その残酷な要求に笑顔で応えてしまうものなのです。

私が本日ここで、レスポンスヘッダーから IIS の名前を消すサンプルコードを紹介させていただくのも、もしかしたらそういう理由なのかもしれませんね。

......あ、あれ、変だな、涙が止まんないや。。

 

さて、冗談はこれくらいにして、

 

今回のサンプルコードの実装について紹介させていただきます。

レスポンスヘッダの改ざんは Web サーバーとクライアントの間で処理を行いますので、モジュールとして機能を実装していきます。

"モジュールとして実装" と書くと難しく聞こえるかもしれませんが、System.Web.IHttpModule を継承したクラスを作成して、そのイベントハンドラ内で、引数として渡された コンテキストを操作します。

前回記で紹介したのサンプルコードと非常に似ていますが、今回はレスポンスヘッダーを扱うということで、タイミング、つまりはイベントハンドラが異なりますので注意が必要です。実際のところ、私もここで結構悩みました。

今回使用するイベントハンドラは PreSendRequestHeaders です。

PreSendRequestHeaders イベントは ASP.NET が HTTP ヘッダーをクライアントに送信する直前に発生します。

ちなみに IHttpModule クラスのイベントと発生するタイミングについては、以下に技術情報が公開されていますので、興味のある方はぜひご覧ください。

『Visual C# .NET を使用して ASP.NET HTTP モジュールを作成する方法』
https://support.microsoft.com/kb/307996/ja

HTTP レスポンスヘッダー内の Server を書き換えるサンプルコードと配置方法は以下のとおりです。

なお、今回もコンパイルする必要はありませんので、"Visual Studio を持っていない"、"プログラムを書けない" という方も、ぜひ設置してその効果をお試しください。

  1. テキストエディタに以下のコードを貼り付けて、AlterHeaders.cs という名前で保存してください。

    using System; using System.Web; using System.Configuration;

    namespace MyIisExtentionModure {     public class AlterHeaders : IHttpModule     {         public void Dispose() {}

            public void Init(HttpApplication context)         {             //ヘッダー送信前前のイベントハンドラを定義             context.PreSendRequestHeaders += OnPreSendRequestHeaders;         }

            void OnPreSendRequestHeaders(object sender, EventArgs e)         {             //<appSettings> から情報を取り出す             string headerValue = ConfigurationSettings.AppSettings["ALTER-HEADER_Server"];

                //ヘッダー "Server" の内容を書き換え             HttpContext.Current.Response.Headers.Set("Server", headerValue);         }     } }

  2. Default Web Site 下の、ASP.NET が動作するように設定してある 仮想ディレクトリの物理フォルダ内に App_Code というフォルダを作成します。

  3. 作成した App_Code フォルダに AlterHeaders.cs ファイルを配置します。

  4. 同仮想ディレクトリ内の Web.config の <configuration> 内に以下の設定を追加します。

    <add key="ALTER-HEADER_Server" value="MySweetWebServer" />
  5. IIS 管理ツールを起動します。

  6. 画面左のツリービューから目的の Web サイト、あるい仮想ディレクトリを選択します。

  7. [機能 ビュー] から [モジュール] アイコンをダブルクリックします。

  8. [モジュール] リストが表示されるので、画面右の [操作パネル] から [マネージモジュールの追加] リンクをクリックします。

  9. [マネージモジュールの追加] ダイアログボックスが表示されるので、[名前] テキストボックスに AlterHeaders と入力します。

  10. 同ダイアログボックスの [種類] ドロップダウンリストボックスから、"MyIisExtentionModure.AlterHeaders" を選択します。

  11. [OK] ボタンをクリックしてダイアログボックスを閉じます。

以上で配置は完了です。

NetmonFiddlerWireshark などを使用してネットワークをキャプチャして、HTTP レスポンス中のヘッダー Server の内容が変更されていることを確認してください。

以下に私の環境での実行結果を載せておきます。

Z(ゼータ)IIS。「これが若さというものか」的な。

Victory(ビクトリー)IIS。「おかしいですよ、カテシナさん!」的な。

Windows OO (ダブルオー)。「おれが、Windows だ!!」的な。

Visual Studio のプロジェクトを SkyDrive にアップしましたので、コンパイルして使用したい方はこちらをご査収ください。(前回紹介した HotLinkBlocker も含んでいます)

Real Time Analytics

Clicky