Использование блокировки в конфигурации IIS 7.0

Саад Ладки

Краткие сведения

В этом документе объясняется, как заблокировать и разблокировать конфигурацию на сервере. Вы узнаете, какие параметры могут переопределять файлы конфигурации на уровне приложения и как использовать <location> элемент для блокировки целых разделов.

Вы будете экспериментировать с более детализированной блокировкой параметров конфигурации в разделах, таких как:

  • Блокировка определенных элементов и атрибутов
  • Блокировка всего , кроме определенных элементов или атрибутов
  • Блокировка определенных директив коллекции, таких как <add>директивы , <remove>и <clear>
  • Блокировка определенных элементов в коллекциях

Прочитав этот документ, вы узнаете, как управлять различными функциями блокировки конфигурации, напрямую изменяя XML-элементы в файлах конфигурации (программный интерфейс для выполнения этих задач очень точно соответствует структуре XML).

В этом документе основное внимание уделяется только редактированию XML-элементов в файлах конфигурации вместо того, чтобы показать способы выполнения одних и того же задания с помощью API администрирования, скриптов или пользовательского интерфейса.

Введение

СЛУЖБЫ IIS 7.0 и более поздних версий позволяют блокировать и разблокировать параметры конфигурации на различных уровнях и областях. Конфигурация блокировки означает, что ее нельзя переопределить (или задать вообще) на более низких уровнях в иерархии. Разблокировать конфигурацию можно только на том уровне, на котором она была заблокирована. Это полезно, например, при создании разных конфигураций для разных сайтов или путей, и только некоторые из сайтов и путей могут переопределять ее. Блокировка может выполняться на уровне раздела или для определенных элементов, атрибутов, элементов коллекции и директив коллекции в разделах.

Задача 1. Блокировка раздела с помощью тега <location>

В этой задаче вы узнаете, как использовать <location> тег для блокировки (или разблокировки) всех разделов конфигурации на глобальном уровне, чтобы их нельзя было переопределить на уровнях приложений в иерархии конфигурации.

Примечание

По умолчанию большинство разделов IIS в applicationHost.config заблокированы, и ни одна из платформ .NET framework не заблокирована (включая разделы ASP.NET в <группе разделов system.web> в machine.config и корневом web.config).

В текстовом редакторе, например Блокноте, откройте файл 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>

Раздел теперь разблокирован для всех приложений. Вы можете указать путь к тегу расположения, чтобы раздел был разблокирован только для этого пути. Путь по умолчанию, если он не указан (как на предыдущем шаге), — path="." (или path=""", то же самое), что означает "текущий уровень". В этом случае, так как это applicationHost.config, текущий уровень означает глобальный уровень. Вы также можете использовать теги расположения в любом месте иерархии пространства имен, например в web.config на уровне vdir, чтобы заблокировать конфигурацию с этой точки вниз.

Ниже приведен пример разблокировки этого раздела только для сайта 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>

Возвращаясь к третьему приведенному выше примеру, раздел разблокирован для всех приложений на всех сайтах (location path="."). Убедитесь, что основная группа разделов проверки подлинности <> (за пределами <location> элемента выше в файле) не содержит <раздел windowsAuthenitcation>. Раздел не может отображаться в одном и том же файле как за пределами тега расположения, так и внутри <пути к расположению"."> Тег; это считается недопустимой конфигурацией.

Чтобы проверить, заблокирован ли раздел, перейдите http://localhost/app по адресу в браузере.

Если раздел заблокирован, в браузере отображается сообщение об ошибке, так как в файле web.config на уровне приложения есть <windowsAuthentication> раздел. Это означает, что web.config пытается переопределить <windowsAuthentication> уровень. Однако, поскольку этот раздел теперь заблокирован на глобальном уровне, конфигурация в web.config файле является недопустимой.

Измените тег расположения на overrideMode="Deny". При этом раздел снова блокируется. Экспериментируйте с другими разделами, такими как разделы ASP.NET в machine.config или корневых web.config. Попробуйте заблокировать их на глобальном уровне и переопределить на уровне web.config.

Задача 2. Блокировка определенных элементов и атрибутов

На основе предыдущей задачи найдите <windowsAuthentication> раздел внутри тега <location> . Задайте тег расположения, чтобы разблокировать раздел: overrideMode="Allow". Мы не будем блокировать только определенные части раздела.

Задайте для атрибута enabled значение true, а затем заблокируйте его, задав lockAttributes="enabled".

Это предотвращает изменение значения включенного<windowsAuthentication> атрибута раздела в файле конфигурации на уровне приложения.

Если вы хотите заблокировать другие атрибуты, добавьте их в значение 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 .

Примечание

Простое указание атрибута в файле web.config приводит к сбою конфигурации, даже если атрибут, заданный в файле Web.config, имеет то же значение, что и в файле ApplicationHost.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 переопределите другие элементы или атрибуты, например включенный атрибут. Перейдите на страницу и обратите внимание, что ошибка не отображается.

Удалите атрибут lockElements .

Задача 3. Блокировка всего, кроме определенных атрибутов

В этой задаче вы узнаете, как заблокировать все элементы или атрибуты в разделе, кроме определенных, которые вы определяете. Это полезно в тех случаях, когда вы не уверены, какие свойства есть в разделе или будут иметься в будущем, и вы хотите заблокировать все, кроме свойств, которые явно заданы для разблокировки.

На основе предыдущей задачи найдите <windowsAuthentication> раздел в теге location.

Задайте для атрибутов 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> в коллекции, чтобы на уровне приложения элементы файла конфигурации можно было добавлять, но не удалять.

На основе предыдущей задачи найдите <windowsAuthentication> раздел в теге location.

Задайте для атрибута lockElements в <providers> коллекции значение remove,clear.

После завершения раздел будет выглядеть следующим образом:

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

В файле web.config приложения создайте <remove> элемент, который удаляет элемент NTLM из коллекции.

По завершении файл web.config выглядит следующим образом:

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

В браузере запросите http://localhost/app.

Задача 5. Блокировка определенных элементов в коллекции

В этой задаче вы узнаете, как заблокировать определенные элементы коллекции. Разработчики по-прежнему могут добавлять элементы в коллекцию на более низких уровнях иерархии (приложения), а также удалять неблокируемые элементы из коллекции. Однако они не могут удалить специально заблокированные элементы. Невозможно очистить коллекцию, так как очистка означает удаление всех элементов из коллекции.

Основываясь на предыдущих задачах, найдите <windowsAuthentication> раздел в теге расположения.

<providers> В коллекции в элементе <add> для поставщика NTLM задайте для lockItem значение true.

После завершения раздел будет выглядеть следующим образом:

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

В файле web.config приложения создайте <remove> элемент, который удаляет элемент NTLM из коллекции.

По завершении файл 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. Блокировка может быть более гибкой и детализированной при использовании параметров lockAttributes, lockElements, lockAllAttributesExcept, lockAllElementsExcept или lockItem для элементов коллекции, а также при использовании параметров lockElements в коллекциях для указания конкретных директив коллекции (<add>, <remove>или <clear>). Блокировка может происходить на любом уровне иерархии, а не только в ApplicationHost.config. Блокировка вступает в силу с этого уровня вниз.