Проблема подключения 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, и это сработало!

Другие вопросы по тегам