У меня есть этот код PHP, работающий под IIS:
$serverName = "someServer\someServer";
$connectionInfo = array( "Database"=>"SOME_DB");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
if( $conn ) {
echo "Connection established.<br />";
}else{
echo "Connection could not be established.<br />";
die( print_r( sqlsrv_errors(), true));
}
Когда я пытаюсь посетить страницу, я получаю сообщение об ошибке:
[Microsoft] [Собственный клиент SQL Server 10.0] [SQL Server] Ошибка входа для пользователя «NT AUTHORITY \ ANONYMOUS LOGON».
Что сбивает с толку, так как документация здесь говорит «Соединение будет предпринято с использованием аутентификации Windows».
Поток это:
x
Учетная запись Windows на workstation1
посещает этот сайт, размещенный на server1
server1
выполняет вышеуказанный код PHP и пытается извлечь данные из server2
с помощью y
Учетная запись Windows (y
определяется в настройках IIS, в разделе Пулы приложений-> Идентичность)y
имеет доступ к базе данныхПул IIS работает от имени пользователя домена Windows «domainadm», который имеет доступ к SOME_DB
база данных и сервер, на котором он сидит.
Почему он пытается выполнить анонимную аутентификацию и как я могу это исправить, чтобы он работал под пользователем, от имени которого работает пул IIS?
В php.ini:
fastcgi.impersonate = 1;
При проверке раздела «Аутентификация» в IIS у меня есть только варианты «Анонимная аутентификация» или «Олицетворение ASP.NET». Нет проверки подлинности Windows?
Аноним в настоящее время включен, что дает ошибку выше. Если я переключаюсь на ASP.NET, я получаю эту ошибку при посещении страницы:
500 — внутренняя ошибка сервера. Возникла проблема с ресурсом, который вы ищете, и он не может быть отображен. Обнаружен параметр ASP.NET, который не применяется в режиме интегрированного управляемого конвейера.
Мой обновленный web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<httpErrors errorMode="Detailed" />
<validation validateIntegratedModeConfiguration="false"/>
</system.webServer>
<system.web>
<identity impersonate="true" />
<authentication mode="Windows" />
<customErrors mode="Off" />
<compilation debug="true" />
</system.web>
</configuration>
Проблема в том, что IIS отправляет соединения анонимно в SQL, несмотря на то, что вы используете идентификатор AppPool. Чтобы решить эту проблему, вы должны разрешить анонимные подключения с веб-сервера (server1) к SQL-серверу (server2).
На вашем сервере SQL создайте логин для <YourDomain>\server1$
и назначить соответствующие разрешения Some_DB
под Пользовательские сопоставления Вкладка. Например, дать этот аккаунт db_datareader
а также db_datawriter
права, и вы должны быть в состоянии подключиться и успешно завершить операции CRUD. Ради тестирования вы можете просто предоставить этот логин db_owner
права на Some_DB
временно, чтобы убедиться, что разрешения SQL не обсуждаются.
Что касается PHP fastcgi.impersonate
настройка — я полагаю, вы можете установить это значение в 0 / false, так как в этом случае это не имеет значения.
В IIS в разделе проверки подлинности включите проверку подлинности Windows и олицетворение ASP.NET.
Это будут единственные типы аутентификации, которые будут включены в IIS.
В файле web.config вам понадобится следующее (это должно решить проблему, если Windows не появляется):
<system.web>
<identity impersonate="true" />
<authentication mode="Windows" />
Причина для identity.impersonate заключается в том, что он понадобится для олицетворения учетных данных пользователя, вошедшего в систему, через Windows.
После аутентификации пользователя вы можете использовать анонимную аутентификацию для доступа к базе данных.
Например, чтобы доказать, что все вышеперечисленное работает, в вашей базе данных перейдите в раздел Безопасность — вход в систему на SQL Server и добавление входа.
Добавлять:
NT AUTHORITY \ ANONYMOUS LOGON
и назначьте ему роль dboOwner, чтобы убедиться, что он работает.
Выполнение вышеизложенного докажет, что нет никаких других конфликтов со способом, которым настроен IIS — например, неверные записи web.config.
Убедитесь, что пул приложений работает в интегрированном режиме и что у вас есть Integrated Security = true в строке подключения к базе данных.
Затем вы можете назначить другую учетную запись, если это необходимо, например, Ваша учетная запись «domainadm» — служебная учетная запись для запуска пула приложений. Но могут возникнуть проблемы, если пользователь не находится в том же домене, и другие проблемы, которые могут возникнуть из-за того, как настроены сервер / учетные записи, что может привести к сбою. Но если выполнить описанные выше шаги, он запустится, и вы сможете при необходимости диагностировать эти проблемы.
Предложения по проверке подлинности или олицетворению Windows здесь не применимы к вашему делу. Аутентификация Windows будет означать, что клиентский компьютер «x» будет выполнять аутентификацию с вашим внешним сервером «server1», а олицетворение будет использоваться для пересылки этих учетных данных «x» в SQL «server2». Это потребует предоставления каждому пользователю, использующему сайт, доступа к SQL. Вместо этого вам нужен анонимный доступ к вашему сайту, и чтобы сайт мог управлять своим собственным доступом к SQL.
Краткое описание проблемы:
Пользователем по умолчанию для анонимной аутентификации является IUSR, независимо от настроек пула приложений. Когда он пытается подключиться к сетевому ресурсу, он аутентифицируется как «NT AUTHORITY \ ANONYMOUS LOGIN». Очевидно, что это не очень полезно при попытке заблокировать доступ.
Вы можете увидеть это упомянутое здесь: http://www.iis.net/learn/get-started/planning-for-security/understanding-built-in-user-and-group-accounts-in-iis
Примечание. Учетная запись IUSR аналогична LOCALSERVICE в том смысле, что она действует анонимно в сети. Учетные записи NETWORKSERVICE и LOCALSYSTEM могут выступать в качестве идентификатора компьютера, но учетная запись IUSR не может, поскольку для этого потребуется повышение прав пользователя. Если вам нужна анонимная учетная запись, чтобы иметь права в сети, вы должны создать новую учетную запись пользователя и установить имя пользователя и пароль вручную, как вы делали это в прошлом для анонимной аутентификации.
Дополнительную информацию можно найти здесь: http://www.iis.net/learn/get-started/whats-new-in-iis-7/changes-in-security-between-iis-60-and-iis-7-and-above
Решение:
Перейдите в раздел «Аутентификация», выберите «Анонимная аутентификация», нажмите «Изменить» и измените значение с «Определенный пользователь: IUSR» на «Идентификатор пула приложений». Это должно заставить сайт использовать учетную запись, установленную для пула приложений.
После этого, если вы используете настройку пула приложений по умолчанию «Идентификация пула приложений», ваше приложение попытается авторизоваться с SQL под именем DOMAIN \ MACHINENAME.