WordPressを仮想マシン開発環境で構築して、画像をアップロードしたりプラグインを入れようとしたけれどうまくいかなかった…そんなことはありませんか?
プラグインディレクトリの権限は問題なし、Permissionも問題なさそう。それでもできないから0777にしてみた(※)けれど、それもうまくいかない。
そうなったら最後、SELinuxの設定をみてみませんか?
ここでは権限もPermissionも問題ないのに、WordPressのプラグインアップデートや画像のアップロードができないときにチェックする最後の砦、「SELinux」の設定方法などを紹介します。
※0777は公開環境ではダメ、絶対
簡単にWordPressを手軽に構築するならカラフルボックス※広告
カラフルボックスはオールインワンの超快速レンタルサーバー。
まずはWordPressで公開してみたい!という方におすすめです。
SELinuxの設定方法
権限やPermissionは何も問題がないことが前提です。
これらに問題がないことを確認してからSELinuxの現在の設定を確認し、変更します。
権限とPermissionを確認
SELinux云々の前に、こちらを先にみてからです。
大体、所有者をユーザー、グループがapacheになるのではないでしょうか。権限は0705か0755辺り。
状態の確認
コンソールから、SELinuxの設定を確認します。
getenforce
- Enforcing → 有効
- Permissive → 有効だけど、ルール外の動作があったらログに記録するだけで拒否まではしない
- Disable → 無効
となります。たぶんEnforcingになっているのではないでしょうか。
設定を変更する(恒久に)
SELinuxを無効化するには、SELinuxのconfigファイルに無効化する旨を記述します。
/etc/selinux/configを開き、SELINUX=enforcingをコメントアウトし、SELINUX=disabledを追記します。
/etc/selinux/config" 15L, 561C 7,1 全て
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
これで諸々の問題は解決します。
一時無効化の方法
一時無効化版(Permissive)はこちらですが、これだとプラグインインストールの時にFTP情報を聞かれ、入力してもうまくいかないかもしれません(私の環境ではそうでした…)
setenforce 0
SELinuxとは
Linuxのデフォルトで入っているセキュリティシステムで、攻撃者に侵入されてしまったときに、被害を最小限にするための仕組みです。
ただ、色々制御するので、何かと衝突するらしいです。これを無効にして他の仕組みで防御を検討することもあるのだとか…。
本件のプラグインのインストールや画像のアップロードができなかったのは、このSELinuxのルールに反しているため、アクセス拒否されてしまっていたから、と考えられますね。
SELinuxを有効のまま解決したい…が、大変
無効化すればいいといっても、SELinuxはセキュリティ。あった方が良いのは当然でしょう。
だとしたらどのあたりをみていったらいいのか?少し調べたところ、こんな感じでした。
※ただ、最終的にはプラグインの一覧が取得できない問題にあたり、wp-include/plugin-install.phpでcURLエラーが出たところで諦めました。沼です。この辺りはもうインフラのプロに任せたいです。
SELinuxのタイプ
ファイルの書き込みをしたいディレクトリ以下がhttpd_sys_content_tになっていないか。
書き込みする場合はhttpd_sys_rw_content_tにする。
wp-adminとwp-contentをhttpd_sys_rw_content_tにしておくとよさそうです。wp-content以下はu画像のアップロードやテーマ、プラグインがありますし、wp-adminはWordPress本体のアップデートで書き込みが必要になるはず。
外部ネットワークの通信許可
httpd_can_network_connectがoffになっているとhttpdは外部と通信できないようです。
このために外部のアドレス、WordPressのプラグイン一覧や、更新情報が取得できないのかもしれません。
setseboolコマンドで有効にすると通信が許可されるそうです。
getsebool httpd_can_network_connect
httpd_can_network_connect --> off
sudo setsebool -P httpd_can_network_connect_db 1
getsebool httpd_can_network_connect
httpd_can_network_connect --> on
まとめ
WordPressのプラグインのインストールやアップデート、画像のアップロードができないときは
- ディレクトリ権限
- Permission
- SELinux
を確認しましょう。
特にVPSのような、自分でサーバーを立てて行うような環境ではありえるかもしれません。
また、SELinuxはセキュリティ機能なので、特に公開環境では本当に無効(またはPermissive)にして良いのか、他の機能で代替するのか、よく検討しましょう。
※本件は自分のネットワーク内の開発環境で公開されていない場所だったため特別問題ないと判断し、無効にしました。
参考
- SELinux とは – 仕組み、使い方、エラーへの対処 | Red Hat
- 【SELinuxの停止方法】なぜSELinuxを停止する必要があるのか【LPIC・LinuC303】
- Webサーバーがサイトの構成ファイルを上書きできない問題に対応する(SELinuxが原因の場合)|ラボラジアン
- WordPressインストールとSELinuxでハマった話【File not found.】 – ホンモノのエンジニアになりたい
- SELinux で CGI から外部ネットワークへの通信を許可する – snbhsmt_log
簡単にWordPressを手軽に構築するならカラフルボックス※広告
カラフルボックスはオールインワンの超快速レンタルサーバー。
まずはWordPressで公開してみたい!という方におすすめです。