Ошибка iis pool на доступ к файлу
Каждый пул приложений в IIS использует свой собственный рабочий процесс (IIS Worker Process). Удостоверение пула приложений (Application Pool Identities) представляет из себя имя учетной записи, под которой выполняется рабочий процесс этого пула.
В IIS 6.0 и IIS 7.0 пул приложений по умолчанию работал под встроенной системной учетной записью NetworkService. Эта запись не требует пароля и имеет на локальном компьютере ограниченные права, что является хорошей практикой с точки зрения безопасности. Однако под этой учетной записью могут одновременно работать разные системные службы Windows, и при использовании одного и того же идентификатора одни службы могут воздействовать на работу других.
Начиная с Windows Server 2008 SP2 для того, чтобы изолировать рабочие процессы IIS от других системных служб, можно использовать виртуальные учетные записи (Virtual Accounts). Они позволяют запускать рабочий процесс для каждого пула приложений под собственной уникальной учетной записью ApplicationPoolIdentity. Эта учетная запись не требует управления и создается автоматически при создании каждого нового пула. Также она не имеет практически никаких привилегий в системе и не использует профиль пользователя, что повышает безопасность веб-сервера.
Для примера возьмем Application Pool с именем PubSite1. Открываем Task Manager и находим рабочий процесс IIS (w3wp.exe), выполняющийся от имени PubSite1. Как видите, имя учетной записи совпадает с именем пула приложений. Дело в том, что начиная с IIS 7.5 для каждого вновь созданного пула приложений по умолчанию создается виртуальная учетная запись с именем этого пула, и его рабочий процесс запускается из под этой записи.
Настройка типа удостоверения пула приложений
При необходимости тип идентификации пула приложений можно изменить. Для этого запускаем IIS Manager, переходим в раздел Application Pools, выбираем нужный пул и открываем его свойства (Advanced Settings).
В свойствах выбираем пункт Identity.
Здесь мы указываем учетную запись, от имени которой будет работать данный пул приложений:
Кроме того, в качестве удостоверения можно использовать и обычную учетную запись пользователя. Для этого надо выбрать Custom Account, нажать кнопку Set и ввести имя пользователя и пароль. Можно указать любого доменного или локального пользователя.
Примечание. При использовании учетной записи пользователя надо отслеживать срок действия пароля и своевременно менять его.
То же самое можно сделать с помощью утилиты командной строки appcmd. Чтобы указать учетную запись, которая будет использоваться для пула приложений, используется следующий синтаксис:
appcmd set config /section:applicationpools /[name=″имя пула приложений″].processModel.identityType:SpecificUser|NetworkService|LocalService|LocalSystem
Для примера изменим тип удостоверения для пула приложений PubSite1 на NetworkService:
appcmd set config /section:applicationpools
/[name=″PubSite1″].processModel.identityType:NetworkService
Профиль пользователя
Если вы хотите настроить ApplicationPoolIdentity на использование пользовательского профиля, то надо зайти в расширенные свойства пула и перевести параметр Load User Profile в состояние True.
Настройка доступа к ресурсам
Иногда веб-приложению может потребоваться доступ к определенной папке или файлу на диске. Чтобы добавить ApplicationPoolIdentity в Access Control List (ACL):
• Запускаем Windows Explorer;
• Выбираем нужный файл или директорию, кликаем по ней правой клавишей мыши и выбираем пункт Свойства (Properties);
• Переходим на вкладку Безопасность (Security),
• Кликаем по кнопке Изменить (Edit), затем Добавить (Add);
• В поле Размещение (Locations) выбираем локальную машину;
• Вводим имя пользователя в виде ″IIS AppPool\имя пула приложений″. Так для пула приложений PubSite1 имя пользователя будет выглядеть ″IIS AppPool\PubSite1″;
• Проверяем имя клавишей Проверить имена (Check Names) и жмем ОК.
Также при желании можно воспользоваться утилитой командной строки ICACLS. Для примера дадим права на изменение для PubSite1:
ICACLS C:\Web\Pubsite1 /grant ″IIS AppPool\PubSite1″:M
Список разрешений выглядит следующим образом:
D – удаление;
F – полный доступ;
M – изменение;
RX – чтение и выполнение;
R – чтение;
W – запись.
Если ресурс находится в сети, то для доступа к нему лучше всего использовать учетную запись NetworkService. Рабочий процесс, запущенный под этим аккаунтом, для доступа к ресурсам использует учетные данные компьютера, сгенерированные при добавлении компьютера в домен. Для того, чтобы дать процессу доступ к сетевому ресурсу, в качестве пользователя указываем компьютер:
• Выбираем тип объекта (Object Type) Computers;
• В поле Размещение (Locations) выбираем домен;
• Вводим имя пользователя в виде domainname\machinename$, например contoso\SRV12$;
• Проверяем имя и жмем ОК.
Очень удобный способ предоставлять доступ к сетевым ресурсам типа файловых шар или баз данных SQL Server. Однако работает он только при наличии домена AD.
- В IIS 7.5 идентификатор по умолчанию для пула приложений: ApplicationPoolIdentity .
- ApplicationPoolIdentity представляет собой учетную запись пользователя Windows под названием "IIS APPPOOL\AppPoolName" , которая создается при создании пула приложений, где AppPoolName является именем пула приложений.
- Пользователь "IIS APPPOOL\AppPoolName" по умолчанию является членом группы IIS_IUSRS .
- Если вы работаете под полным доверием, ваше веб-приложение может писать во многие области файловой системы (исключая такие папки, как C:\Users , C:\Windows и т.д.). Например, ваше приложение будет иметь доступ к записи в некоторые папки, например, C:\dump .
- По умолчанию группе IIS_IUSRS не предоставляется доступ для чтения или записи к C:\dump (по крайней мере, не доступ, который отображается на вкладке "Безопасность" в проводнике Windows).
- Если вы откажетесь на запись на IIS_IUSRS , вы получите SecurityException при попытке записи в папку (как и ожидалось).
Итак, принимая во внимание все это, каким образом доступ на запись предоставляется пользователю "IIS APPPOOL\AppPoolName" ? Процесс w3wp.exe работает как этот пользователь, поэтому что позволяет этому пользователю писать в папку, у которой, похоже, нет явного доступа?
Обратите внимание, что я понимаю, что это, вероятно, было сделано ради удобства, так как было бы больно предоставить пользователю доступ ко всем папкам, которые нужно написать, если вы работаете под полным доверием. Если вы хотите ограничить этот доступ, вы всегда можете запустить приложение в разделе "Среднее доверие". Мне интересно узнать о том, как операционная система и/или IIS позволяют выполнять эти записи, даже несмотря на то, что доступ к файловой системе явно отсутствует.
ОТВЕТЫ
Ответ 1
ApplicationPoolIdentity назначается членство группы Users , а также группа IIS_IUSRS . На первый взгляд это может выглядеть несколько тревожным, однако группа Users имеет несколько ограниченные права NTFS.
Например, если вы попытаетесь создать папку в папке C:\Windows , вы обнаружите, что не можете. ApplicationPoolIdentity все еще должен быть в состоянии читать файлы из системных папок Windows (иначе как еще рабочий процесс сможет динамически загружать важные DLL).
Что касается ваших замечаний о возможности записи в папку c:\dump . Если вы посмотрите на разрешения в расширенных настройках безопасности, вы увидите следующее:
Смотрите, что специальное разрешение наследуется от c:\ :
То, что ваш сайт ApplicationPoolIdentity может читать и записывать в эту папку. Это право унаследовано от диска c:\ .
В общей среде, где у вас может быть несколько сотен сайтов, каждая из которых имеет свой собственный пул приложений и идентификатор пула приложений, вы сохранили бы папки сайта в папке или томе, у которых была удалена группа Users , и установлены разрешения так что доступ к ним (с наследованием) доступны только администраторам и учетной записи SYSTEM.
Затем вы должны индивидуально назначать требуемые разрешения для каждого IIS AppPool\[name] для этого в корневой папке сайта.
Вы также должны убедиться, что все папки, созданные вами, где хранятся потенциально чувствительные файлы или данные, удалены группой Users . Вы также должны убедиться, что все приложения, которые вы устанавливаете, не хранят конфиденциальные данные в своих папках c:\program files\[app name] и вместо этого они используют папки профиля пользователя.
Итак, на первый взгляд похоже, что ApplicationPoolIdentity имеет больше прав, чем нужно, но на самом деле он не имеет больше прав, чем диктует членство в группе.
Членство в группе ApplicationPoolIdentity можно проверить с помощью инструмента SysInternals Process Explorer. Найдите рабочий процесс, который запущен с идентификатором пула приложений, который вам интересен (вам нужно добавить столбец User Name в список столбцов для отображения:
Например, у меня есть пул с именем 900300 , который имеет идентификатор пула приложений IIS APPPOOL\900300 . Щелкните правой кнопкой мыши по свойствам процесса и выберите вкладку "Безопасность":
Как мы видим, IIS APPPOOL\900300 является членом группы Users .
Ответ 2
Щелкните правой кнопкой мыши папку.
Нажмите вкладку "Безопасность". Вы увидите что-то вроде этого:
- Нажмите "Добавить. " на приведенном выше экране. Вы увидите что-то вроде этого:
Отметьте/снимите отметку о том, какой доступ вам нужно предоставить учетной записи
Ответ 3
Каждый пул приложений в среде II создает свою собственную безопасную папку пользователя с ПОЛНЫМ разрешением на чтение и запись по умолчанию в каталоге c:\users. Откройте папку "Ваши пользователи" и посмотрите, какие папки пулов приложений есть, щелкните правой кнопкой мыши и проверьте их права для назначенной виртуальной учетной записи пула приложений. Вы должны увидеть добавленную вами учетную запись пула приложений, имеющую доступ для чтения и записи, назначенный ее корневому и подпапкам.
Таким образом, доступ к типу доступа к файлам автоматически выполняется, и вы должны иметь возможность писать все, что вам нравится, в папках учетных записей пулов приложений, ничего не меняя. Для этого были созданы виртуальные учетные записи пользователей для каждого пула приложений.
мы недавно обновились до IIS7 в качестве основного веб-сервера, и мне нужен обзор с точки зрения разрешений. Ранее при необходимости записи в файловую систему я бы предоставил пользователю AppPool (сетевой службе) доступ к каталогу или файлу.
однако эта учетная запись пользователя не существует, если я пытаюсь использовать это, чтобы дать разрешения. Итак, как определить, какой пользователь также должен предоставить разрешения?
ApplicationPoolIdentity на самом деле является лучшей практикой для использования в IIS7. Это динамически созданная, непривилегированная учетная запись. Чтобы добавить безопасность файловой системы для определенного пула приложений, см. IIS.net " S "идентификаторы пула приложений". Быстрая версия:
Если пул приложений называется " DefaultAppPool "(просто замените этот текст ниже, если он назван по-другому)
Не забудьте использовать локальное имя сервера, а не доменное имя, при разрешении имени "IIS AppPool\DefaultAppPool" (просто напоминание, потому что это меня немного зацепило):
в Windows Server 2008 (r2) нельзя назначить удостоверение пула приложений папке с помощью свойства->безопасность. Вы можете сделать это через командную строку администратора, используя следующее:
предоставление доступа к IIS AppPool\YourAppPoolName пользователей может быть не хватает с конфигурациями IIS по умолчанию.
Это необходимо, потому что по умолчанию анонимный доступ осуществляется с помощью запись iusr. Вы можете установить другой конкретный пользователь, пул приложений или продолжить использование IUSR, но не забудьте установить соответствующие разрешения.
верхний ответ от Джона Адамса
вот как реализовать это для людей PowerShell
просто чтобы добавить к путанице, диалоговое окно (Проводник Windows) эффективные разрешения не работает для этих имен входа. У меня есть сайт "Umbo4", использующий сквозную аутентификацию, и посмотрел на эффективные разрешения пользователя в корневой папке сайта. Проверка имен разрешила имя "IIS AppPool\Umbo4", но эффективные разрешения показывают, что у пользователя вообще не было разрешений на папку (все флажки сняты).
часть A: настройка пула приложений
предположим, что пул приложений называется "MyPool" Перейдите в "Дополнительные настройки" пула приложений из диспетчера IIS
прокрутите вниз до "Identity". При попытке изменить значение появится диалоговое окно. Выберите "встроенная учетная запись" и под ней выберите "ApplicationPoolIdentity".
несколько строк ниже "Identity", вы должны найти "загрузить профиль пользователя". Этот значение должно быть установлено в "True".
- Добавить IIS_IUSRS с разрешением на чтение для файлов в папке
- Измените метод проверки подлинности IIS на BasicAuthentication
- обновите сайт. Это сработает
Что я могу добавить в свой файл web.config? Мне никогда раньше не приходилось его редактировать. Вот его текущее содержание:
Ошибка конфигурации: не удается прочитать файл конфигурации из-за недостаточных разрешений
Файл конфигурации: \? \ C: \ Users ***** \ Documents \ Visual Studio2010 \ WebSites \ PointsForTime \ web.config
Нет проблем с вашим web.config . Ваш веб-сайт работает в рамках процесса. В iis вы можете определить идентичность этого процесса. Удостоверение , под которым пул приложений вашего веб-сайта ( Сетевые службы, локальная система и т. Д.), Должно иметь разрешение на доступ и чтение в Интернете. .config файл.
Обновить:
Этот обновленный ответ такой же, как и выше, но немного длиннее, проще и улучшен.
Прежде всего : вам не нужно ничего менять в файле конфигурации. Все в порядке . Проблема связана с разрешениями для файлов Windows .
Эта проблема возникает из-за того, что ваше приложение не может получить доступ и прочитать файл web.config .
Сделайте файл доступным для группы IIS_IUSRS . Просто щелкните правой кнопкой мыши web.config и выберите свойства на вкладке безопасность , добавьте IIS_IUSRS .
Так что это за штука IIS_IUSRS?
Ваш веб-сайт представляет собой файл EXE . Как и любой exe-файл, он должен быть запущен пользователем и запускается в соответствии с разрешениями , назначенными этому пользователю.
Когда ваш сайт запускается в IIS , Пул приложений вашего веб-сайта связывается с пользователем ( Сетевые службы, Локальная система и т. д. . ) (и может быть изменено в IIS)
Поэтому, когда вы говорите IIS_IUSRS , это означает любого пользователя ( Сетевые службы, локальная система и т. Д. . ), что ваш сайт работает как .
И как @Seph упоминается в комментарии ниже : Если ваш компьютер находится в домене , помните, что Группа IIS_IUSRS - это локальная группа . Также убедитесь, что, когда вы пытаетесь найти этого пользователя, проверьте местоположение, он должен быть установлен на локальный компьютер, а не на корпоративный домен.
Все предоставленные ответы действительны и работают при различных обстоятельствах.
Для меня перезапуск Visual Studio сработал.
Принятое решение меня не устроило. Я использую репозиторий Git, и он клонирован в следующую папку
Я создал новый веб-сайт IIS и указал его на путь. У которого не было разрешений iis_iusrs, предложенных в принятом решении. Когда я добавил разрешения, он все еще не работал.
Он начал работать только тогда, когда я дал следующие разрешения группе «Пользователи», и наследование каскадировало разрешения для web.config. Вероятно, следовало применить его только к web.config, чтобы уменьшить площадь поверхности атаки.
Я использовал subst для создания сопоставления от D: до C:, чтобы сохранить те же настройки, что и у других разработчиков в команде. Это также дало мне те же ошибки, что и описано. Удаление этого исправило это для меня.
Сервер настроен на использование сквозной аутентификации со встроенной учетной записью для доступа к указанному физическому пути. Однако диспетчер IIS не может проверить, есть ли доступ у встроенной учетной записи. Убедитесь, что удостоверение пула приложений имеет доступ на чтение к физическому пути. Если этот сервер присоединен к домену, а удостоверение пула приложений - NetworkService или LocalSystem, убедитесь, что \ $ имеет доступ на чтение к физическому пути. Затем проверьте эти настройки еще раз.
Когда я попытался просмотреть свое приложение с помощью IIS, время истекло, я ничего не знаю о IIS, кроме исследования, которое я провел в Интернете. Просто ищу пояснения по этому поводу. Спасибо за любую помощь.
- Вы пытаетесь просматривать, используя // localhost / или свой внешний IP-адрес?
- 1 3 года спустя, и у меня тоже такая же проблема. Мой идентификатор пула приложений - это сетевая служба, и я добавил его в группу IIS_IUSRS и убедился, что у этой группы есть права на изменение (чтение, запись, изменение). Я установил локальное имя хоста в своем файле хоста, и когда я проверяю имя хоста, я получаю правильный IP-адрес обратной петли. IIS отвечает на localhost, показывая веб-сайт по умолчанию, но, похоже, он не работает для других сайтов. Все привязки верны и подтверждены.
Я нашел статью Microsoft, в которой говорится, что IUSR должен иметь соответствующие права как для стороны NTFS, так и для сетевой стороны:
Я настраивал tomcat mod_jk и заставил его работать с этими инструкциями.
- В дополнение к ответам о разрешениях пользователей в ответе с наибольшим количеством голосов, это все еще не сработало для меня, и мне также пришлось включить все параметры в разделе Разработка приложений. Я предполагаю, что из-за функции моего приложения, работающего в IIS.
Надеюсь, это кому-то поможет.
В моем случае мне пришлось добавить доступ на чтение для IIS_IUSRS группа.
Читайте также: