🔄
Wordpressを自動更新してセキュリティアップデートをすぐに適用する設定
3行まとめ
- Wordpressを自動更新して安心安全に運用する設定を紹介
- Wordpress自体の自動更新を使うとバックドアを仕掛けられる可能性が高くなるので使いたくない
- この設定で8年ほど運用してる実績
背景
Wordpressは世界で最も使われているしているCMSです。
問題
- Wordpressのプラグインやテーマは開発者が自由にコードを書けるので脆弱性を含みやすい。
- Wordpressの脆弱性を突かれると、OSレベルで乗っ取られる可能性がある。
- Wordpress自体にはプラグインやテーマを自動で更新する機能があるが、php-fpmまたはApacheが動いているユーザによる書き込み権限が必要になるので利用を避けたい。
- PHP自体のセキュリティ脆弱性を突かれたWordpressの書き込み権限があるディレクトリが多すぎて影響が広くなってしまう。
- 私の経験上、Wordpressのテーマやプラグインの脆弱性を突かれた場合はバックドアとなるファイルを設置しようとする傾向が多い。
アプローチ
Wordpressはwpコマンドというコマンドラインでプラグインをインストールしたり、有効化したりする便利なツールがあります。
今回は、wp
コマンドを利用してプラグイン、テーマ、Wordpress本体を自動更新してできるだけ最新のプログラムを使うように設定します。
最新を使い続けることによって不安定なバージョンのプログラムを利用してしまう可能性があります。そこはトレードオフになりますのでサイトをダウンタイム無しで行いたければステージング環境などを用意して最新に更新してからサイトがちゃんと稼働しているかをテストした後に、本番環境に反映するといったワークフローを書くことをおすすめします。
設定
wpコマンドをインストール
基本的には以下のコマンドをコピペするだけで大丈夫です。
% curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
% chmod +x wp-cli.phar
% sudo mv wp-cli.phar /usr/local/bin/wp
動作確認
wpコマンドを実行して実際に更新が行われるかをチェックしてみます。
以下のコマンドを実行するとユーザへの確認無しにファイルが更新されるの注意してください。
% cd /path/to/wordpress
% wp plugin update --all
% wp theme update --all
% wp core update && wp core update-db
cronの設定
あとは上記の更新コマンドが自動で更新されるように設定します。
テンプレートとなるスクリプトをダウンロードします。
% wget https://gist.githubusercontent.com/matsubo/159ba160581ff53fce09/raw/38cb19873444c30984661beaf5ac67c05731227f/wordpress_update.sh
上記のスクリプトは1ホストに複数のWordpressがホスティングされていても対応できるようになっているので適宜Wordpressが置かれているディレクトリを減らしたり増やしたりして調整してください。
#!/bin/zsh
# -------------------------------------
# Usage: % ./wordpress_update.sh
# -------------------------------------
# to be strict syntax checker
set -e
# set low priority
renice -n 19 $$
WPS=(
"/path/to/wordpress1/"
"/path/to/wordpress2/"
)
for i in $WPS
do
echo "Processing: $i"
cd $i
echo " Upgrading plugins."
wp plugin update --all
echo " Upgrading themes."
wp theme update --all
echo " Upgrading Wordpress."
wp core update && wp core update-db
done
自動でスクリプトが実行されるようにcronに登録します。
% crontab -e
1日に1回、21時15分に更新する例です。
15 21 * * * /path/to/wordpress_update.sh
最新のスクリプトは以下で更新しています。
まとめ
- 8年間、10サイトの運用をしていますが問題なく稼働しています。
- この設定により、
wp-content/content
のみをWebサーバの書き込み権限だけ与えるという限定的な設定を行えます。 - Wordpressの管理画面上から手軽にプラグインの削除やインストールができなくなりますが安全性を考えればしょうがないです。
Discussion