CSP(Content Security Policy)について
Jenkins+mvn site+HTML Publisher PluginでMavenのレポートをJenkinsから見ようと思ったらスタイルが崩れまくっていたので調べた。
結局公式で解決。
https://wiki.jenkins-ci.org/display/JENKINS/Configuring+Content+Security+Policy
CSP(Content Security Policy)
CSP(Content Security Policy)は、クロスサイトスクリプティング (XSS) やデータインジェクション攻撃を含む、よく知られた種類の攻撃を検出して軽減する、セキュリティの追加レイヤー。
サーバサイドからブラウザに対してコンテンツの使用ポリシーを伝えて各種攻撃を回避する。
Content-Security-Policyヘッダと、W3C の CSP 1.0 仕様で定められたディレクティブを使用する。
https://developer.mozilla.org/ja/docs/Security/CSP
CSPの使い方
HTTPレスポンスに「Content-Security-Policy」をつけて返却することで実現する。
ヘッダには以下のディレクティブを使用する。
- 'none'
- 空セットへの参照。どのホストともマッチしない。シングルクォートまで含めて記述。
- 'self'
- 保護されたドキュメントが置かれている生成元への参照。同じURLスキームとポート番号を含む。シングルクォートまで含めて記述。
- 一部のブラウザは、blob や filesystem を提供元ディレクティブから明確に除外している。これらのコンテンツタイプを許可する必要があるサイトでは、データ属性(後述)を使用して指定すること。
- 'unsafe-inline'
- インラインの
<script>
要素、javascript: URL、インラインのイベントハンドラ、インラインの<style>
要素といった、インラインリソースの使用を許可する。シングルクォートまで含めて記述。
- インラインの
- 'unsafe-eval'
- 文字列からコードを生成する
eval()
や類似メソッドの使用を許可する。シングルクォートまで含めて記述。
- 文字列からコードを生成する
以下はデータ要素。
- data:
- コンテンツの提供元として使用される「data: URI」を許可する。
- 攻撃者が任意のdata: URIを挿入する恐れがあるため使用は控える。
- スクリプト用には決して使用しない。
- mediastream:
- コンテンツの提供元として「mediastream: URI」を使用することを許可する。
- blob:
- コンテンツの提供元として「blob: URI」を使用することを許可する。
- filesystem:
- コンテンツの提供元として「filesystem: URI」を使用することを許可する。
その他のディレクティブや詳細は以下を参照。
https://developer.mozilla.org/ja/docs/Security/CSP/CSP_policy_directives
CSRの使用例は以下を参照。 https://developer.mozilla.org/ja/docs/Security/CSP/Using_Content_Security_Policy
Jenkinsでの対策
Jenkinsでは「hudson.model.DirectoryBrowserSupport.CSP」というシステムプロパティでCSPを設定する。
デフォルトでセキュリティきつめの設定になっているので緩めないとMavenレポートすらまともに見れない。
以下の方法で設定する。
方法1:「-D」オプション
Jenkins起動時に「-D」オプションで設定する。
java -Dhudson.model.DirectoryBrowserSupport.CSP="sandbox; default-src 'self';" -jar jenkins.war
環境変数でもいけそうな気がするけど試してない。
方法2:スクリプトコンソール
Jenkinsのトップ画面から「Jenkinsの管理」→「スクリプトコンソール」と進むと、任意のGroovyスクリプトを事項できる画面になる。
ここで下記のようなスクリプトを実行する。
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; default-src 'self';")
いじょ。