Craft CMS を安全に利用するために

去る10月20日に Movable Type の脆弱性がアナウンスされました。

Movable TypeのXMLRPC APIにおける脆弱性(CVE-2021-20837)に関する注意喚起
https://www.jpcert.or.jp/at/2021/at210047.html

サポートが終了しているとはいえ、Movable Type 4.0 以上であれば速やかに対応が必要です。

Movable Type の XMLRPC API における OS コマンドインジェクションの脆弱性 (CVE-2021-20837) を悪用した攻撃被害に関する対応メモ | WWW WATCH
https://hyper-text.org/archives/2021/12/movable_type_xmlrpc_api_vulnerability.shtml

こちらのケースと同様、自分の身近なところでも被害に遭われた方がいて、従来より深刻だなと捉えています。
心当たりのある方もない方もご自身が携わるサーバーが該当しないか、ぜひ確認してみてください。

とはいえ、システムにバグが存在するのは仕方ありません。
大事なのは「より安全に利用できるよう」対策したり、日頃からメンテナンスすることですよね?

そこで、普段 Craft CMS を利用する際に気をつけていることをまとめてみます。
これは Craft CMS Advent Calendar 2021 1日目の記事です。

公式ドキュメントを確認

Craft CMS では、安全に利用するためのトピックや FAQ を公式ドキュメントとしてまとめられていますので、ぜひ一度目を通してみてください。

Securing Craft | Craft CMS
https://craftcms.com/knowledge-base/securing-craft

Security FAQ | Craft CMS
https://craftcms.com/knowledge-base/security-faq

いずれも原文は英語ですが、macOS Monterey の翻訳機能や Google 翻訳、DeepL などで自動変換した状態でも把握できる内容でした。便利なの世の中、ですね。

なお、Craft 本体のメジャーアップデート(例えば、3.6 から 3.7 など)に伴い、公式ドキュメントにも大きな変更が加わることがあるため、たまにチェックすると良いでしょう。

できることからやってみる

「Securing Craft」に記載された内容を参考に、できることから実践していきましょう。
ここでは、自分が意識しているポイントをいくつかご紹介します。

Craft 本体をドキュメントルート外の階層に設置する

Craft CMS では、システム本体をドキュメントルートの外に設置することが推奨されています。

Installation | Craft CMS Documentation | 3.x
https://craftcms.com/docs/3.x/installation.html

これは主に Craft のPHPファイルや .env などの機密情報にブラウザからアクセスできなくすることを意図していると思いますが、テンプレートファイルを拡張子 .html にしている場合、Twig コードをそのまま表示できてしまう可能性もあります。Craft CMS は Twig コードに SQL のクエリを記述できるなどテンプレートの柔軟性が高いため、思いがけないリスクになるかもしれません。

もし、ドキュメントルート外に Craft 本体を設置できない状況であれば、別のサーバーを用意した方が良いと思います。

環境設定 allowAdminChanges を無効化する

Craft CMS では環境設定を config/general.php に定義できます。

'allowAdminChanges' => false

設定項目の一つである allowAdminChanges を無効にしておくと、システム管理権限を持つユーザーが管理画面にアクセスした際でも、Craft 本体やプラグインの追加・アップデート、セクションやフィールド設定などを一切変更できなくなります。

意図しない操作がキッカケでフロントエンドの表示や動作に支障をきたさないよう、システム管理権限を複数のユーザーに割り当てる必要がある場合などは、あらかじめ無効化しておくと良いでしょう。

エイリアスを設定する

エイリアスも config/general.php に設定できる項目で、いくつかの項目はシステム標準としてあらかじめ定義されています。そのうち @web はサーバー設定によってキャッシュポイズニングの脆弱性になりかねないということで、明示的に上書きしておいた方が安全です。

そこで .env にパスを定義し

SITE_URL ="https://craft3.test"
SITE_PATH ="/var/www/html"

config/general.php からは App::env() で読み込むのがオススメです。

'aliases' => [
    '@siteUrl' => App::env('SITE_URL'),
    '@sitePath' => App::env('SITE_PATH'),
],

こうしておけば、「サイト」や「ボリューム」設定でエイリアスを利用できるだけでなく、別サーバーに複製する際も .env の内容だけを書き換えるだけで済みます。

なお、自分の場合はサンプルの通り @web を使わず、任意の判別しやすい名称でエイリアスを設定しています。

プラグインを含め、こまめにアップデートを適用する

なんと言っても、これに尽きますよね。

とはいえ、Craft 本体は「アップデートがリリースされた数時間後に、マイナーアップデートが出てる」なんてこともよくあるため、極端に神経質になる必要はありません。もちろん、アップデートによる不具合がないかテスト環境で事前検証もしたいです。

Craft CMS では、本体とプラグインのアップデート内容を一覧で確認でき、重要なアナウンスを含むものがあればアコーディオンブロックを開いた状態で表示してくれるため、判別がしやすくなっています。そこでセキュリティに関する修正が含まれるかどうかを確認し、重要度に応じて適用するタイミングを検討すると良いでしょう。

重要なコメントを含むアップデート通知のサンプル

最後に

システムにバグが存在するのは仕方ありません。 (大事なことなので、2回目
ですので、そのシステムごとに適切な設定やアップデートの適用を行い、安全に利用したいところです。

「そのための準備が大変」というのは正直なところですが、比較的簡単に既存環境を複製できる Craft CMS は、検証環境を用意してテストする(精神的なものを含めた)負荷が抑えられるかもしれません。

具体的にどう簡単かについては、次回まとめたいと思います。