【補足編 〜 KUSANAGI での設定】「ワードプレスをワンクリックで爆速お引っ越し!」その4 【 All-in-One WP Migration 】

前回までの三部作で終わりだったはずなのにまだやってる(笑)

KUSANAGI でのディレクトリの権限変更

自分で「ハマることがあるよ」って書いてたのにまんまと KUSANAGI の設定でハマった(笑)ので、自分の備忘録も兼ねてメモしておく。

KUSANAGI が入っているサーバーで「 All-in-One WP Migration 」を使ってデータをエクスポートしようとすると「 wp-content/plugins/all-in-one-wp-migration/storage の読み取り・書き込み権限が無い」って怒られるので、この権限(パーミッション)を変更する必要がある。

そして、エクスポートだけではなくインポートすることも考えると、権限を変更する必要があるディレクトリは『2ヶ所』ある。

ひとつは先ほどの「 wp-content/plugins/all-in-one-wp-migration/storage 」、もうひとつは「 wp-content/ai1wm-backups 」だ。
wp-content/ai1wm-backups 」はその名のとおり All-in-One WP Migration で取得したバックアップデータを保存するディレクトリで、「 wp-content/plugins/all-in-one-wp-migration/storage 」はデータをエクスポートやインポートする際にプラグインが一時的にデータを保存しておくディレクトリ(だと思われる)。

All-in-One WP Migration を利用する場合、この双方のディレクトリの権限を変更しておく必要がある。

中には「 wp-content 以下の権限を〜 」と書いてあるブログ記事もあるようだが、これはやってはいけない。そもそもユーザーが kusanagi ユーザーに設定されている理由は、Nginx や Apache が直接ファイルを編集できないようにするためだからだ。KUSANAGI の中の人に聞いてみたところ、過去に発生しているプラグインやテーマの脆弱性を突いた攻撃によって、WordPress のコアを含むあらゆる PHP ファイルが書き換えられてしまうような状況を無効化するためにそのような設定にしている、との返答をいただいた。
ちなみに今回、この記事を書くにあたっていくつかの質問と対応方法を「中の人」に聞いているが、これは KUSANAGI の公式見解ではなく、あくまでも今回の僕からの質問に対する「中の人の個人的見解」と捉えていただければ幸いだ。これらの方法を推奨するわけではなく、「それぞれの責任において」実際に動作させるための Tips を教えていただいた、というわけだ。

ディレクトリのアクセス権限(パーミッション)だけを書き換えればいいのか問題

例えば、一般的にディレクトリの権限を変更するには「 FTP ソフトで接続してディレクトリ以下の権限を変更する方法」がある。

ちょっとググると、『当初はディレクトリの権限が「755」などになっているので、それを「707」とか「777」とかに変更する』、というような方法がよく紹介されている。

しかし、だ。

『707』とか『777』とか言うのはそれぞれ「所有者」「所有グループ」「その他」のユーザーにどのような権限があるか、を示したもので、ここの数字「7」はそれぞれのユーザーが「読み取り」「書き込み」「実行」の権限すべてが可能、ということを表している。

とすると、『707』とか『777』の場合は『「その他のユーザー」でも読み取り・書き込み・実行すべて可能』な状態にある、ということであり、それってセキュリティ的にどうなの、ということなのだ。これについても聞いてみたところ、『パーミッションの変更の場合、他に権限のないユーザーでも編集を可能にしてしまうことを意味するので、通常はユーザー変更をすると思う』ということだった。

ともあれ、ここではまず『ユーザー/グループ(=所有者)の変更』の方法を紹介する。
具体的には「 PHP の実行権限( httpd:www )と KUSANAGI ( kusanagi:kusanagi )のユーザー/グループが違うので怒られるのでそこを変更する、ということになる。

ユーザー/グループの変更

ちなみに「ユーザー/グループの変更」は linux コマンドで言うと「 chown ( =change owner ) 」で「ファイルやディレクトリの所有者を変更する」ことで、前述したパーミッションの変更は「 chmod ( =change mode ) 」で「ファイルやディレクトリのアクセス権(パーミッション)を変更する」ことである。

「ユーザー/グループの変更」は root 権限でないとできないので、ターミナルから root 権限で SSH 接続をする必要がある。

この場合、サーバーに SSH で接続してから

$ chown -R httpd:www /path/to/wp-content/ai1wm-backups

もひとつ

$ chown -R httpd:www /path/to/wp-content/plugins/all-in-one-wp-migration/storage

とすればよい。

どちらももともとはユーザー・グループともに kusanagi:kusanagi になっているが、それだと PHP からの操作(=プラグインからの操作)をする権限がないので、それぞれ PHP の実行権限を持つ httpd:www に書き換えている。

【2019/12/4 追記】

『「ユーザー/グループの変更」は root 権限でないとできない』と書いたが、「グループの変更」だけであれば root 権限でなくとも変更可能。つまり『自分自身(ユーザー)は変更できないが、グループだけなら自分でも変更可能』だ(とのこと)。

なので、単純にディレクトリに PHP の実行権限を与えるだけであれば kusanagi:www とすればいい、ということになる。それならば root 権限がないサーバーであっても PHP の実行権限が与えられるので無事に KUSANAGIAll-in-One WP Migration が動かせる。

ちなみにグループの変更のコマンドは chgrp になるので、この場合は$ chgrp -R www /path/to/wp-content/ai1wm-backups のようになる。

【2020/2/6 さらに追記】

と書いたんだけど、これでうまくいくときといかない時がある…?なんかの気の迷いだったか…(泣

/path/to/wp-content/plugins/all-in-one-wp-migration/storage のディレクトリの権限が kusanagi:www だと「ファイルを作れないよー」と怒られたので、結局 httpd:www として無事操作できるようになった。

情報が錯綜してしまい申し訳ありませんでした。

これについても KUSANAGI の中の人に「実際のところどうなの?」という話を聞いてみた。すると、『 Nginx や Apache が自身で作成したファイルは所有者が違うので、Nginx や Apache が操作する可能性のあるディレクトリのみ所有者を変更することは可能だが、プラグインディレクトリを丸ごと変更してしまうと今度は kusanagi ユーザーでアップデートなどができなくなる可能性があるので非推奨』であるとのこと。なるほど。

ターミナルから操作する人にはわざわざ説明するまでもないとは思うが、ちょっとだけ補足しておくと

-R

のオプションは「ディレクトリ配下のファイル、フォルダのパーミッションもすべて書き換える」オプションで、

/path/to

にはそれぞれ自分の環境に合わせてサーバーの root からの path を記述する必要がある。もちろんこれは例えばターミナルで /path/to/wp-content まで移動して $ chown -R httpd:www ai1wm-backups とかでもOK。

「 uploads 」ディレクトリのときは?

プラグインによっては uploads ディレクトリに新たにディレクトリを作成して、その中に生成したファイルを保存するようなものもある。

KUSANAGI の元々の設定では、そもそも uploads ディレクトリは Nginx や Apache が操作できるようになっていて、更に PHP などの実行権限が働かないように設定されている、とのこと。これは WordPress の画像アップロード機能を悪用するような過去に発生している脆弱性(例えばバックドアなどを仕込む、とか)に対応するためなので、もしもプラグインによって新たにディレクトリが作成された場合、元々の設定のままではそのディレクトリがプラグインから操作できない、ということが起こりうる。
その場合は、プラグインが作成したそのディレクトリだけ所有者を変更するのがよいということになる。

おまけだけど必須かもしれない設定

もう KUSANAGI の設定マニュアルみたいになってきた(笑)が、管理画面からプラグインとかテーマのアップデートをかけようとすると毎回 FTP ユーザやパスワードを聞いてきて面倒、という場合は wp-config.php

define( 'FTP_HOST', '{{hostname:port}}' );
define( 'FTP_USER', '{{username}}' );
define( 'FTP_PASS', '{{password}}' );
define( 'FTP_SSL', true );

のような記述を追記しておくと、そこの情報を読み取って接続されるので毎回接続情報を聞かれることもなくなる。

wp-config.php が公開領域(一般的なレンタルサーバーでいうところの public_html とか www などの直下 )に置いてある場合に FTP の接続情報をそこに記述してしまうのはセキュリティの観点からおすすめできないが、 KUSANAGI の場合は wp-config.php を公開領域の上のディレクトリに設置するよう指示されるので、そのようにしておけばひとまずは安心だろう。

ただし、この wp-config.php ファイルを移動できるのは『WordPress インストール (wp-includes のある場所) のひとつ上のディレクトリ』であることに注意が必要。つまり、WordPress をサブディレクトリ(よくあるケースでは example.com/wp とか example.com/wordpress とか)にインストールしている場合は「ひとつ上のディレクトリ」はドメインの root なので、仮に移動したとしても、移動した先も結局公開領域になってしまっている点は気をつけなくてはいけない。

いずれの場合であっても、 wp-config.php のパーミッションは400(もしくは440)に変更しておくのがよいだろう。

参照: wp-config.php を安全にする

KUSASNAGI の情報はまずどこを見ればいいの?

僕が web の仕事を始めるにあたって、最初に教わったのは「まずは公式のドキュメントを読め、話はそれからだ」ということ(笑)

FAQについては以下にまとまっている。

FAQ – KUSANAGI

また、フォーラムでの質問には開発者からの回答もつけられているので参考になるだろう。

Forums | KUSANAGIユーザーグループ

KUSANAGI 自体もオープンソースとして開発されているので、「デフォルトでこういう設定になっていたほうがいい」などの提案があればフォーラムなどを使って報告すれば開発陣も喜ぶし、実際にバグ報告はフォーラムでもよくある、とのこと。
オープンソースの開発に参加するチャンスと考えれば、積極的に参加していくのもいいのではないだろうか。