AlmaLinux 10.1 セットアップメモ
Section 5.2 Webサーバー(apache)構築編 EPEL phpMyAdmin
About
EPEL から phpMyAdmin をインストールします。 そのついでに、PHPからDatabaseを使う場合に陥りがちなSELinux関連の設定についてみていきます。
環境は、Section 5.2を行った直後の状態からとなります。
パッケージの確認
リポジトリに登録されているものからパッケージ名とバージョンを指定してインストールすることになります。 まずは、提供されているかどうかを調べます。
[root@localhost ~]# dnf search phpMyAdmin
=========================================== Name Exactly Matched: phpMyAdmin ===========================================
phpMyAdmin.noarch : A web interface for MySQL and MariaDB
[root@localhost ~]#
インストール
バージョンは気にしても仕方がないのでインストールします。
[root@localhost ~]# dnf -y install phpMyAdmin
========================================================================================================================
Package Architecture Version Repository Size
========================================================================================================================
Installing:
phpMyAdmin noarch 5.2.3-1.el10_1 epel 8.4 M
Installing dependencies:
libzip x86_64 1.10.1-5.el10 appstream 68 k
php-pecl-zip x86_64 1.22.3-5.el10 appstream 65 k
php-process x86_64 8.3.26-1.el10_1 appstream 42 k
Transaction Summary
========================================================================================================================
Install 4 Packages
(中略)
Complete!
[root@localhost ~]#
設定変更
インストールすると、ブラウザから localhost/phpmyadmin/ でアクセスできるようになっています。 開発では問題ないと思いますが、設定的には、localhost からのみという制限が入っているので、気になる場合は外しておきます。 本番環境の場合は、IP指定を入れるなどする必要があります。
[root@localhost ~]# cp --preserve=context /etc/httpd/conf.d/phpMyAdmin.conf /etc/httpd/conf.d/phpMyAdmin.conf.org
[root@localhost ~]# cat /etc/httpd/conf.d/phpMyAdmin.conf.org \
| sed -E "/phpMyAdmin\/>/,/Require local/s/Require local/Require all granted/" \
> /etc/httpd/conf.d/phpMyAdmin.conf
[root@localhost ~]# diff -cT /etc/httpd/conf.d/phpMyAdmin.conf.org /etc/httpd/conf.d/phpMyAdmin.conf
*** /etc/httpd/conf.d/phpMyAdmin.conf.org YYYY-mm-dd hh:ii:ss.000000000 +0900
--- /etc/httpd/conf.d/phpMyAdmin.conf YYYY-mm-dd hh:ii:ss.000000000 +0900
***************
*** 11,17 ****
<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
! Require local
</Directory>
<Directory /usr/share/phpMyAdmin/setup/>
--- 11,17 ----
<Directory /usr/share/phpMyAdmin/>
AddDefaultCharset UTF-8
! Require all granted
</Directory>
<Directory /usr/share/phpMyAdmin/setup/>
ここから先は余談。
SELinuxでのアクセス検証
コマンドラインからならDatabaseにアクセスできるのに、ブラウザになったらアクセスできない……という状態を起こして検証していきます。(不要だと思う人は読み飛ばしてください)
検証用スクリプトの作成
コードは PHPのマニュアルにあるサンプルコードを少し変えたものを使用します。
なお、mariaDBに、vagrantユーザとdatabaseがあるという前提です。
[root@localhost ~]# vi /var/www/html/db_test.php
<?php
try {
$dbm = new PDO('mysql:host=127.0.0.1;dbname=vagrant', 'vagrant', 'vagrant');
$dbm = null;
echo 'MariaDB OK';
} catch (PDOException $e) {
print $e->getMessage();
die();
}
echo "\n";
?>
[root@localhost ~]#
これで準備ができました。
ポイントは、host=127.0.0.1 です。localhost にした場合は問題が起きないと思います。
一応、動作確認はしておきましょう
[root@localhost ~]# php /var/www/html/db_test.php
MariaDB OK
[root@localhost ~]
ではブラウザから確認しましょう。おそらく下記のようなメッセージが表示されると思います。
SQLSTATE[HY000] [2002] Permission denied
host=127.0.0.1 を host=localhost にすると問題が解消されます。
エラーについて確認する
コマンドラインから実行して動作していることが確認できているので、SELinuxが理由なことは確定です。
ということで、ログを確認してみます。 SELinuxでの不正アクセスなどのログは、/var/log/audit/audit.logに記録されているので、検索をかけて確認します。
[root@localhost ~]# grep "avc: denied" /var/log/audit/audit.log
type=AVC msg=audit(0000000000.000:000): avc: denied { name_connect } for pid=4078 comm="php-fpm" dest=3306 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:mysqld_port_t:s0 tclass=tcp_socket permissive=0
上記のログを確認すると、scontext=user_u:system_r:httpd_tが、tcontext=system_u:object_r:postgresql_port_tへアクセスしようとして、拒否されているというログになります。
SELinuxが有効でなければポートさえあっていれば動作するのですが、そういう部分にも権限がついて回るという状態です。
なので、これを許可する設定を行っていきます。
なお、grep したときに、Section 5.1の最後、「コンテンツ配置とSELinux」をやっていた場合は、下記のようなログも出てきます。
type=AVC msg=audit(0000000000.000:000): avc: denied { getattr } for pid=1224 comm="httpd" path="/var/www/html/move_file.html" dev="dm-0" ino=34009413 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file permissive=0
これも、同じように読めば、理由がわかってくるかと思います。
許可設定を行う
基本的に、何かしら設定すれば使えるようにOS側で設定されているので、それを変更していきます。
SELinux BooleanやSELinux bool値などで検索すると出てくる設定です。
getseboolコマンドで変更できる項目が確認できるので実行していきます。すべて表示すると大変なのでhttpdサービスに関連するものを探します。
[root@localhost ~]# getsebool -a | grep httpd
httpd_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_connect_ftp --> off
httpd_can_connect_ldap --> off
httpd_can_connect_mythtv --> off
httpd_can_connect_zabbix --> off
httpd_can_manage_courier_spool --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_redis --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> off
httpd_dbus_sssd --> off
httpd_dontaudit_search_dirs --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_graceful_shutdown --> off
httpd_manage_ipa --> off
httpd_mod_auth_ntlm_winbind --> off
httpd_mod_auth_pam --> off
httpd_read_user_content --> off
httpd_run_ipa --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_sys_script_anon_write --> off
httpd_tmp_exec --> off
httpd_tty_comm --> off
httpd_unified --> off
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_opencryptoki --> off
httpd_use_openstack --> off
httpd_use_sasl --> off
httpd_verify_dns --> off
[root@localhost ~]#
この中から関係のありそうな項目を探すと、httpd_can_network_connect_dbというのが値がoffになっているので、接続できないようになっています。この設定を変えてみましょう。
何気に、Webサービスを立ち上げて権限エラーが出たら、おおむねこの設定を変えれば解決するでしょう……おそらく。
ファイルのアップロード機能がある場合は httpd_sys_script_anon_writeをonに、問い合わせフォームからメールを出す場合 httpd_can_sendmail をonにする必要があります。
ということで設定を変更します。
[root@localhost ~]# setsebool -P httpd_can_network_connect_db on
-P オプションをつけないと再起動時にリセットされてしまうので、-Pをつけましょう。実験的にやる場合は-Pをつけずに確認して、その後、永続化するのが正しい手順です。
これで、ラベルが変わったのでブラウザから見てもMariaDB OKが出てくると思います。
SELinuxを無効にした状態で開発して、いざ本番環境でSELinuxを有効にすると、コンテキストだけではなく、この手の問題も出てくるので注意が必要です。