1035 文字
5 分
WordPressをcronで自動更新。1日おきに最新に!
概要
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の場合は以下。
% brew install wpLinux等の場合はcurlでインストールできる。
% 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で1日1回とか動かせば、WordPress本体、プラグイン、テーマを自動的に最新にできる。1ホストに複数のWordPressがホスティングされていても対応できるようになっているので、適宜ディレクトリを増減して調整する。
#!/bin/zsh# -------------------------------------# Usage: % ./wordpress_update.sh# Author: Yuki Matsukura# -------------------------------------
# to be strict syntax checkerset -e
# set low priorityrenice -n 19 $
WPS=( "/path/to/wordpress1/" "/path/to/wordpress2/")
for i in $WPSdo 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-dbdonecronの設定
自動でスクリプトが実行されるようにcronに登録する。
% crontab -e1日に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/ 関連記事
この記事が役に立ったら
GitHub Sponsorsで応援できます