Проблема подключения Linux Apache+PHP к MS SQL Server с использованием WindowsAuth / Kerberos ("Нет доступных учетных данных Kerberos")
Следующая настройка: у меня есть Linux (Debian) машина в качестве веб-сервера (apache) и MS SQL Server в Windows. Кроме того, я не могу получить пользователя SQL для этого, только аутентификация через AD/Windows Auth.
Я использую Microsoft ODBC Driver и расширение sqlsrv, которое я установил, следуя инструкциям Microsoft.
я бегу kinit
с основным именем и паролем успешно. Теперь при использовании Windows-Auth соединение с MSSQL-сервером работает отлично sqlcmd
или даже при использовании PHP в интерактивном режиме (php -a
) с использованием sqlsrv_connect, но когда я пытаюсь запустить простое примерное соединение из php-файла через Apache, оно не работает. Я получаю сообщение об ошибке, подобное этому:
Array ( [0] => Array ( [0] => HY000 [SQLSTATE] => HY000 [1] => 851968 [code] => 851968 [2] => [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_33) [message] => [Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available (default cache: FILE:/tmp/krb5cc_33) ) [1] => Array ( [0] => HY000 [SQLSTATE] => HY000 [1] => 851968 [code] => 851968 [2] => [Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context [message] => [Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context ) )
Я знаю, что добавленный кеш _XX обозначает UID, поэтому, подумав, что это может быть проблемой, я уже экспериментировал с другим пользователем, запрашивающим билет и еще много чего, но я не смог заставить его работать.
Я также попытался использовать unixODBC и определить DSN. Он работает при тестировании с isql
и используя odbc_connect
в интерактивном режиме php (также с python, использующим pyodbc), но не со страницы php.
У кого-нибудь есть идеи о том, что мне не хватает? Это может быть довольно очевидно, но я довольно новичок в этой теме, и не так уж много можно найти в отношении доступа с компьютера под управлением Linux к серверу MS SQL на базе Windows без дополнительного пользователя SQL. Заранее спасибо за помощь!
3 ответа
Я нашел ответ сам, мог бы придумать это раньше, но я оставлю это здесь на случай, если кто-то еще наткнется на эту проблему:
Я уже думал, что это имеет какое-то отношение к правам / разрешениям доступа, поскольку это в основном работало везде, кроме Apache, но я не мог понять почему, пока не выяснил, что это вызвано systemd:
Systemd имеет функцию, предотвращающую доступ сервисов /tmp
называется SecureTmp. Отключение этой функции для Apache, как описано здесь для тестирования, решило проблему. Теперь я посмотрю, как я могу сделать это по-другому, так как я не хочу оставлять эту функцию отключенной. Надеюсь, это кому-нибудь пригодится:-)
У меня была аналогичная проблема, и она также работала при тестировании с sqlcmd
а также php -a
. Однако в моем сообщении об ошибке не было файла кеша по умолчанию, как показано выше:
Array
(
[0] => Array
(
[0] => HY000
[SQLSTATE] => HY000
[1] => 851968
[code] => 851968
[2] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available
[message] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]SSPI Provider: No Kerberos credentials available
)
[1] => Array
(
[0] => HY000
[SQLSTATE] => HY000
[1] => 851968
[code] => 851968
[2] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context
[message] => [unixODBC][Microsoft][ODBC Driver 17 for SQL Server]Cannot generate SSPI context
)
)
Решением было добавить переменную среды, которая устанавливает KRB5CCNAME в путь к кешу учетных данных. Если вы используете PHP-FPM, отредактируйте его соответствующим образом и добавьте в файл конфигурации пула:
env[KRB5CCNAME] = FILE:/tmp/krb5cc_UID
В качестве альтернативы установите default_ccache_name
собственность в /etc/krb5.conf
:
[libdefaults]
default_ccache_name = FILE:/tmp/krb5cc_%{uid}
Я решил эту проблему с помощью пользователя и пароля внутри файла конфигурации, который в моем случае был .env в приложении Laravel. Я создал пользователя в базе данных MSSql, и это сработало!