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

作成者: Saad Ladki

要約

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

次のような、セクション内での構成設定のさらに細かいロックを試します。

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

このドキュメントを読むと、構成ファイル内の XML 要素を直接編集することで、構成ロックのさまざまな機能を管理する方法がわかります (これらのタスクを実行するためのプログラマティック インターフェイスは、XML の構造に非常に密接に対応しています)。

このドキュメントでは、意図して、管理 API、スクリプト、またはユーザー インターフェイス (UI) を使って同じタスクを実行する方法は示さず、構成ファイル内の XML 要素の編集のみに焦点を当てます。

はじめに

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

タスク 1: <location> タグを使ってセクションをロックする

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

Note

既定では、applicationHost.config のほとんどの IIS セクションはロックダウンされ、.NET フレームワークは何もロックされません (machine.config とルートの web.config の <system.web> セクション グループの ASP.NET セクションを含む)。

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

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

ファイルの先頭にある <configSections> セクションを確認します。セクションの名前、含まれているセクション グループ、ロックされているかどうかなど、このファイル内の構成セクションに関するメタデータが含まれています。

ロック対象のセクションは、"overrideModeDefault" 属性 ("Allow" または "Deny") によって指定されます。 次に示す行の例で指定されているように、既定でロックされていないセクションはごくわずかです。

<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 タグを使って (vdir レベルの web.config など)、このポイントから下にある構成をロックすることもできます。

次に示すのは、"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> 要素の外側にあるもの) に、<windowsAuthenitcation> セクションが含まれていないことを確認してください。 1 つのセクションが、同じファイル内で location タグの外側と、<location path="."> タグの内側の両方に出現することはできません。これは無効な構成と見なされます。

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

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

location タグを overrideMode="Deny" に変更します。 これにより、セクションは再びロックダウンされます。 machine.config やルートの 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>
      <authentication>
        <windowsAuthentication enabled="true" lockAttributes="enabled">          
          <providers>
            <add value="Negotiate" />
            <add value="NTLM" />
          </providers>
        </windowsAuthentication>
      </authentication>
    </security>
  </system.webServer>
</location>

アプリケーションの web.config ファイルで、<windowsAuthentication> セクションの設定をオーバーライドしてみてください。

ブラウザーで、ページを要求して、ロックしたもの (この場合は enabled 属性) を除くすべての設定をオーバーライドできることを確認します。

Note

web.config ファイルで設定した属性の値が ApplicationHost.config ファイルと同じであっても、web.config ファイルで属性を指定するだけで、構成エラーが発生します。 どのような値であってもロックされた属性を設定すると、属性のオーバーライドの試みと見なされるため、失敗します。 (また、属性は要素とは異なることに注意してください。次のタスクでは、要素をロックします。)

lockAttributes 属性を削除します。

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

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

lockElements="providers,element1,element2"

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

<location path="." overrideMode="Allow">   <system.webServer>
    <security>
      <authentication>
        <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>

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

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

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

前のタスクを基にして、location タグ内にある <windowsAuthentication> セクションを見つけます。

<providers> コレクション内の NTLM プロバイダーの <add> 要素で、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>

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

まとめ

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