HTTP/PHP 経由でリモート MySQL 接続を許可するにはどうすればよいですか?

HTTP/PHP 経由でリモート MySQL 接続を許可するにはどうすればよいですか?

下記のすべてのサーバーで CentOS 7 を実行しています。

個別のデータベースと Web サーバーをセットアップするために、ローカル開発環境でテストしています。

これらのサーバーは、ローカル エリア ネットワークでブリッジ モードを介して接続された 2 つの VirtualBox インスタンスであり、問​​題なく相互に認識できます。

WEBサーバーからのIP制限のみを使用して、WEBサーバーがDBサーバー上のMySQLに接続できるようにしたいと考えています。

いくつかのディスカッション スレッドを読みましたが、その多くは問題firewallまたはselinux関連しているため、どれも私の問題の解決に役立ちませんでした。

どちらも無効にしているfirewalldので、selinux現時点ではこれらが要因ではありません。

DBサーバーIP: 192.168.1.167 WEBサーバーIP: 192.168.1.168

テストには次のスクリプトを使用しています。http://192.168.1.168/connect.php

<?php
$servername = "192.168.1.167";
$username = "demouser";
$password = "password";

// Create connection
$conn = mysqli_connect($servername, $username, $password);

// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>

Connection failed: Permission denied実行時にエラーが発生します:

  • wget http://192.168.1.168/connect.php192.168.1.168ターミナルコンソール

  • http://192.168.1.168/connect.php私のブラウザウィンドウでも同じエラーが表示されます。

mysql -u demouser -p -h 192.168.1.167(1)しかし、 192.168.1.168(WEBサーバー)からコマンドライン経由で正常に接続できます。

(2) 192.168.1.168(WEBサーバ)の端末コンソールでConnected successfully直接実行した場合も同様php connect.php

SSH 経由のリモート MySQL 接続が機能していること、および PHP MySQL モジュール経由のリモート MySQL 接続が機能していることのみを確認できます。

192.168.1.167(DBサーバー)のアクセス権限は次のとおりです。

+---------------------------------------------------------------------------------------------------------------+
| Grants for demouser@localhost                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demouser'@'localhost' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' |
| GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'localhost'                                                      |
+---------------------------------------------------------------------------------------------------------------+

+-------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]                                                                                   |
+-------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'demouser'@'192.168.1.168' IDENTIFIED BY PASSWORD '*DB17DD535D122AED147A61C30CD5D01FB3BC5433' |
| GRANT ALL PRIVILEGES ON `demodb`.* TO 'demouser'@'192.168.1.168'                                                      |
+-------------------------------------------------------------------------------------------------------------------+

netstat192.168.1.167 では次のように表示されます:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      2892/mysqld         
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1704/master         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1053/sshd 

前述の WEB サーバーから開始されるリクエストに対してのみ、HTTP/PHP 経由のリモート MySQL 接続を許可するにはどうすればよいでしょうか?

答え1

SELinuxそれが接続失敗の原因であると特定できました。

元のスレッドで述べたように、私SELinuxデービッドサーバーからのリモート接続をブロックしていると私は考えていましたウェブサーバ。

接続の問題の原因SELinuxウェブサーバ。

setenforce 0モードに設定するために、一時的に無効にしましたpermissive

すべて正常に動作します。

SELinuxファイアウォールを再度有効にしましたデービッドサーバー。PHPスクリプトを介してリモートデータベース接続を確立することはできます。ウェブサーバ。

問題はウェブ接続を開始するサーバー。

再度有効SELinuxにしましたウェブサーバーで次のコマンドを使用してブール値を設定しSELinuxますウェブサーバ。

setsebool -P httpd_can_network_connect_db 1

現在、私はSELinux両方で活動していますウェブデービッドサーバーはenforcingモードになっており、リモート MySQL 接続は正常に実行されます。

私がフォローしていない他のディスカッション スレッドで読んだ内容は、SELinuxブール値を構成するサーバーについてでした。

このスレッドが、私と同じ問題を抱えている人たちの時間を節約するのに役立てば幸いです。

関連情報