コンテンツセキュリティポリシーヘッダーの構成
最新のブラウザは、 コンテンツ セキュリティ ポリシー HTTP 応答ヘッダーを使用して Web ページのセキュリティを強化し、特定の種類の攻撃 (クロスサイト スクリプティングやデータ インジェクションなど) を軽減します。 Liferay で CSP を有効にすると、各 HTTP リクエストで構成されたヘッダーを送信できます。
CSP ポリシーには多くのオプションがあります。 ユーザーのニーズを理解し、その要件に合ったポリシーを考案することが最善です。 CSP ヘッダーを有効にすると、ブラウザによってそれが適用されます。 ブラウザが CSP ヘッダーを処理する方法の詳細については、以下のリンクをご覧ください。
サポートされていないコンテンツ セキュリティ ポリシーを構成すると、インスタンスが誤動作する可能性があります。
コンテンツセキュリティポリシーの指令と値
コンテンツ セキュリティ ポリシーは、キーと値のペアの形式をとります。 キーはディレクティブであり、値を持つことができます。 ディレクティブと値を使用することで、さまざまな脅威から Web アプリケーションを保護するための強力なポリシーを作成できます。
ディレクティブ: ディレクティブは、ブラウザが 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 | 自己 安全でないインライン | JavaScript を読み込んで実行できるソースを指定します。 |
script-src-attr | none | onClickのようなインライン スクリプト イベント ハンドラーを読み込むことができるソースを指定します。 |
style-src | 自己 安全でないインライン | スタイルシートを読み込むことができるソースを指定します。 style-src-attr と style-src-elem が定義されていない場合は、デフォルトとして機能します。 |
style-src-attr | unsafe-inline | スタイルシート内の DOM 要素に適用されるインライン スタイルの有効なソースを指定します。 |
style-src-elem | 自己 安全でないインライン | スタイル要素の有効なソースを指定します。 |
値: 値は、リソースを読み込む承認済みのオリジンを指定します。 以下に、よく使用される値の例を示します。 これらに加えて、URL を指定することもできます。
| 値 | 説明 |
|---|---|
self | 同じオリジンからのリソースの読み込みと実行を許可します。 |
unsafe-eval | eval() やその他の安全でないメソッドによって生成されたコードの実行を許可します。 |
unsafe-inline | インライン スタイルシート、スクリプト、インライン イベント ハンドラーなどの組み込みを許可します。 |
[$NONCE$] | サーバーによって生成された特定の nonce 値を使用してスクリプトを実行したり、スタイルシートを読み込んだりすることを許可します。 |
strict-dynamic | 信頼できるソースからのスクリプトの実行を許可します。 信頼できるスクリプトからのローダーによって組み込まれたスクリプトはブロックされません。 |
none | すべてのソースからの指定されたディレクティブの実行をブロックします。 |
unsafe-eval と unsafe-inline はコード実行とスタイルの点で柔軟性を提供しますが、セキュリティ リスクが増大することに留意することが重要です。
一般的に、セキュリティ上の脅威のリスクを最小限に抑えるには、CSP ヘッダーを 必要なソースが許可する範囲内でできるだけ制限的に 設定する必要があります。 ただし、Liferay は現在、既存の制限により、完全に 安全でない フリーの CSP をサポートできません。 詳細については、 CSP の現在の制限 を参照してください。
strict-dynamic は CSP 構成を簡素化し、ノンスの伝播の必要性を減らしますが、信頼されたスクリプトによって読み込まれたすべてのスクリプトの実行を許可することで攻撃対象領域を拡大する可能性があります。
あるいは、サーバーからクライアントに nonce を送信して、動的に読み込まれたスクリプトに CSP に準拠するために必要な nonce 属性が含まれるようにすることもできます。 このアプローチには、Liferay によって管理される独自のメカニズムが使用され、サーバーからクライアントに nonce が伝播されます。
このアプローチは、スクリプトの読み込みをより細かく制御できるため、スクリプトの実行を厳密に制御する必要があるシナリオに適しています。 ただし、ノンスの伝播には独自のメカニズムが必要となり、より複雑になる可能性があります。
strict-dynamic と 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 ヘッダーには次の制限があります。
-
CKEditor 4 をサポートするには、
script-srcディレクティブにunsafe-inline値が定義されている必要があります。 CKEditor は唯一サポートされている WYSIWYG エディターです。 -
Liferay にはインライン スタイル属性があり、スクリプトを使用して
<head>タグにスタイルシートを追加するため、style-srcディレクティブにはunsafe-inline値が必要です。
Liferay の将来のバージョンでは、 CKEditor 5 とインライン スタイルの削除により、これらの制限に対処します。
これらの制限のため、これらの属性を(そうでなければ最小限の) self 属性に完全に制限することはできません。
ただし、 style-src ディレクティブを style-src-attr と style-src-elem ディレクティブに分割して、リスクをさらに最小限に抑えることができます。 次に、必要なスタイル要素の代わりに、 style-src-elem ディレクティブを nonce values を使用して設定します。
aui: タグを HTML タグの代わりに使用して、 script-src、 script-src-attr、 style-src、および style-src-attrの CSP がマークアップでサポートされるようにします。
スタイルに特定の 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.Q1 より前の Liferay バージョンに適用されます。
-
Liferay がコードを適切にバンドルするには、
script-srcディレクティブにunsafe-eval値が定義されている必要があります。 -
Liferay 内の HTML 要素内のインライン イベント リスナーの場合、
script-src-attrディレクティブにはunsafe-inline値が必要です。
機能の可用性
| Liferayのバージョン | 機能のステータス | 機能フラグラベル |
|---|---|---|
| Liferay DXP 2024.Q1/ポータル GA112 | ベータ | コンテンツセキュリティポリシー(CSP)(LPS-134060) |
| ライフレイ DXP 2025年第2四半期 | リリース | コンテンツセキュリティポリシー(CSP)(LPS-134060) |
| ライフレイ DXP 2025年第4四半期 | Googleアナリティクス | - |