コンテンツセキュリティポリシーヘッダーの設定
最新のブラウザは、Web ページのセキュリティを強化し、特定の種類の攻撃 (クロスサイト スクリプティングやデータ インジェクションなど) を軽減するために、 コンテンツ セキュリティ ポリシー HTTP レスポンス ヘッダーを使用します。 LiferayでCSPを有効にすると、各HTTPリクエストに設定されたヘッダーを送信できます。
CSPポリシーには多くの選択肢があります。 ユーザーのニーズを理解し、彼らの要求に合ったポリシーを策定することが最善です。 CSPヘッダーを有効にすると、ブラウザによって強制的に適用されます。 ブラウザがCSPヘッダーをどのように処理するかについて詳しく知りたい場合は、以下のリンクをご覧ください。
サポートされていないコンテンツセキュリティポリシーを設定すると、インスタンスが正常に動作しなくなる可能性があります。
コンテンツセキュリティポリシーの指針と価値観
コンテンツセキュリティポリシーは、キーと値のペアの形式をとります。 キーは指示子であり、値を持つことができます。 ディレクティブと値を使用することで、さまざまな脅威からWebアプリケーションを保護するための堅牢なポリシーを構築できます。
ディレクティブ: ディレクティブは、ブラウザがウェブページ上で読み込んだり実行したりできるリソース (スクリプト、スタイルシート、画像など) を指定します。 以下に、よく使用されるディレクティブの例と、Liferayでサポートされている最も制限の厳しい値を示します。
| 指令 | 最小サポート値 | 説明 |
|---|---|---|
default-src | 該当なし | 他のディレクティブで明示的に定義されていないコンテンツタイプのデフォルトソースを指定します。 |
base-uri | なし または domain.com | 相対URLを解決するためのベースURLを指定します。 値をドメインのベース URL に設定します (例: domain.com)。 |
connect-src | self | ネットワークリクエストの送信先を指定します。 |
frame-ancestors | none | どの親ページがフレーム、IFrame、またはその他の埋め込み要素にリソースを埋め込むことができるかを指定します。 |
frame-src | self | フレームまたはIFrameにページやアプリケーションを埋め込むことができるドメインを指定します。 |
img-src | self | 画像を読み込むことができるソースを指定します。 |
object-src | none | オブジェクト および 埋め込み HTML 要素 (レガシー要素) の有効なソースを指定します。 |
script-src | 自己 unsafe-inline | JavaScriptを読み込んで実行できるソースを指定します。 |
script-src-attr | none | onClick のようなインラインスクリプトイベントハンドラをロードできるソースを指定します。 |
style-src | 自己 unsafe-inline | スタイルシートを読み込むことができるソースを指定します。 style-src-attr および style-src-elem が定義されていない場合、それらのデフォルト値として機能します。 |
style-src-attr | unsafe-inline | スタイルシート内でDOM要素に適用されるインラインスタイルの有効なソースを指定します。 |
style-src-elem | 自己 unsafe-inline | スタイル要素の有効なソースを指定します。 |
値: 値は、リソースをロードする承認済みのオリジンを指定します。 以下に、よく使われる値の例を示します。 これらに加えて、URLを指定することもできます。
| 値 | 説明 |
|---|---|
self | 同一オリジンからのリソースの読み込みと実行を可能にします。 |
unsafe-eval | eval() やその他の安全でないメソッドによって生成されたコードの実行を許可します。 |
unsafe-inline | インラインスタイルシート、スクリプト、インラインイベントハンドラなどの組み込みを可能にします。 |
[$NONCE$] | サーバーによって生成された特定のnonce値を使用して、スクリプトの実行やスタイルシートの読み込みを許可します。 |
strict-dynamic | 信頼できるソースからのスクリプトの実行を許可します。 信頼できるスクリプトからローダーによって読み込まれたスクリプトはブロックされません。 |
none | 指定されたディレクティブの実行を、すべてのソースからブロックします。 |
unsafe-eval と unsafe-inline はコードの実行とスタイリングに関して柔軟性を提供しますが、セキュリティリスクが増加することに注意してください。
一般的に、潜在的なセキュリティ脅威のリスクを最小限に抑えるために、CSP ヘッダーを 必要なソースが許可する限り制限的 に設定する必要があります。 しかし、Liferay は既存の制限により、現在完全に 安全でない の CSP をサポートできません。 詳細については、 CSP の現在の制限 を参照してください。
strict-dynamic は CSP の設定を簡素化し、nonce の伝播の必要性を減らしますが、信頼できるスクリプトによってロードされたスクリプトの実行を許可することで、攻撃対象領域を拡大する可能性があります。
あるいは、サーバーからクライアントにnonceを送信することで、動的に読み込まれるスクリプトがCSPに準拠するために必要なnonce属性を持つようにすることもできます。 このアプローチでは、Liferayが管理する独自のメカニズムを使用して、サーバーからクライアントへnonceを伝播させます。
このアプローチは、スクリプトの読み込みをより細かく制御できるため、スクリプトの実行を厳密に制御することが不可欠なシナリオでは、より好ましい場合がある。 しかし、これには独自のノンス伝播メカニズムが必要となり、より複雑になる可能性がある。
厳密動的 と nonce 伝播のどちらを選択するかは、特定の脅威モデル、リスク許容度、運用要件などの要因に依存します。 CSPに導入する前に、メリットとデメリットを検討してください。
サンプルコンテンツセキュリティポリシーの設定
-
グローバルメニュー (
) を開き、 コントロールパネル → インスタンス設定 → セキュリティ → コンテンツセキュリティポリシー に移動します。
-
CSP ヘッダーを有効にするには、 有効 チェックボックスをオンにします。 コンテンツセキュリティポリシー 入力フィールドにポリシーを入力し、除外するパスを複数指定できます(下記参照)。
-
コンテンツセキュリティポリシー 入力フィールドに、次のポリシーを入力してください。
default-src 'self'; script-src 'self' https://trusted-cdn.example.com '[$NONCE$]'; style-src 'self' https://trusted-cdn.example.com '[$NONCE$]' base-uri 'self';
このサンプルコンテンツセキュリティポリシーでは、リソースは同一オリジン self と信頼できるコンテンツ配信ネットワーク https://trusted-cdn.example.comからのみロードされます。 また、スクリプトとスタイルシートの整合性を確保し、不正なスクリプト実行を防止するために、nonce '[$NONCE$]' も含まれています。 base-url 'self' の値は、ブラウザにドキュメントと同じオリジンからのリソースの読み込みのみを許可するように指示します。
- をクリックして を更新します。
コンテンツセキュリティポリシー: 適用するコンテンツセキュリティポリシーを指定します。 ここに入力された値は、 Content-Security-Policy HTTP ヘッダーの値として表示されます。 コンテンツ セキュリティ ポリシーでプレースホルダー '[$NONCE$]' を使用して、 nonce を追加できます。 プレースホルダーは、指定したタグ用に生成されたnonceに置き換えられます。
除外パス: ここで追加された値で始まるパスは、コンテンツセキュリティポリシーから除外されます。
ボタンをクリックすると、除外するパスを複数追加できます。また、
ボタンを使用すると、除外するパスを削除できます。
CSPの設定は、すべてのスコープで利用可能です。 システム範囲については、 コントロール パネル → システム設定 → セキュリティ → コンテンツ セキュリティ ポリシー に移動します。 サイトスコープについては、サイトメニューを開き、 構成 → サイト設定 → セキュリティ → コンテンツセキュリティポリシー に移動します。
現在のCSPの制限事項と推奨事項
CSPヘッダーには以下の制限があります。
-
LPD-11235 非推奨機能フラグを有効にして CKEditor 4 を使用する場合、
script-srcディレクティブにはunsafe-inline値を含める必要があります。 -
CKEditor 5 はデフォルトのエディタであり、
unsafe-inlineディレクティブをscript-srcに必要としません。 -
あなたの
style-srcディレクティブにはunsafe-inline値が必要です。これは、Liferay がインライン スタイル属性を使用し、スタイルシートを動的に挿入するためです。 -
CKEditor 5でも、一部のプラグイン(例えば、テーブルのスタイル設定機能)はインラインスタイルを生成することができます。 これらの場合、エディタがこれらの機能を使用する場合は、
style-src 'unsafe-inline'が必要になる場合があります。
プラットフォームの制限により、 script-src と style-src を self のみに制限することはできません。
リスクを軽減するために、 style-src ディレクティブを style-src-attr と style-src-elem に分割できます。 必要なスタイル要素に対して、 style-src-elem を nonce 値 を使用して設定します。
script-src、script-src-attr、style-src、style-src-attrディレクティブがマークアップでサポートされていることを確認するために、HTMLタグの代わりにaui:タグを使用してください。
スタイルに特定の nonce 値を使用することで、より制限的なディレクティブを設定できます。
style-src-attr 'unsafe-inline';
style-src-elem '[$NONCE$]';
ドメイン my-relative-domain.comに対して、サポートされている最も制限の厳しいポリシーは次のとおりです。
base-uri 'my-relative-domain.com';
script-src '[$NONCE$]';
script-src-attr 'none';
style-src-elem '[$NONCE$]';
style-src-attr 'unsafe-inline';
connect-src 'self';
img-src 'self';
object-src 'none';
frame-ancestors 'none';
frame-src 'self';
可能な限りこの設定を使用してください。 ページが機能しない場合(たとえば、CKEditor 4 を使用しているため)、ページを 除外パス に追加します。

Liferay 2025.Q1リリース前の追加のCSP制限事項
これらの追加制限は、2025年第1四半期より前のLiferayバージョンに適用されます。
-
Liferay がコードを正しくバンドルするには、
script-srcディレクティブにunsafe-evalの値が定義されている必要があります。 -
Liferay 内の HTML 要素内のインライン イベント リスナーには、
script-src-attrディレクティブにunsafe-inlineの値を指定する必要があります。
機能の利用可能性
| Liferayのバージョン | 機能ステータス | 機能フラグラベル |
|---|---|---|
| Liferay DXP 2024.Q1/Portal GA112 | ベータ | コンテンツセキュリティポリシー(CSP)(LPS-134060) |
| Liferay DXP 2025.Q2 | リリース | コンテンツセキュリティポリシー(CSP)(LPS-134060) |
| Liferay DXP 2025.Q4 | Googleアナリティクス | - |