php - 使用 PHP 到 MariaDB 的 GSSAPI-Auth (Windows)

标签 php mysql mariadb gssapi

我目前正在干净的 Windows 域环境中单点登录到数据库服务器。

由于 MySQL Enterprise 和 MSSQL 服务器目前无法选择,因此只能选择带有 GSSAPI 插件的 MariaDB。

这就是我目前拥有的:

  • 服务器:

  • MYDOMAIN 的 Windows 7 x64 成员
  • MariaDB 10.2.14 x64
  • Apache2 2.4.33 x64 VC11 + mod_authnz_sspi + PHP 5.6.35 + mod_fcgid
  • MariaDB ODBC 驱动程序 x64
  • HeidiSQL(与 MariaDB 安装程序一起提供的 SQL 客户端)

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 "${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 示例(在 PHP zip 包中提供)并启用了 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
  • 客户端:

  • MYDOMAIN 的 Windows 10 x64 成员
  • Internet Explorer 11
  • MySQL 工作台 6.0 CE (6.0.7.11215)

完成所有设置后,我使用 root 帐户将 VIA HeidiSQL(或任何 SQL 客户端)连接到 MariaDB 服务器,并按照此处所述创建实际用户 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-Server。

在尝试连接 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"], "");
?>

正如您可能会看到的那样,我使用 MariaDB ODBC 连接器设置了一个 SystemDSN,并将其命名为 MariaDB,它指向 MariaDBs 插件目录。

有了这个,我至少可以尝试让它正常工作,然后担心这些:

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

我找不到任何关于如何将 mysql 或 mysqli 的 php 扩展(或者我也使用相同结果 pdo_mysql 进行测试)指向 MariaDB 的 auth_gssapi_client.dll 插件的解决方案。 因此,如果有人能指出我那里,我也将不胜感激。

但真正的问题,我也(很可能)在 mysql 和 mysqli 中遇到,是 odbc connect ...的结果:

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 只对运行进程的用户感兴趣,而不对经过身份验证的用户感兴趣。

我正在互联网上搜索并尝试了大约一周的时间来使其正常工作,尽管仍然没有任何有效结果(或者对于下一步在这方面尝试什么还有任何剩余的想法)。

因此,如果有人知道如何实现这一点,那就太好了。

最佳答案

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

这意味着您的应用程序(apache?)与计算机帐户连接,也许它作为 NetworkService 用户运行,或者类似的用户。如果您可以在域用户“myuser”凭据下运行它,那么它将连接。

或者,您可以创建与机器帐户对应的 MariaDB 用户帐户,并使用它进行连接。

关于php - 使用 PHP 到 MariaDB 的 GSSAPI-Auth (Windows),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50061026/

相关文章:

除了最后一个,每个都用逗号分隔符的 php

mysql - 将复杂的 count() 查询结果插入表中

MySQL 触发器无法正常工作

php - PDO版本属性从何而来?

database - InnoDB : Error: space header page consists of zero bytes in data file ./ibdata1

php - 如何在 php 中更改单元测试日期函数的当前时间

php - Youtube Data API v3 - 禁用播放列表控件

mysql - 当列数据发生变化时如何获取行

mysql - Azure Mariadb TX 2.0 连接不起作用

php - PHP cron 作业期间 mysqldump 的 MySQL 重新加载权限 : Use MySQL admin account or create unique user? 安全性?