1035 文字
5 分

WordPressをcronで自動更新。1日おきに最新に!

2015-02-27
2023-05-18

概要#

WordPressは世界で最も使われているCMSで、それゆえに攻撃対象にもなりやすい。プラグインやテーマは開発者が自由にコードを書けるので脆弱性を含みやすく、脆弱性を突かれるとOSレベルで乗っ取られる可能性もある。

実際に自分のサイトもクラックされた経験がある。

  • WordPressのプラグインか何かの脆弱性を突かれて、WordPressがクラックされてしまった
    • バックドアのファイルをあちこちに置かれた。
    • アクセスログからの進入経路は特定できなかった。
  • もともと、WordPress管理画面からプラグインを簡単に更新できるように、WordPressのディレクトリ自体をwritableにして運用していた。
    • プラグインのインストールや、WordPress自体の更新をWebから出来るので便利だが、クラックされたら、バックドアを仕掛けられまくって大変!

なぜWordPress自体の自動更新機能を使わないか#

WordPress自体にはプラグインやテーマを自動で更新する機能があるが、php-fpmまたはApacheが動いているユーザによる書き込み権限が必要になるので利用を避けたい。

  • PHP自体のセキュリティ脆弱性を突かれた場合、WordPressの書き込み権限があるディレクトリが多すぎて影響が広くなってしまう。
  • 経験上、WordPressのテーマやプラグインの脆弱性を突かれた場合はバックドアとなるファイルを設置しようとする傾向が多い。

そこで、wp-cliを使ってコマンドラインから更新し、Webサーバのプロセスには必要最小限の書き込み権限だけを与えるアプローチを取る。

アプローチ#

  • WordPressサイトを10個ぐらい運用しているので、手動で更新が大変だった。
  • 記事投稿に必要な wp-content/uploads ディレクトリだけをwritableにして、プラグインとWordPressを最新状態にキープできるようにする。
  • wp-cliを使ってcronで自動更新する。

最新を使い続けることによって不安定なバージョンのプログラムを利用してしまう可能性がある。そこはトレードオフになるので、ダウンタイム無しで行いたければステージング環境を用意して、最新に更新してからサイトがちゃんと稼働しているかテストした後に本番環境に反映するワークフローにすることをおすすめする。

wp-cliのインストール#

Mac OSの場合は以下。

Terminal window
% brew install wp

Linux等の場合はcurlでインストールできる。

Terminal window
% 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コマンドを実行して実際に更新が行われるかチェックする。 以下のコマンドを実行するとユーザへの確認無しにファイルが更新されるので注意。

Terminal window
% cd /path/to/wordpress
% wp plugin update --all
% wp theme update --all
% wp core update && wp core update-db

更新スクリプト#

これを、cronで1日1回とか動かせば、WordPress本体、プラグイン、テーマを自動的に最新にできる。1ホストに複数のWordPressがホスティングされていても対応できるようになっているので、適宜ディレクトリを増減して調整する。

#!/bin/zsh
# -------------------------------------
# Usage: % ./wordpress_update.sh
# Author: Yuki Matsukura
# -------------------------------------
# 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の設定#

自動でスクリプトが実行されるようにcronに登録する。

Terminal window
% crontab -e

1日に1回、21時15分に更新する例。

15 21 * * * /path/to/wordpress_update.sh

まとめ#

  • 8年間、10サイトの運用をしているが問題なく稼働している。
  • この設定により、wp-content/uploads のみにWebサーバの書き込み権限を与えるという限定的な設定にできる。WordPress管理画面からプラグインの削除やインストールはできなくなるが、安全性を考えれば許容範囲。
  • 脆弱性を突かれてバックドアを設置されるリスクを大幅に下げられる。
WordPressをcronで自動更新。1日おきに最新に!
https://blog.teraren.com/posts/wordpress-update-script/
作者
Yuki Matsukura
公開日
2015-02-27
ライセンス
CC BY-NC-SA 4.0
この記事が役に立ったら
GitHub Sponsorsで応援できます

コメント