Magento2.3.5以降でContent Security Policyのホワイトリストを定義する
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
Magento2.3.5で加えられた機能追加の1つ「Content Security Policy」。
許可されていない外部のJavaScriptや画像などにブラウザが勝手にアクセスをしないようにするための仕組みです。わかりやすい説明は、MDNのページに書かれています。
Magento上のContent Security Policyの仕組み
2.3.5で導入された、Magento\Cspモジュールによって、Content Security PolicyがMagentoでも利用できるようになりました。
当面は「report only」モードで動作するようですが、将来的には事前に定義していない外部リソースはすべて拒否されることになるでしょう。
さて、Magento\Cspモジュールが導入されたことによって、新しいXMLファイルの定義が追加されました。
各モジュールは「csp_whitelist.xml」を定義できるようになり、このファイル上に許可する内容を記述していくことになります。
csp_whitelist.xmlの構造
Content Security Policyを定義するためのXMLファイル「csp_whitelist.xml」は、以下のような構造を持つXMLファイルです。
<csp_whitelist xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Csp:etc/csp_whitelist.xsd"> <policies> <policy id="img-src"> <values> <value id="paypal_analytics" type="host">t.paypal.com</value> <value id="www_paypal" type="host">www.paypal.com</value> <value id="paypal_objects" type="host">www.paypalobjects.com</value> <value id="paypal_fpdbs" type="host">fpdbs.paypal.com</value> <value id="paypal_fpdbs_sandbox" type="host">fpdbs.sandbox.paypal.com</value> </values> </policy> <policy id="script-src"> <values> <value id="www_paypal" type="host">www.paypal.com</value> <value id="www_sandbox_paypal" type="host">www.sandbox.paypal.com</value> <value id="paypal_objects" type="host">www.paypalobjects.com</value> <value id="paypal_analytics" type="host">t.paypal.com</value> </values> </policy> <policy id="frame-src"> <values> <value id="www_paypal" type="host">www.paypal.com</value> <value id="www_sandbox_paypal" type="host">www.sandbox.paypal.com</value> </values> </policy> </policies> </csp_whitelist>
例はMagento\Paypalモジュールのものですが、policiesタグの下にpolicyを色々と書いていくという形をとっています。
policyのid属性に指定できる値については、
Content-Security-Policy - HTTP | MDN
のフェッチディレクティブの項目を見ていただくと良いでしょう。
JavaScriptや外部APIの場合は、どの値が適切か検証する必要があります。
次にvaluesタグとvalueを定義します。valueが実際に許可する値になります。
valueタグの定義は以下のようになっています。
属性名 | 値の例 | 必須 |
id | paypal_analytics | ◯ |
type | host または hash | ◯ |
algorithm | sha256 | △(typeがhashの場合は必須) |
そして、valueタグの値としてホスト名やハッシュ値を指定します。
基本はこれだけです。
csp_whitelist.xmlを定義し忘れるとどうなるか
Magento2.3.5時点ではcsp_whitelist.xmlを定義し忘れても何の影響もありません。
将来的にはデフォルトの動作モードが「report only」ではなくなるでしょう。そうなると未許可リソースはすべてブロックされるようになると思われます。
開発者としてはcsp_whitelist.xmlを早いうちに用意しておき、本格適用が始まっても影響がないようにすることが望ましいでしょう。
今のうちにレポート収集先を用意してデータ収集を
繰り返しになりますが、現段階でのMagentoにおけるContent Security Policyは「report only」モードです。直ちに動作に影響を及ぼすものではありません。
ですが、いつ本格適用になってもいいように、report-uriに指定するエンドポイントを用意し、データ収集とホワイトリストの整備を進めましょう。
もちろん、Magento\Cspモジュールはまだ初期段階なので、これからもう少し使いやすく機能改良が行われると思います。