IIS 7.0 構成でロックを使用する方法

発行日 : 2007 年 11 月 22 日 (作業者 : saad(英語))
更新日 : 2008 年 3 月 13 日 (作業者 : saad(英語))

要約

このドキュメントでは、サーバーで構成をロックおよびロック解除する方法を説明します。アプリケーションレベルの構成ファイルで上書きできる設定、および <location> 要素を使用してセクション全体をロックする方法について学びます。

以下の各セクションで、より粒度の細かい構成設定のロックについて詳しく説明します。

  • 特定の要素および属性のロック
  • 特定の要素または属性を "除く" すべてのロック
  • <add>、<remove>、および <clear> ディレクティブなど特定のコレクション ディレクティブのロック
  • コレクション内の特定要素のロック

このドキュメントでは、構成ファイルで XML 要素を直接編集して、構成のロックの各種機能を管理する方法を学びます (これらのタスクを実行するプログラミング インターフェイスは XML 構造を採用しています)。

このドキュメントでは、意図的に構成ファイルでの XML 要素の編集のみを取り上げており、同じタスクを管理 API、スクリプト、またはユーザー インターフェイス (UI) を使用して実行する方法は紹介していません。

この記事には次のような内容が含まれています。

  • はじめに
  • タスク  1 :<location> タグを使用したセクションのロック
  • タスク  2 :特定の要素および属性のロック
  • タスク  3 :特定の属性を除くすべてのロック
  • タスク  4 :一部のコレクション ディレクティブのロック
  • タスク  5 :コレクション内の特定要素のロック
  • まとめ

はじめに

IIS 7.0 では、さまざまなレベルおよびスコープで構成設定をロックおよびロック解除できます。構成をロックダウンすると、階層の下位レベルで上書き (または設定がまったく) できなくなります。構成のロック解除は、ロックしたレベルでのみ実行できます。この機能は、たとえばさまざまなサイトまたはパスに対してさまざまな構成を作成し、一部のサイトおよびパスでのみ構成を上書き可能にする場合に便利です。ロックはセクション レベルで、またはセクション内の特定の要素、属性、コレクション要素およびコレクション ディレクティブに対して実行できます。

タスク 1 :<location> タグを使用したセクションのロック

このタスクでは、<location> タグを使用してグローバル レベルで構成セクション全体をロック (またはロック解除) し、構成階層のアプリケーション レベルで上書きできないようにする方法について学びます。

: 既定では、applicationHost.config のほとんどの IIS 7.0 セクションはロックダウンされており、.NET Framework はロックされていません (machine.config および root web.config の <system.web> セクション グループの ASP.NET セクションを含みます)。

メモ帳などのテキスト エディターを使用して、次の場所にある applicationHost.config ファイルを開きます。

%windir%\system32\inetsrv\config\applicationHost.config

ファイル最上部の <configSections> セクションを確認します。セクション名、含まれているセクション グループ、およびそれらがロックされているか否かなど、このファイルの構成セクションのメタデータがあります。

ロックされたセクションは、"Allow" または "Deny" の "overrideModeDefault" 属性によって指定されています。きわめて少数のセクションは、以下のような行によって既定でロックされていません。


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

ここでは、<windowsAuthentication> セクションを処理します。このセクションは既定でロックされています。

サーバー上ですべてのアプリケーションに対してセクション全体をロック解除するには、コンテンツをファイル内の現在の場所からファイル下部に移動し、<location overrideMode="Allow"> 要素内に入れます。さらに、セクション グループ <system.webServer>、<security>、および <authentication> で囲みます。その結果、次のようになります。


<location overrideMode="Allow">
  <system.webServer>
     <security>
        <authentication>
          <!-- the content of windowsAuthentication section is here -->
        </authentication>
     </security>
  </system.webServer>
</location>

これで、すべてのアプリケーションに対してセクションはロック解除されました。location タグでパスを指定して、このパスに対してのみセクションをロック解除できます。指定しなかった場合 (前のステップのように)、既定のパスは path="." (または path=""。同じことです) で、これは "現在のこのレベル" を示します。この場合、applicationHost.config であるため、現在のレベルはグローバル レベルを指します。location タグ は、名前空間階層の任意の場所でも使用できます。たとえば、仮想ディレクトリ レベルの web.config で使用し、これより下のレベルの構成をロックできます。

次に、"AdminSuperTrusted" サイトに対してのみ、このセクションをロック解除する例を示します。"AdminSuperTrusted" サイトの web.config ファイルはこのセクションの設定を上書きできますが、ボックスの他のすべてのサイトではこのセクションはグローバル レベルでロックされているため、上書きできません。

この例では、セクションのコンテンツを applicationHost.config の元の場所に残し、セクションを固有のパスで location タグ内に指定する必要があります。

<location path="AdminSuperTrustedSite" overrideMode="Allow">
  <system.webServer>
    <security>
      <authentication>
        <!-- note: this is different than previous example, in that  -->
        <!-- the content of the section is in the original place and -->
        <!-- was not moved here; in addition, the section is also    -->
        <!-- specified here, just by its name, so that it gets       -->
        <!-- unlocked only for the site specified in the location.   -->
        <windowsAuthentication/>
      </authentication>
    </security>
  </system.webServer>
</location>

上記の 3 つ目の例に戻ると、このセクションはすべてのサイトのすべてのアプリケーションに対してロック解除されます (location path=".")。プライマリ <authentication> セクション グループ (ファイル上部の <location> 要素の外側のセクション グループ) には <windowsAuthentication> セクションが含まれないことを確認します。同じファイル内で 1 つのセクションを location タグの外側と <location path="."> タグの内側の両方に表示することはできません。これは、無効な構成と見なされます。

セクションがロックされているかどうかをテストするには、ブラウザーで https://localhost/app に移動します。

セクションがロックされている場合、ブラウザーでエラーが表示されます。これは、アプリケーション レベルで web.config ファイルに <windowsAuthentication> セクションが含まれるためです。つまり、web.config はそのレベルの <windowsAuthentication> を上書きしようとします。しかし、このセクションはグローバル レベルでロックされているため、web.config ファイルの構成は有効ではありません。

overrideMode="Deny" を含めるように location タグを変更します。これにより、セクションは再びロックダウンされます。machine.config または root web.config の ASP.NET セクションなど、他のセクションについても試してみてください。グローバル レベルでロックダウンし、web.config レベルで上書きしてみてください。

タスク 2 :特定の要素および属性のロック

前のタスクで作成した、<location> タグ内で <windowsAuthentication> セクションを探します。location タグを設定してセクション overrideMode="Allow" をロック解除します。このセクションの特定部分のみロックしません。

enabled 属性を true に設定し、lockAttributes="enabled" を設定してロックします。

これにより、アプリケーションレベルの構成ファイルで <windowsAuthentication> セクションの enabled 属性の値が変更されるのを防ぐことができます。

他の属性をロックするには、次の例のように、ロックする属性をカンマで区切って lockAttributes 値に追加します。

lockAttributes="enabled,attribute1,attribute2"

次の例にように、"*" を使用してすべての属性をロックすることもできます。

lockAttributes="*"

セクションは次のようになります。

<location path="." overrideMode="Allow">   <system.webServer>
    <security>
      <autghentication>
        <windowsAuthentication enabled="true" lockAttributes="enabled">          
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</location>

アプリケーションの web.config ファイルで、<windowsAuthentication> セクションの設定を上書きしてみます。

ブラウザーでページを要求し、ロックした (この場合、enabled 属性) 以外のすべての設定を上書きできることを確認します。

: web.config ファイルで属性を指定すると、Web.config ファイルで設定した属性が ApplicationHost.config ファイルと同じ値を持つ場合であっても、構成エラーになります。ロックされた属性に値を設定すると、その属性を上書きしようとしたと見なされ、エラーになります。(属性は要素とは異なることにも注意してください。次のタスクでは、要素をロックします。)

lockAttributes 属性を削除します。

lockElements="providers" を設定し、セクション内で <providers> 要素をロックします。

他にもロックする要素がある場合は、次のようにカンマで区切って追加できます。

lockElements="providers,element1,element2"

セクションは次のようになります。

<location path="." overrideMode="Allow">   <system.webServer>
    <security>
      <autghentication>
        <windowsAuthentication enabled="true" lockElements="providers">
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</location>

アプリケーションの web.config ファイルで、<providers> 要素を設定するか、追加を試みるか、削除するか、コレクションをクリアすることで、要素を上書きします。

ブラウザーでページを要求し、エラーが表示されることに注意してください。web.config ファイルで、enabled 属性など他の要素または属性を上書きします。ページを参照して、エラーが表示されないことに注意してください。

lockElements 属性を削除します。

タスク 3 :特定の属性を除くすべてのロック

このタスクでは、定義した特定の要素または属性を除き、セクション内のすべての要素または属性をロックする方法を学びます。これは、現在または今後、セクションにどのプロパティが含まれるか確かではなく、明示的にロック解除に設定するプロパティを除くすべてをロックする場合に便利です。

前のタスクで作成した、location タグ内で <windowsAuthentication> セクションを探します。

lockAllElementsExcept 属性または lockAllAttributesExcept 属性を、ロックする要素または属性のカンマ区切りリストに設定します。たとえば、セクションは次のようになります。

<windowsAuthentication enabled="true" lockAllElementsExcept="providers">
     <providers>
          <add value="Negotiate" />
          <add value="NTLM" />
     </providers>
</windowsAuthentication>

または、次のようになります。

<windowsAuthentication enabled="true" lockAllAttributesExcept="enabled">
     <providers>
          <add value="Negotiate" />
          <add value="NTLM" />
     </providers>
</windowsAuthentication>

この特定セクションでは、現在、他の属性または要素はありません。lockAllElementsExcept 属性または lockAllAttributesExcept 属性を設定した影響をテストするには、同じ属性をさまざまな属性セットを含む他のセクションに追加します。

タスク 4 :一部のコレクション ディレクティブのロック

このタスクでは、コレクションで <add> および <remove> ディレクティブをロックし、アプリケーション レベルで構成ファイルの要素を追加できるが削除できないようにする方法を学びます。

前のタスクで作成した、location タグ内で <windowsAuthentication> セクションを探します。

<providers> コレクションで lockElements 属性を remove,clear に設定します。

終了後、セクションは次のようになります。

<windowsAuthentication enabled="true" >
  <providers lockElements="remove,clear">
    <add value="Negotiate" />
    <add value="NTLM" />
  </providers>
</windowsAuthentication>

アプリケーションの web.config ファイルで、コレクションから NTLM 要素を削除する <remove> 要素を作成します。

終了後、web.config ファイルは次のようになります。

<configuration>
  <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication>
          <providers>
            <remove value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</configuration>

ブラウザーで https://localhost/app を要求します。

タスク 5 :コレクション内の特定要素のロック

このタスクでは、特定のコレクション要素をロックする方法について学びます。開発者は引き続き、階層の下位 (アプリケーション) レベルでコレクションに要素を追加でき、またコレクションからロックされていない要素を削除できます。ただし、ロックした要素は削除できません。また、コレクションはクリアできません。クリアすると、コレクションからすべての要素が削除されるためです。

前のタスクで作成した、location タグ内で <windowsAuthentication> セクションを探します。

<providers> コレクションの <add> 要素で NTLM プロバイダーの lockItem を "true" に設定します。

終了後、セクションは次のようになります。

<windowsAuthentication enabled="true" >
  <providers>
    <add value="Negotiate" />
    <add value="NTLM" lockItem="true" />
  </providers>
</windowsAuthentication>

アプリケーションの web.config ファイルで、コレクションから NTLM 要素を削除する <remove> 要素を作成します。

終了後、web.config ファイルは次のようになります。

<configuration>
  <system.webServer>
    <security>
      <authentication>
        <windowsAuthentication>
          <providers>
            <remove value="NTLM" />
          </providers>
       </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</configuration>

ブラウザーで https://localhost/app を要求すると、要求は失敗します。

まとめ

このドキュメントでは、構成設定をロックする方法について学びました。<location> 要素を使用するかタグの lockItem 属性を true に設定することで、セクション全体をロックできます。コレクション要素で lockAttributes、lockElements、lockAllAttributesExcept、lockAllElementsExcept、または lockItem 設定を使用し、コレクションで lockElements 設定を使用して特定のコレクション ディレクティブ (<add>、<remove>、または <clear>) を指定すると、ロックをより柔軟かつ詳細に実行できます。ロックは ApplicationHost.config だけでなく、階層のすべてのレベルで実行できます。ロックは、それより下のレベルで有効になります。