🔄

Wordpressを自動更新してセキュリティアップデートをすぐに適用する設定

2023/10/17に公開

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

最新のスクリプトは以下で更新しています。
https://gist.github.com/matsubo/159ba160581ff53fce09

まとめ

  • 8年間、10サイトの運用をしていますが問題なく稼働しています。
  • この設定により、 wp-content/content のみをWebサーバの書き込み権限だけ与えるという限定的な設定を行えます。
  • Wordpressの管理画面上から手軽にプラグインの削除やインストールができなくなりますが安全性を考えればしょうがないです。

Discussion