IIS 7.0 構成委任について

作成者: Saad Ladki

はじめに

IIS では、その 7 番目の製品リリースで、まったく新しいファイル ベースの構成システムが導入されています。 この新しいシステムは、Web プラットフォーム全体に適したデータドリブン システムを重視しています。ASP.NET、Indigo、さらにはサード パーティ コンポーネントなどのテクノロジが、この構成ストアを使用および拡張して、サイトまたはアプリケーションのプロパティを格納することができます。

このシステムは、ASP.NET の web.config ファイルと類似した構文を使用して、シンプルかつ明確な形式で定義された XML ファイルに基づいています。 これらの構成ファイルは論理グループにおいて設定を保持し、ファイルに対する変更は、そのプロパティが変更されているサイトまたはアプリケーションへ即時に反映します。

この新しいシステムでは、委任された管理エクスペリエンス (管理者が、サイトとアプリケーションの所有者に特定の設定の変更を許可することができる) も提供されます。また、これらの変更の影響は、問題になっている特定のサイトまたはアプリケーションに限定されます。 このモデルでは "自己完結型アプリケーション" の概念が導入されており、コンテンツおよび構成の設定の両方が、サイトまたはアプリケーションのディレクトリ内に格納され、マシン間で x-copy を実行して展開することができます。

構成ファイルと構成スキーマ

IIS 7.0 以上には、applicationHost.config という名前の中央構成ファイルがあり、%WINDIR%\System32\InetSrv\Config\ に配置されています。 このファイルは、IIS 6.0 でその構成ストアに使用されていた、metabase.xml ファイルを置き換えます。 この新しい構成システムは非常にシンプルであり、ファイルベースで、しかも非常に強力です。 IISADMIN は必要ないため、構成サービスはありません。 各ワーカー プロセスには構成リーダー コンポーネントのインスタンスがあり、ファイルから構成を直接フェッチします。

また、構成のメモリ内表現はありません。 ファイルに対して変更が発行されると、ワーカー プロセスが即時にそれを取得し、指定されたサイト、アプリケーション、または仮想ディレクトリ上に反映されます。

applicationHost.config ファイルには、IIS やその他の Web テクノロジのさまざまな機能とコンポーネントのグローバル設定が含まれます。 このファイル内に設定されたプロパティは、マシン内のすべてのサイト、アプリケーション、仮想ディレクトリに適用されます。

IIS が使用する構成リーダーは、各構成セクション、要素、属性の形式、構文、正しい名前付けを解釈します (スキーマ ファイル内で定義されているため)。 構成のスキーマは、%WINDIR%\System32\InetSrv\Config\Schema\ ディレクトリ内に配置されたファイル内に定義されます。 構成システムをインスタンス化すると、ワーカー プロセスはそのスキーマをメモリに読み取ります。これは、設定することができるプロパティとその形式を、システムが解釈するのに役立ちます。 少なくとも、IIS_schema.xmlASPNET_schema.xmlFX_schema.xml ファイルをこのディレクトリ内に配置し、IIS、ASP.NET、.NET Framework の機能にそれぞれ適用される、構成のセクションの構造を定義します。

スキーマでは、セクションとプロパティの名前付け、値の想定される型、これらの値の範囲、またはそれらのいずれかが一意になるか、必須になるかなど、構成とそのセクションのいくつかの側面を定義します。 また、特定の属性で使用される既定値も定義します。 applicationHost.config でプロパティが定義されていない場合、その値はスキーマ ファイル内で記述された既定の設定から取得されます。

この中央ファイル (applicationHost.config) に加えて、複数の web.config ファイルが、URL 階層の任意のレベルに存在することができます。 これらのファイルは、サイト、アプリケーション、仮想ディレクトリ、さらには物理パス レベルに存在することができます。 これらのファイルでは、applicationHost.config 内で定義されたグローバル設定をオーバーライドする値を含むプロパティを定義します。ただし、これらの変更は、ファイルが存在するスコープ (すなわち、特定のサイト、アプリケーション、仮想ディレクトリ、または web.config ファイルが存在する物理パス) にのみ適用されます。

構成階層と有効な構成

applicationHost.config に加えて、IIS は、machine.config およびルートの web.config ファイルの両方に依存する ASP.NET を使用します。 machine.config ファイルでは、すべての .NET Framework 機能に必要なプロパティを定義します。 ルートの web.config ファイルでは、すべての ASP.NET Web アプリケーションに対して定義されたプロパティのグローバル設定を定義します。 これら 2 つのファイルは、IIS の applicationHost.config に類似しています。 .NET Framework と IIS のバージョンが別々であることにより、これら 3 つのファイルが存在します。 1 つのバージョンの IIS を持つ特定の Windows Server システム内に、複数バージョンの .NET Framework をインストールすることができます。

そのため、このシステム構成の設定に対して、構成の階層を定義して算出します。 その階層は machine.config で始まり、ルートの web.config ファイルへと進み、applicationHost.config がその後に続きます。それ以降は、サイト、アプリケーション、または仮想ディレクトリ レベルに配置されたオプションの web.config ファイルが、その階層に追加されて適用されます。 最後に、そのプロパティは machine.config から最後の web.config ファイル (存在する場合) に、親から子ファイルに継承され、指定されたパスに対して有効な構成が算出されます。

この継承の動作は既定で実行されます。 階層内の下位レベルの設定は、現在のレベルより上のファイル内で定義された親の設定をオーバーライドします。 ただし、階層の下に進むほど、その構成のスコープはより制限されます。 machine.config、ルートの web.config、applicationHost.config ファイルの設定はシステム内のすべてに適用されますが、省略可能な web.config ファイルの設定は、現在の場所とその下位 (サイト、アプリケーション、または仮想ディレクトリ) にのみ適用されます。

構成セクション

構成ファイル内には、読み取りと設定するのが可能な設定があります。 それらの設定は、構造化された方法でグループ化されます。 特定の機能 (すなわち、ASP、認証、ISAPI など) に類似したまたは適用することができる複数の設定は、"構成セクション" と呼ばれる論理ユニット ブロックにグループ化されます。 各構成セクションの中にはその他の構成セクションを含めることができますが、通常は、要素、コレクションまたは属性を定義します。

構成要素は、複数の構成属性を定義する XML 要素です。 構成コレクションは、add/remove/clear 構成ディレクティブを使用して定義された要素のリストを含む、構成要素の特殊なケースです。 最後に、構成属性は、XML 属性を表すリーフ構成設定です。

次のスニペットは、<defaultDocument> セクションの設定を示します。 enabled の単語は属性であり、files の単語は要素です。そこに、add ディレクティブと一連の属性で定義されたその他の要素のリストが含まれます。

<defaultDocument enabled="true"> 
    <files> 
        <add value="Default.htm" /> 
        <add value="Default.asp" /> 
        <add value="index.htm" /> 
        <add value="index.html" /> 
        <add value="iisstart.htm" /> 
        <add value="default.aspx" /> 
    </files> 
</defaultDocument>

この構成セクションには、関連付けられたスキーマがあります。 次のスニペットは、IIS_schema.xml ファイル内の <defaultDocument> セクションのスキーマを示します。 このスキーマでは、セクションの名前と、それが存在する名前空間 (この場合は system.webServer) を定義します。 またこのスキーマでは、属性と要素、およびそれぞれの名前、型、既定値、その他の重要なデータを記述します。

<sectionSchema name="system.webServer/defaultDocument"> 
    <attribute name="enabled" type="bool" defaultValue="true" /> 
    <element name="files"> 
      <collection addElement="add" clearElement="clear" removeElement="remove" mergeAppend="false"> 
        <attribute name="value" type="string" isUniqueKey="true"/> 
      </collection> 
    </element> 
</sectionSchema>

特殊なセクション: <configSections>

<configSections> 構成セクションは、applicationHost.config 内で定義される特殊なセクションです。これは、IIS サーバーの構成セクションの、レジストリ ポイントとして使用されます。 このセクションには、システム内で使用可能な、現在の構成セクションが登録されます。 構成システムが拡張されて、サーバーにカスタム セクションが追加される場合は、このセクションに要素エントリを追加することによって登録する必要があります。

次のスニペットは、<defaultDocument> セクションの <configSections> エントリを示します。 その他のエントリは、わかりやすくするために省略しています。 <configSections> の重要な点は、各セクションの名前空間 (この場合は system.webServer) を定義する sectionGroup エントリと、overrideModeDefault 属性の値 (このセクションでは "Allow") です。 allowDefinition が宣言されていないため、既定値の "Everywhere" がスキーマから取得されます。

<configSections> 
    <sectionGroup name="system.webServer"> 
        <section name="defaultDocument" overrideModeDefault="Allow" />
    </sectionGroup>
</configSections>

セクションとそのセクション グループの定義に加えて、2 つの主要な属性が定義されています。overrideModeDefaultallowDefinition です。

overrideModeDefault 属性は省略可能な属性で、セクションのロック状態を定義します。 その使用可能な値は Allow または Deny です。 規定値は "Allow" です。 サーバーのパフォーマンス、セキュリティ、またはクリティカルな側面に関連するすべての IIS セクションは、この属性に "Deny" を設定してロックされます。 overrideModeDefault 属性が "Deny" に設定されている場合、特定の構成セクションのプロパティ値を設定する下位レベルの構成ファイル (すなわち web.config ファイル) は、グローバル値を有効にしたり、オーバーライドしたりすることはできません。 これはロック違反を招き、エラーが発生します。

allowDefinition 属性はもう 1 つの省略可能な属性であり、セクションを定義してプロパティを設定することができる階層のレベルを定義します。 その値が MachineOnly の場合、そのセクションは applicationHost.config または machine.config 内でのみ設定することができます。その値が MachineToRootWeb の場合、そのセクションは MachineOnly ファイルまたはルートの web.config 内でも設定することができます。その値が MachineToApplication の場合、そのセクションは前の 3 つのファイルすべて、またはアプリケーション ルート フォルダー内の web.config ファイル内でも設定することができます。 最後に、その値が Everywhere (既定値) の場合、グローバルな構成に影響を与えるファイルでも、特定のサイト、アプリケーション、または仮想ディレクトリに適用される web.config ファイル内でも、任意の構成ファイル内に設定することができます。

場所の概念

構成階層の指定されたファイル内の指定された設定は、そのレベル以下に適用され、子ファイルによってオーバーライドされる場合があります。 ただし、path 属性を持つ location タグを使用して、現在の構成ファイルの下にある特定のパスに、構成設定を指定して適用するオプションがあります。 構成ファイルが applicationHost.config の場合、location タグには、そのシステム内のすべてのサイト、アプリケーション、仮想ディレクトリから、特定のサイト、アプリケーション、仮想ディレクトリ、またはファイルに至るパスを含めることができます。 location タグは web.config ファイル内で指定することもできます。また、現在のサイト、アプリケーション、または仮想ディレクトリの下にあるパスの相対パスを含めることもできます。

次のスニペットは、Developer Site のみに適用される構成プロパティを指定する方法を示します。 これは、サイト コンテンツ内の web.config ファイルを使用して実現することもできます。 Developer Site の有効な構成は、applicationHost.config 内にあるファイル コレクションのエントリのリストと、サイトの場所のパスと任意の web.config ファイルです。

<location path="Developer Site" overrideMode="Allow"> 
    <defaultDocument enabled="true"> 
        <files> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location>

パスが宣言されていない場合 (これはドット (.) を指定することと同じです)、そのパスはこのレベル以下のすべての子パスと解釈されます。 applicationHost.config 内でこれを行うと、グローバル レベルの構成も指定されます。

location タグ内で定義することができる属性は overrideMode です。 overrideModeDefault と同様に、これは指定された構成セクションが参照され、現在の location タグ内に設定されているプロパティを下位レベルの階層で編集およびオーバーライドすることができるかどうかを指定します。

セクションのロックとロック解除

<configSections> セクション内の overrideModeDefault タグを使用してセクションをロックする当初の概念は、より細かく拡張することができます。 セクションを <configSections> レベルでオーバーライドできるようにすると、そのセクションは利用可能になり、システム内で誰でも web.config ファイルを介して (URL 名前空間の任意のレベルで) その値をオーバーライドすることができます。 ただし、これは重大なセキュリティ リスクを引き起こす場合があり、そのシステムの可用性またはパフォーマンスに悪影響を及ぼすおそれがあります。 location タグを介して overrideMode 属性を使用し、セクションのロック状態を指定することで、特定のパスを抑制することができます。

次のスニペットは、システム内のすべてのサイト、アプリケーション、仮想ディレクトリで、<windowsAuthentication> セクションのロックを解除する方法を示します。 これを行うには、overrideModeDefault 属性内に "Allow" を設定します。 このアプローチの欠点は、全員に対してセクションのロックを解除し、誰でも web.config ファイルを使用してサイトまたはアプリケーション レベルで設定をオーバーライドできることです。

<section name="windowsAuthentication" overrideModeDefault="Allow" />

次のスニペットは、同じこと (<windowsAuthentication> セクションのロックを解除すること) を実現する方法を示します。ただし、AdministratorSite のみを対象するので、そのセクションのプロパティは AdministratorSite のサイト レベルで web.config ファイルを使用して変更することができます。 そのシステム内の他のサイトは、ロックされた <windowsAuthentication> セクションの既定の動作になります。 これは、overrideMode 属性を使用して実現します。

<location path="AdministratorSite" overrideMode="Allow"> 
   <security> 
        <authentication> 
            <windowsAuthentication enabled="false"> 
                <providers> 
                    <add value="Negotiate" /> 
                    <add value="NTLM" /> 
                </providers> 
            </windowsAuthentication> 
        </authentication> 
   </security> 
</location> 
 
The location tag path can be specified here a site, application or even a virtual directory to which the administrator wants to unlock configuration and/or apply configuration at that level.

その逆の動作 (特定のサイトのセクションをロックしている一方で、システムの残りの部分は編集することができる) を実現することもできます。 たとえば <defaultDocument> は、<configSections> セクション内で overrideModeDefault 属性が "Allow" に設定されているセクションですが、location タグを使用して、このセクションを Basic Site に対してロックすることができます。 次のスニペットはこれを実現する方法を示します。また、それと同時に、ホーム ページとして表示するサーバーの既定のページとして、システムが受け入れる唯一の値が basic.htm というタイトルになるように設定します。 clear ディレクティブは、構成階層内の上位レベルから継承された値をすべて null にします。この場合は、applicationHost.config のファイルのグローバル リストです。

<location path="Basic Site" overrideMode="Deny"> 
    <defaultDocument enabled="true"> 
        <files> 
       </clear> 
            <add value="basic.htm" /> 
        </files> 
    </defaultDocument> 
</location>

きめ細かいロック

location タグを使用してセクションを利用可能にすることは、指定したパスのサイトまたはアプリケーションの所有者に対して、セクションとそのすべてのプロパティのロックを解除する効果的な方法です。 これは実質的に、サイトとアプリケーションの所有者を、あるセクションに対して無制限にアクセスできるようにする、オールオアナッシングのアプローチです。 ただし、管理者がセクション内の特定のプロパティに特定の制御を必要とし、特定の値を制御する必要がある場合があります。 その他は委任することができます。 このような場合に、きめ細かいロックを使用します。

きめ細かいロックは、要素またはその他の属性に設定することができる、特定の属性のグループです。 きめ細かいロックは、現在のパスより下位のパスが、構成値を変更することができるかどうかを宣言できます。 値を読み取ることはできますが、ロックが設定されている場合は、編集することも、宣言することさえもできません。 ロックが設定されている値は編集しないでください。これは、構成ロック違反エラーを起こします。

きめ細かいロックのグループにおいて、最初の属性は lockAttributes です。 lockAttributes は、現在の構成レベルより下位のパスに対して、ロックされる属性のコンマ区切りのリストを定義します。 また、アスタリスク (*) もその値として受け入れます。これは、すべての属性がロックされることを意味します。 この時点で、構成セクションは子レベルのパスやロックされた属性内でも読み取ることができますが、保護された属性を編集するとエラーが発生します。

次のスニペットは、Developer Site の <defaultDocument> セクションが有効な状態をロックする方法を示します。 Developer Site の所有者が既定のドキュメント機能を無効にした場合、または location タグ内に記述されているものと同じ値を持つプロパティを宣言した場合は、ロック違反が発生します。

<location path="Developer Site" > 
    <defaultDocument enabled="true" lockAttributes="enabled" /> 
</location>

きめ細かいロックのグループにおいて、2 番目の属性は lockElements です。 lockElements は、現在の構成レベルより下位のパスに対してロックされる要素のコンマ区切りのリストを定義します。 lockAttributes と同様に、アスタリスク (*) もその値として受け入れます。これは、すべての要素がロックされることを意味します。 これは、複数の要素またはコレクションがあり、子レベルのパスに対して保護する必要がある構成セクションで非常に役立ちます。 ここでも、ロックされた値を編集するとエラーが発生します。

次のスニペットは、Developer Site のファイル コレクションをロックする方法を示します。 これにより、サイト所有者は既定のドキュメント機能を有効にするかどうかを決定することができます。ただし、有効にした場合はグローバル値を変更することはできず、マシンの管理者が applicationHost.config 内で記述したものが継承されます。

<location path="Developer Site"> 
    <defaultDocument enabled="true" lockElements="files" > 
        <files> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location>

lockElement の例は、コレクション内でこのようなコレクションの "ディレクティブ" をロックする場合にも役立ちます。 ディレクティブは、コレクションの "add、remove、clear" などのキーワードです。 ディレクティブをロックすることで管理者は、特定のまたはすべての要素の追加または削除に、コレクション リストを使用できるかどうかを微調整することができます。

次のスニペットは、ファイル コレクション内の現在のエントリの削除とクリアをロックする方法を示します。 サイト所有者は、必要に応じてファイル コレクションに新しいエントリを追加することができます。 サイト所有者が clear タグを指定する、またはエントリを削除しようとすると、ロック違反が発生します。

<location path="Developer Site"> 
    <defaultDocument enabled="true" > 
        <files lockElements="clear,remove"> 
            <add value="Developer.htm" /> 
        </files> 
    </defaultDocument> 
</location> 
 
Besides lockAttribute and lockElement, there are negative counterparts: lockAllAttributesExcept, and lockAllElementsExcept. These attributes achieve  the inverse action of the previous ones in which the comma-separated list declares the attributes and elements to be unlocked while the rest are not  available to be edited in child paths.

lockItem 属性もあります。 これは属性をロックし、XML 属性レベルで機能します。 次のスニペットは、サイト管理者が、コレクション内のエントリの追加や削除など、(ファイル コレクション内の basic.htm エントリへの変更を除いて) 必要なすべての操作を実行することができる方法を示します。

<location path="Developer Site"> 
    <defaultDocument enabled="true" > 
        <files> 
            <add value="basic.htm" lockItem="true"/> 
        </files> 
    </defaultDocument> 
</location>

まとめ

このドキュメントでは、構成システム、そのファイル、スキーマ、委任の機能に関する基本的な概要を説明しました。 構成階層と有効な構成についても説明しました。 この記事では、構成セクションと、その要素および属性の構造の概要についても説明しました。 場所、ロック、きめ細かいロックの概念を例示しました。

全体的に IIS では、新しいファイル ベースの構成システムが導入されています。すべての構成を、中央構成ファイルに含める、またはサイトおよびアプリケーションの管理者が、アプリケーションとコンテンツに適用するプロパティを変更することができる Web.config ファイルを使用して分散する機能があります。 分散構成モデルでは、コンテンツと構成の設定の両方がサイトまたはアプリケーションのディレクトリ内に格納され、あるマシンから別のマシンに "x-copy を実行して展開する" ことができる、"自己完結型アプリケーション" の概念を実現します。