質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SELinux

SELinuxmとは、セキュリティに関するLinuxカーネルの制御機能。Linuxディストリビューションではありません。強制アクセス制御機能を付け加えるモジュールの名称で、米国家安全保障局 (NSA)が中心となり開発しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

2回答

453閲覧

phpからmariadbにログインできない

fhiro_tokio

総合スコア66

SELinux

SELinuxmとは、セキュリティに関するLinuxカーネルの制御機能。Linuxディストリビューションではありません。強制アクセス制御機能を付け加えるモジュールの名称で、米国家安全保障局 (NSA)が中心となり開発しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2018/11/02 09:06

編集2018/11/06 07:28

以下のtest.php にブラウザーからアクセスすると、ログイン失敗になります。
setenforce 0 にすると、ログインできるようになります。

なので、SELinux の設定だと思うのですが、どのような設定をすればいいのでしょうか。

同じ設定をしている他のサーバーがあって、そちらはアクセスできています。
そこで、getsebool -a でお互いのサーバーの比較をしたところ
違いは、httpd_can_network_connect と httpd_can_network_connect_db が off/on の違いのみで後は同じでした。この違いは、アドバイスを頂き設定変更した部分で、ログインできるサーバーは、off、ログインできないサーバーは、on になっています。

ls -Z /dev/vda1 で、アクセスできるサーバーとできないサーバーを比較しましたが、全く同じでした。

アクセスできているサーバーアクセスできないサーバー
brw-rw----. root disk system_u:object_r:fixed_disk_device_t:s0 /dev/vda1brw-rw----. root disk system_u:object_r:fixed_disk_device_t:s0 /dev/vda1

ls -Z /var/lib/mysql で、アクセスできるサーバーとできないサーバーを比較したら、結果が違いました。

アクセスできているサーバーアクセスできないサーバー
lrwxrwxrwx. root root unconfined_u:object_r:var_lib_t:s0 /var/lib/mysql -> /mnt/data01/mariadblrwxrwxrwx. root root system_u:object_r:mysqld_db_t:s0 /var/lib/mysql -> /mnt/data01/mariadb

上記、ユーザーとタイプがアクセスできているサーバーと違うので、以下、chcon をしてみたが、ユーザーとタイプは変更できなかった。
chcon -u unconfined_u -t var_lib_t /var/lib/mysql
restorecon -R /var/lib/mysql

【test.php】

<html> <head><title>php db access test</title></head> <body> <?php $link = mysqli_connect('localhost','user','pwd'); if (!$link) { die('ログイン失敗'.mysqli_error()); } print('<p>ログイン成功</p>'); $db_selected = mysqli_select_db($link,'sample_request'); if (!$db_selected){ die('データベース接続失敗'.mysqli_error()); } print('<p>データベース接続成功</p>'); $close_flag = mysqli_close($link); if ($close_flag){ print('<p>切断</p>'); } ?> </body> </html>

【audit.log の denied】
type=AVC msg=audit(1541151350.065:175): avc: denied { read } for pid=1871 comm="httpd" name="mysql" dev="vda1" ino=159168 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:mysqld_db_t:s0 tclass=lnk_file

【DB】
mariadb 5.5

【OS】
CentOS Linux release 7.5.1804 (Core)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukky1201

2018/11/02 09:35

audio.logに拒否されたログがあると思いますので追記してください。「cat /var/log/audit/audit.log | grep denied」とdeniedをキーワードに抽出するとよいと思います
yukky1201

2018/11/05 02:49

「ls -Z /dev/vda1 で、アクセスできるサーバーとできないサーバーを比較しましたが、全く同じでした。」という表現ではなく、結果をそのまま貼っていただかないと判断できませんので情報提示するようにお願いします。また、今回mysql(mariaDB)関連ですので/var/lib/mysqlを対象にした場合のコマンド結果があるとよいかもしれません
yukky1201

2018/11/06 01:45

違いがあることがわかったので、chconコマンドで適宜そろえてみたらいかがでしょう。ちなみに/var/lib/mysql の参照結果は逆だったりしませんか。というのも当方の環境でls -ldZ /var/lib/mysqlすると、drwxr-x--x. mysql mysql system_u:object_r:mysqld_db_t:s0 /var/lib/mysqlとなりました。
fhiro_tokio

2018/11/06 04:44

アクセス出来ないほうが、mysql mysql system_u:object_r:mysqld_db_t:s0 /var/lib/mysql -> /mnt/data01/mariadb になります。
yukky1201

2018/11/06 04:47

今更ながら過去の質問「selinux を有効にした状態で、mariadb を起動させたい」を拝見しました。/var/lib/mysqlは使用していないのでしょうか?そうであれば、あらかじめ前提条件として質問時に記載いただくか、せめて前回修正依頼時のときにその旨を伝えて頂きたかったです。適切な環境提示がなければ問題解決はできません。SELINUXにおける観点は提示したつもりですので、環境にあわせて対応なさってください。場所を変えているならば/var/lib/mysqlの確認は時間の無駄でした。
fhiro_tokio

2018/11/06 04:59

lrwxrwxrwx. 1 mysql mysql 19 10月 18 19:01 mysql -> /mnt/data01/mariadb のようにシンボリックリンクさせています
taka-saan

2018/11/07 03:01

げっ!本当だ。過去質問あるじゃん、先に教えてよ…(泣)過去質問読みましたが、「/etc/my.cnf で datadir=/mnt/data01/mariadb, socket=/mnt/data01/mariadb/mysql.sock に変更してみてください。」は結局やったのかやってないのか知りたいですね。それによって対処に影響があります。
fhiro_tokio

2018/11/07 05:35

my.cnf は修正していました。
guest

回答2

0

SELinuxを完全無効にせずに、そこだけ無効にするにはこうです。

setsebool -P httpd_can_network_connect 1

参考:
SELinuxによるファイル制限+MySQLアクセスエラー

「SELinuxのせいで動かない」撲滅ガイド

理由がわかれば怖くない!SELinux とのつきあい方

では、
setsebool -P httpd_can_network_connect_db on
ではいかがでしょうか?
===
find / -inum 159168で探すか、
ls -i /var/lib/mysql/mysql.sockでi-node番号がわかります。
もしdeniedされてるログのinoと一致してたら、そのファイルが直接原因です。

Yesであれば
回避するため試しにunixドメインソケットを使わない接続方法で試してみてください。
mysqli_connect('127.0.0.1','user','pwd');

(また別の理由でdeniedされるかもしれませんが。)

投稿2018/11/02 09:11

編集2018/11/05 07:14
taka-saan

総合スコア665

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fhiro_tokio

2018/11/02 09:15

setsebool -P httpd_can_network_connect 1 を実行しましたが、状況は変わりませんでした。
taka-saan

2018/11/02 09:24

それでもダメな場合は、OSのバージョンを教えていただけますか。
fhiro_tokio

2018/11/02 09:34

だめでした。OSは、以下です CentOS Linux release 7.5.1804 (Core)
taka-saan

2018/11/02 09:41

yukky1201 さんのご依頼を参考に、ログの情報を質問文に追記願います。
taka-saan

2018/11/02 11:15

find コマンドで inodeが 159168 のファイルを探し、ls -lZ して「動いているほかのサーバ」のそれと比較してみると何かわかるかもしれません。
taka-saan

2018/11/05 03:00

おそらく inode番号=159168 は /dev/vda1 ではなく、mysql.sock なのではないでしょうか。どうやってご確認されましたでしょうか。
taka-saan

2018/11/05 04:03

あと、phpの実行時のwarningが出ていませんか? /var/log/httpd/error_log に 「PHP Warning: mysqli_connect(): (HY000/2002): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) in」こんな感じで。
fhiro_tokio

2018/11/06 04:43

find / -inum 159168 で探すと、/var/lib/mysql になります。
fhiro_tokio

2018/11/06 04:50 編集

error_log には PHP Warning: mysqli_connect(): (HY000/2002):Permission denied in /var/www/html/test/Test.php on line 24 となっています。 24行目は「$link = mysqli_connect('localhost','ユーザー','パスワード', 'sample_request');」です。
taka-saan

2018/11/07 02:47 編集

「chconで変更できなかった」理由は、 /var/lib/mysql は質問者さんの環境ではシンボリックリンクになっており、 chconはシンボリックリンクに対して操作を行うとリンクファイルそのものではなく リンクの参照先に対して操作を行うからです。 まずリンク先である ls -laZ /mnt/data01/mariadb の比較を教えてください。 シンボリックリンクそのものの変更は chcon -h -u unconfined_u -t var_lib_t /var/lib/mysql でできるはずです。 それと、mysqli_connect('127.0.0.1','user','pwd'); は試されましたか?
fhiro_tokio

2018/11/07 05:34

iNode が違っていたので、mysqli_connect('127.0.0.1','user','pwd'); は、試しませんでした。
guest

0

自己解決

以下の方法でうまくいきました。

semanage fcontext -a -t var_lib_t /var/lib/mysql
restorecon -v /var/lib/mysql

投稿2018/11/07 05:32

fhiro_tokio

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問