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 モジュールを作成する方法』
http://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

Comments (2)

  1. kunimi より:

    いつもお世話になっております。

    笑ってしまいそうで会社で読むのがツライのがちょっとアレですが、内容は最高です!活用させていただいております。

    重箱の隅的な突っ込みで申し訳ないこと甚だしいのですが・・

    Internet Information Server 表記はNT4までではありませんでしたっけ・・・?

  2. ものえおさむ より:

    kunimi さん、いつもお世話になっております。(いろいろありがとうございます)

    >NT4までではありませんでしたっけ・

    そうですね。5.x からは Services ですね。失礼しました。

    IIS 4 代からおつきあいいただきまして、ありがとうございます。

    今後とも IIS をよろしくお願いいたします。

Skip to main content