Создание пользовательского сервера IIS 7.0

Майк Володарский

Введение

IIS 6.0 и предыдущие версии реализовали большую часть широко используемых функций сервера внутри самого сервера. В отличие от этого, подсистема веб-сервера IIS 7.0 и выше предоставляет модульную архитектуру, в которой практически все компоненты сервера предоставляются как подключаемые компоненты. Это обеспечивает огромные улучшения на борту, в том числе:

  • Возможность точно контролировать, какой набор функций загружается или используется на сервере, удаляя ненужные функции, чтобы уменьшить объем области атаки / объем памяти сервера
  • Возможность замены каждой функции сторонними или пользовательскими реализациями
  • Возможность специализации сервера на основе ее роли в топологии сервера
  • Расширенный контроль над набором функций сервера, как на тонком уровне, так и на уровне с отменой приложений

Эти компоненты сервера, известные как модули, загружаются во время инициализации рабочего процесса пула приложений и предоставляют службы обработки запросов на сервере. Каждое приложение IIS 7.0 и выше — это сочетание служб, предоставляемых модулями, включенными для приложения, и связанного содержимого, используемого этими службами. Сервер предоставляет две основные роли, которые играют модули:

  • Предоставление служб запросов, таких как проверка подлинности или кэширование выходных данных (аналогично фильтрам ISAPI в IIS 6.0)
  • Предоставление обработки запросов, таких как обработка статических файлов, CGI или ASP.NET обработка страниц (аналогично расширениям ISAPI в IIS 6.0)

Включив различные модули, сервер можно настроить для предоставления служб, необходимых приложениям на сервере.

К задачам, приведенным в этой статье, относятся следующие:

  • Проверка конфигурации сервера, значения по умолчанию и набора модулей, загруженных на сервер по умолчанию
  • Удаление всех модулей для удаления сервера до минимальной конфигурации и изучение влияния на объем памяти
  • Создание пользовательского сервера путем добавочного добавления модулей для поддержки определенного сценария

Проверка конфигурации модуля по умолчанию

Конфигурация основного сервера содержится в файле applicationHost.config, расположенном в каталоге %windir%\system32\inetsrv\config\конфигурации IIS. Мы рассмотрим следующую конфигурацию, содержащуюся в <system.webServer> группе разделов:

<globalModules> Разделе. Этот раздел уровня сервера содержит список модулей, загруженных рабочим процессом сервера, и связанные собственные библиотеки DLL, реализующие их функциональные возможности.

<modules> Разделе. Этот раздел уровня приложения содержит список модулей, включенных для конкретного приложения. Этот раздел служит для выбора подмножества загруженных модулей, которые должны быть активными в приложении, а также для загрузки дополнительных модулей уровня приложения.

<handlers> Разделе. Этот раздел уровня URL-адресов содержит сопоставления обработчиков, которые сервер использует для сопоставления входящих запросов с определенным модулем, который будет обрабатывать его. Это похоже на карты скриптов IIS 6.0 или ASP.NET и служит унифицированным сопоставлением запросов как с собственными, так и управляемыми обработчиками типов контента.

Полное описание всех модулей IIS доступно в обзоре модулей IIS 7.0 и выше.

Создание резервной копии конфигурации

Сначала мы создадим резервную копию конфигурации сервера, чтобы при необходимости ее можно было восстановить. Выполните следующую команду из командной строки, работающей как Администратор istrator:

%windir%\system32\inetsrv\appcmd add backup initial

Затем можно восстановить конфигурацию сервера до начального состояния, выполнив следующую команду:

%windir%\system32\inetsrv\appcmd restore backup initial

Просмотр списка модулей по умолчанию

Перейдите к разделу <system.webServer>/<globalModules> . Этот раздел, который можно настроить только на уровне сервера, содержит модули, загруженные каждым рабочим процессом сервера. Каждая запись настраивает модуль с определенным именем и библиотекой DLL, реализующей функциональные возможности этого модуля:

<globalModules>

    <!--several modules omitted -->

    <add name="BasicAuthenticationModule" image="…\authbas.dll" />

    <add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

</globalModules>

Просмотрите имена различных модулей в конфигурации сервера по умолчанию. Мы видим знакомые службы, предоставляемые как часть сервера в IIS 6.0:

Модуль проверки подлинности Windows, проверка подлинности запроса NTLM

<add name="WindowsAuthenticationModule" image="…\authsspi.dll" />

Модуль обработчика статических файлов, обслуживающий статические файлы

<add name="StaticFileModule" image="…\static.dll" />

Модуль динамического сжатия, сжатие ответов

<add name="DynamicCompressionModule" image="…\compdyn.dll" />

Перейдите к разделу <system.webServer>/<modules> . Этот раздел, который можно настроить на уровне сервера или приложения, указывает, какие модули, загруженные в <разделе globalModules> , включены для конкретного приложения. В большинстве случаев мы видим, что в этом разделе перечислены имена модулей, которые мы видели в разделе, включив их по умолчанию для всех приложений.

Примечание.

В конце списка есть несколько дополнительных элементов— это управляемые модули, разработанные с помощью модели расширяемости ASP.NET. Дополнительные сведения о создании управляемых режимов см. в пошаговом руководстве по разработке модуля .NET .

Перейдите к разделу <system.webServer>/<handlers> . Этот раздел, который можно настроить на сервере, приложении или уровне URL-адреса, указывает, как обрабатываются запросы. Модули обычно участвуют в каждом и каждом запросе, в то время как обработчики получают запросы только для определенного URL-адреса.

Хорошим примером модуля является модуль сжатия. Модуль сжатия проверяет каждый ответ и сжимает его при необходимости. Обработчик страницы ASP.NET является хорошим примером обработчика. Он получает только запросы, сопоставленные с ним, например запросы с расширением .aspx. Список <handlers> определяет сопоставления между запросом на основе URL-адреса и команды и модуля обработки, который будет использоваться для обработки этого запроса. Существует также дополнительная информация, используемая для настройки каждого сопоставления, которая не является фокусом в этом разделе.

<handlers>
    <!-- certain details omitted -->
    <add name="CGI-exe" path="*.exe" verb="*" modules="CgiModule" ... />
    <add name="ISAPI-dll" path="*.dll" verb="*" modules="IsapiModule" ... />
    <add name="ASPClassic" path="*.asp" verb="GET,HEAD,POST"  modules="IsapiModule" ... />
</handlers>

Проверка места на сервере

  1. Откройте интернет-Обозреватель и отправьте запрос на сервер, указав следующий URL-адрес и нажав клавишу ВВОД:

    http://localhost/iisstart.htm
    

    Это запускает пул приложений сервера и обслуживает документ iisstart.htm.

  2. Запустите диспетчер задач и перейдите на вкладку "Процессы". Так как рабочий процесс IIS выполняется в другой учетной записи пользователя, необходимо проверка "Показать процессы для всех пользователей". Обратите внимание на размер рабочего процесса w3wp.exe сервера.
    Снимок экрана: диспетчер задач Windows. Выбрана вкладка
    Рис. 1. Диспетчер задач, показывающий рабочий процесс IIS

  3. Теперь выполните следующую командную строку:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    Мы видим, что более 90 DLL загружаются рабочим процессом. Большинство из них находятся в каталоге ...\intersrv\ — многие из них — библиотеки DLL модулей, которые мы видели в первой задаче при просмотре <раздела globalModules> , а также несколько других, поддерживающих платформу .NET и саму среду выполнения сервера.

Удаление сервера

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

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

Если мы изменили файл конфигурации applicationHost.config во время предыдущей задачи, мы можем восстановить его в исходном состоянии, выполнив команду %windir%\system32\inetsrv\appcmd restore backup initial из командной строки.

Теперь, чтобы удалить сервер.

  1. Откройте текстовый редактор %windir%\system32\inetsrv\config\applicationHost.config.

  2. Перейдите к разделу <system.webServer>/<globalModules> .

  3. Удалите все записи в коллекции, чтобы осталось только пустое определение раздела:

    <globalModules> 
        <!—Remove Everything --> 
    </globalModules>
    
  4. Вставьте элементы в окно блокнота с нуля для последующего использования. Повторите то же самое с разделом <system.webServer>/<modules> . Удалите все записи в этом разделе и вставьте их в блокнот для последующего использования. Это гарантирует, что мы не включаем модули, которые больше не загружаются. Вставьте эти элементы в окно блокнота с нуля для последующего использования.

  5. Повторите то же самое с разделом <system.webServer>/<handlers> . Удалите все записи в этом разделе, чтобы убедиться, что мы не указываем сопоставления обработчиков с модулями, которые мы отключили. Вставьте элементы в блокнот с нуля для последующего использования. Сохраните файл applicationHost.config, чтобы повлиять на изменения.

Проверка места на сервере с отрезаным объемом

На этом этапе мы готовы загрузить наш отрезаемый сервер . Мы повторим предыдущие шаги, чтобы изучить новый объем сервера.

  1. Откройте интернет-Обозреватель и отправьте запрос на сервер, указав следующий URL-адрес и нажав клавишу ВВОД:

    http://localhost/iisstart.htm
    

    Это должно запустить пул приложений сервера и вернуть ошибку в браузер, так как обработчик не зарегистрирован для обслуживания запрошенного ресурса.

  2. Запустите диспетчер задач и перейдите на вкладку "Процессы". Обратите внимание на размер рабочего процесса w3wp.exe сервера.

  3. Выполните следующую командную строку:

    TASKLIST /fi "imagename eq w3wp.exe" /m
    

    Обратите внимание, что объем памяти сервера сократился до около 8 МБ. На временном интервале сервера объем пустого сервера будет сокращен.

    Загружается только 50 БИБЛИОТЕК DLL, по сравнению с 90 или более , это означает, что сервер не загружал библиотеки DLL модуля, которые напрямую и косвенно учитывают разницу количества библиотек DLL. Не только службы отключены на сервере, но и код для этих функций даже не загружается в процессе. После оптимизации число библиотек DLL пустого сервера будет значительно ниже.

В следующей задаче мы создадим пользовательский сервер только с нужными функциями.

Создание пользовательского сервера

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

  • Обслуживание статических файлов
  • Обслуживание списков каталогов
  • Защита содержимого с помощью основных правил авторизации на основе URL-адресов и проверки подлинности

Включение сервера для обслуживания статических файлов

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

  1. Откройте текстовый редактор %windir%\system32\inetsrv\config\applicationHost.config.

  2. Перейдите к разделу <system.webServer>/<globalModules> . Добавьте 2 строки полужирного шрифта ниже в коллекцию— скопируйте его с нуля, используемого ранее для сохранения элементов коллекции по умолчанию. При этом загружается модуль обработчика статических файлов, который отвечает за обслуживание запросов на статические файлы и модуль анонимной проверки подлинности, который создает маркер проверки подлинности по умолчанию для запроса:

    <globalModules>
        <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" />
        <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" />
    </globalModules>
    
  3. Перейдите к разделу <system.webServer>/<modules> . Включите статический обработчик файлов и режимы анонимной проверки подлинности, добавив строку полужирным шрифтом ниже:

    <modules>
    
        <add name="AnonymousAuthenticationModule" />
    
        <add name="StaticFileModule" />
    
    </modules>
    
  4. Перейдите к разделу <system.webServer>/<handlers> . Сопоставить статический обработчик файлов со всеми запросами файлов, добавив строку полужирным шрифтом ниже:

    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD"  modules="StaticFileModule" resourceType="Either" requireAccess="Read"/>
    </handlers>
    
  5. Сохраните файл applicationHost.config.

  6. Откройте интернет-Обозреватель и выполните запрос по следующему URL-адресу:

    http://localhost/iisstart.htm
    

    Это служит запрошенным документом. Мы успешно включили возможность обслуживания статических файлов на сервере.

  7. Затем попросите список каталогов, выполнив запрос на следующий URL-адрес:

    http://localhost
    

    Мы получаем пустой ответ, так как в настоящее время обработчик не загружается, включен и сопоставлен с списками каталогов обработки— пустой ответ отправляется (200 ОК). В следующей задаче мы добавим обработчик.

Включение сервера для предоставления списков каталогов

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

  1. Откройте текстовый редактор %windir%\system32\inetsrv\config\applicationHost.config.

  2. Как и раньше, добавьте приведенную ниже конфигурацию, чтобы включить модуль просмотра каталогов и сопоставить его с запросами каталога (накопительная конфигурация будет выглядеть точно так же, как указано ниже после этого шага, на основе предыдущего шага):

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" />
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" />
        <add name="DirectoryListingModule" image="%windir%\System32\inetsrv\dirlist.dll" />
    </globalModules>
    
    <modules>
        <add name="AnonymousAuthenticationModule" />
        <add name="StaticFileModule" />
        <add name="DirectoryListingModule" />
    </modules>
    
    <handlers>
        <add name="StaticFile" path="*" verb="GET,HEAD" modules="StaticFileModule,DirectoryListingModule"  resourceType="Either" requireAccess="Read" />
    </handlers>
    

    На этом этапе мы включили функцию перечисления каталогов на сервере. Однако эта функция предоставляет дополнительную конфигурацию по соображениям безопасности, определяющим, разрешено ли перечисление каталога. Эта конфигурация указана <в разделе system.webServer>/<directoryBrowse> .

  3. Измените запись на <directoryBrowse enabled="true" />

  4. Сохраните файл applicationHost.config.

  5. Откройте интернет-Обозреватель и повторите запрос к каталогу, запросить следующий URL-адрес:

http://localhost

Это служит для перечисления запрошенного каталога. Мы успешно включили возможность перечисления каталогов на сервере.

Затем мы добавим службы проверки подлинности и авторизации для защиты содержимого на сервере от несанкционированного доступа.

Защита ресурсов с помощью авторизации URL-адреса

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

  1. Откройте текстовый редактор %windir%\system32\inetsrv\config\applicationHost.config.

  2. На этот раз мы добавим два модуля:

    • Базовый модуль проверки подлинности, который поддерживает базовую схему проверки подлинности по протоколу http1.1 с учетными данными Windows сервера
    • Модуль авторизации URL-адресов, который поддерживает управление доступом на основе правил пользователей и ролей
  3. Чтобы добавить эти модули, добавьте записи <загрузки модуля в раздел system.webServer>/globalModules, а затем включите модули в <разделе system.webServer>/<<modules>, как мы сделали ранее для обработчика статических файлов и браузера каталогов>.

    Примечание.

    На этот раз нам не нужно добавлять ничего в <раздел system.webServer>/<handlers> , так как эти модули не предоставляют обработку запросов. Они предоставляют только службы запросов для всех запросов. После добавления приведенных ниже элементов в полужирный шрифт будет выглядеть следующим образом:

    <globalModules>
        <add name="AnonymousAuthenticationModule" image="%windir%\system32\inetsrv\authanon.dll" /> 
        <add name="StaticFileModule" image="%windir%\system32\inetsrv\static.dll" /> 
        <add name="DirectoryListingModule" image="%windir%\system32\inetsrv\dirlist.dll" /> 
        <add name="UrlAuthorizationModule" image="%windir%\System32\inetsrv\urlauthz.dll" />      
        <add name="BasicAuthenticationModule" image="%windir%\System32\inetsrv\authbas.dll" /> 
    </globalModules> 
    
    <modules> 
        <add name="AnonymousAuthenticationModule" /> 
        <add name="StaticFileModule" /> 
        <add name="DirectoryListingModule" /> 
        <add name="BasicAuthenticationModule" /> 
        <add name="UrlAuthorizationModule" /> 
    </modules>
    

    Чтобы использовать добавленные функции, необходимо настроить их.

  4. Включите службу базовой проверки подлинности. Перейдите к элементу <basicAuthentication> и задайте для атрибута включено значение true:

    <basicAuthentication enabled="true" />
    
  5. Отключите анонимную проверку подлинности. Перейдите к элементу <anonymousAuthentication> и задайте для включенного атрибута значение false:

    <anonymousAuthentication enabled="false" userName="IUSR" />
    

    Это отключает анонимную проверку подлинности и требует, чтобы базовый модуль проверки подлинности успешно прошел проверку подлинности пользователя, прежде чем будет предоставлен доступ.

  6. Сохраните файл applicationHost.config.

  7. Откройте интернет-Обозреватель и повторите запрос к каталогу, запросить следующий URL-адрес:

    http://localhost
    

    Это запрашивает список каталогов. Так как браузер не прошел проверку подлинности, модуль авторизации URL-адреса отклоняет запрос. Базовый модуль проверки подлинности перехватывает отклонение и запускает обычную проверку подлинности обратно в браузер, что приводит к отображению браузера диалогового окна входа в систему проверки подлинности.

  8. Войдите с недопустимыми учетными данными. Запрос отклоняется, при этом запрос снова запрашивает учетные данные.

  9. Войдите с помощью учетной записи Администратор istrator, которая использовалась для входа на компьютер. Отображается список каталогов, указывающий, что вы успешно добавили возможности проверки подлинности и авторизации на сервер.

Итоги

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

Прежде чем снова использовать сервер, отмените изменения конфигурации сервера, выполняемой в рамках этого пошагового руководства. Если вы создали резервную копию ранее, восстановите ее, выполнив команду %windir%\system32\inetsrv\appcmd restore backup initial из командной строки.

Дополнительные сведения см. по следующим ссылкам: