GSSAPI-Auth с PHP для MariaDB (Windows)

В настоящее время я работаю над единым входом на сервер базы данных в чистой среде домена Windows.

И поскольку серверы MySQL Enterprise и MSSQL в настоящее время не подходят, выбор остановился на MariaDB с подключаемым модулем GSSAPI.

Вот что у меня есть на данный момент:

Сервер:

Windows 7 x64 член MYDOMAIN

МарияДБ 10.2.14 x64

Apache2 2.4.33 x64 VC11 + mod_authnz_sspi + PHP 5.6.35 + mod_fcgid

Драйвер ODBC для MariaDB x64

HeidiSQL (SQL-клиент поставляется с установщиком MariaDB)

FCGID-Config выглядит следующим образом («A:» — это не флоппи-дисковод на моей машине, а место, куда я на самом деле поместил свой Apache2):

<IfModule !fcgid_module>
LoadModule fcgid_module modules/mod_fcgid.so

FcgidIOTimeout 64
FcgidConnectTimeout 16
FcgidMaxRequestsPerProcess 200
FcgidMaxProcesses 500
FcgidMaxRequestLen 8131072

FcgidInitialEnv PHPRC "A:/php"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 200
FcgidWrapper "A:/php/php-cgi.exe" .php
</IfModule>

Directory-Config выглядит следующим образом:

<Directory "${SRVROOT}/htdocs">
Options Indexes FollowSymLinks
AllowOverride None

AuthName "MYSERVER"
AuthType SSPI
SSPIAuth On
SSPIAuthoritative On
SSPIOfferBasic On
SSPIOfferSSPI On

<RequireAll>
    <RequireAny>
        Require sspi-group mygroup
    </RequireAny>
    <RequireNone>
        Require user "ANONYMOUS LOGON"
    </RequireNone>
</RequireAll>

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

<FilesMatch \.php>
    AddHandler fcgid-script .php
</FilesMatch>

Options +ExecCGI
</Directory>

С php.ini ничего особенного не делалось, просто взял пример php.ini-development (поставляется в zip-пакете PHP) и активировал расширения php_mysql, php_mysqli, php_mbstring и php_ldap.

Моя текущая база данных MariaDB my.ini выглядит следующим образом:

[mysqld]
datadir=M:/data
port=3306

key_buffer_size = 384M
max_allowed_packet = 512M
table_open_cache = 512

read_buffer_size = 256M
read_rnd_buffer_size = 128M
sort_buffer_size = 512M
query_cache_size = 32M
join_buffer_size = 128M

default-storage-engine = INNODB
innodb-page-size = 65536
innodb_buffer_pool_size = 4G
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_thread_concurrency = 16
innodb_log_buffer_size = 8M
innodb_log_file_size = 256M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120

character-set-server=utf8

thread_concurrency = 8
thread_cache_size = 8

[client]
port = 3306
plugin-dir = M:/lib/plugin

[mysqldump]
quick
max_allowed_packet = 512M

[mysql]
no-auto-rehash
safe-updates

Клиент:

Windows 10 x64 член MYDOMAIN

Интернет Эксплорер 11

MySQL Workbench 6.0 CE (6.0.7.11215)

После всех настроек я подключаю VIA HeidiSQL (или любой SQL-клиент) к серверу MariaDB с учетной записью root и создаю фактического пользователя, как описано здесь https://mariadb.com/kb/en/library/authentication-plugin-gssapi/ :

CREATE USER myuser IDENTIFIED VIA gssapi AS 'myuser@MYDOMAIN';

Теперь при подключении к HeidiSQL или после предоставления MySQL Workbench с auth_gssapi_client.dll (и пока процесс выполняется от имени пользователя myuser) у меня нет проблем с подключением к серверу MariaDB.

Прежде чем пытаться подключиться к PHP, я взглянул на phpinfo(); где все выглядит так, как и ожидалось, с переменными $_SERVER REMOTE_USER, PHP_AUTH_USER и PHP_AUTH_PW. Вот мой index.php:

<?php
    //phpinfo(); exit;
    $m = mysql_connect("localhost", $_SERVER["PHP_AUTH_USER"]);
    $mi = mysqli_connect("localhost", $_SERVER["PHP_AUTH_USER"]);
    $c = odbc_connect("MariaDB", $_SERVER["PHP_AUTH_USER"], "");
?>

Как вы можете видеть, в какой-то момент я настроил SystemDSN с коннектором ODBC MariaDB и назвал его MariaDB, который указывает на каталог плагинов MariaDB.

С этим я мог бы хотя бы попытаться заставить его работать вообще и после этого беспокоиться об этом:

Warning: mysql_connect(): The server requested authentication method unknown to the client [auth_gssapi_client] in A:\htdocs\index.php on line 3
Warning: mysql_connect(): The server requested authentication method unknown to the client in A:\htdocs\index.php on line 3
Warning: mysqli_connect(): The server requested authentication method unknown to the client [auth_gssapi_client] in A:\htdocs\index.php on line 4
Warning: mysqli_connect(): (HY000/2054): The server requested authentication method unknown to the client in A:\htdocs\index.php on line 4

Я не смог найти никакого решения о том, как указать расширения php для mysql или mysqli (или, как я также тестировал с тем же результатом, pdo_mysql) на плагин auth_gssapi_client.dll от MariaDB. Поэтому, если бы кто-нибудь мог указать мне там, это также было бы оценено.

Но реальная проблема, с которой я также (весьма вероятно) столкнулся бы с mysql и mysqli, является результатом соединения odbc...:

Warning: odbc_connect(): SQL error: [ma-3.0.3]GSSAPI name mismatch, requested 'myuser@MYDOMAIN', actual name 'myserver$@MYDOMAIN', SQL state 28000 in SQLConnect in A:\htdocs\index.php on line 5

Сам процесс работает как локальная система, к сожалению, GSSAPI интересует только пользователя, запускающего процесс, а не аутентифицированного пользователя.

Я ищу в Интернете и пробую что-то уже около недели, чтобы заставить это работать, хотя до сих пор без какого-либо рабочего результата (или каких-либо оставшихся идей о том, что попробовать дальше в этом отношении).

Так что, если у кого-то есть идеи о том, как заставить это работать, это было бы здорово.

Greetz TheSkyGuy


person TheSkyGuy    schedule 27.04.2018    source источник


Ответы (1)


Предупреждение: odbc_connect(): ошибка SQL: [ma-3.0.3] несоответствие имени GSSAPI, запрошено «myuser@MYDOMAIN», фактическое имя «myserver$@MYDOMAIN», состояние SQL 28000 в SQLConnect в A:\htdocs\index.php на линии 5

это означает, что ваше приложение (apache?) соединяется с учетной записью компьютера, возможно, оно работает как пользователь NetworkService или что-то в этом роде. Если вы можете запустить его под учетными данными пользователя домена «myuser», тогда он подключится.

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

person Vladislav Vaintroub    schedule 27.04.2018
comment
Да, он работает как пользователь NetworkService/LocalSystem. Моя цель заключалась в том, чтобы каждый пользователь домена мог запускать соединение с БД от своего имени, но я мог бы просто использовать стандартную функцию пользовательского/корневого доступа для моих веб-приложений, поскольку я в значительной степени предполагаю, что то, что я хочу сделать, технически невозможно с виндовым сервером... - person TheSkyGuy; 02.05.2018
comment
Если Apache каким-то образом поддерживает олицетворение Windows, то это должно быть возможно. Но я не знаю, так ли это. IIS делает или делал в прошлом (в наши дни я больше не слежу за веб-программированием) - person Vladislav Vaintroub; 02.05.2018
comment
Что ж, после еще одного дня поиска в Интернете я теперь почти уверен, что Apache не поддерживает олицетворение Windows. Кажется, есть некоторые решения для Linux, хотя, насколько я понимаю, ничего из того, что работало бы под Windows. Для большинства моих веб-приложений это не проблема, я просто вернусь к функции пользовательского/корневого доступа. Хотя сейчас мне нужно попробовать IIS, так как он мне определенно нужен для phpMyAdmin. - person TheSkyGuy; 03.05.2018