CSP の設定

参考:

Ruby on Rails 5.2 の新機能 (Active Storage, Content Security Policy など) – Qiita

RailsでContent Security Policy (CSP) 導入する |  Templarbit

Ruby on Rails Content-Security-Policy (CSP) | Rails security by bauland42

Content Security Policy | Ruby on Rails Guides [Official]

書き方

参考:

CSP (Contents Security Policy) の記述例 | Web Application Security Memo

Content Security Policy | Ruby on Rails Guides [Official]

Add DSL for configuring Content-Security-Policy header by pixeltrix · Pull Request #31162 · rails/rails – GitHub

Rails UJS, Turbolinks and CSP – Stack Overflow

リファレンス

参考:

Content Security Policy CSP Reference & Examples | Foundeo Inc.

まとめ

参考:

CSP に関するチートシート | OWASP

CSP

参考:

コンテンツセキュリティポリシー (CSP) | MDN

コンテンツ セキュリティ ポリシー | Google Developers

HTTP CSP について – Qiita

Content Security Policy でユーザーを守ろう | bitbank techblog

CSP 2015 | XSS Jigsaw

default-src

参考:

default-src | MDN

base-uri

参考:

base-uri | MDN

<base> | HTML5 タグリファレンス

base タグとは|コーディングのプロが作る HTML タグ辞典

frame-ancestors

参考:

frame-ancestors | MDN

img-src

参考:

img-src | MDN

media-src

参考:

media-src | MDN

script-src

参考:

HTTP CSP について – Qiita

script-src | MDN

nonce-source について調べてみた | A Day in Serenity (Reloaded)

script-src で nonce を使う

config/initializers/content_security_policy.rbnonce ジェネレーターを設定する。

Rails.application.config.content_security_policy_nonce_generator = \
  -> (_request) { SecureRandom.base64(16) }

ビューのレイアウトで rails-ujs で使われる meta タグを生成する。

<%= csp_meta_tag %>

JavaScript をファイルから読み込む際に nonce を有効にする。

<%= javascript_include_tag "script", nonce: true %>

JavaScript を埋め込む際に nonce を有効にする。

<%= javascript_tag nonce: true do %>
  alert('hello, nonce!')
<% end %>

script タグに nonce を埋め込む。

<script nonce="<%= content_security_policy_nonce %>">
  alert('hello, nonce!')
</script>

参考:

Content Security Policy | Ruby on Rails Guides [Official]

csp_meta_tag – ActionView::Helpers::CspHelper | Ruby on Rails API [Official]

javascript_tag – ActionView::Helpers::JavaScriptHelper | Ruby on Rails API [Official]

rails/javascript_helper.rb at v5.2.2 · rails/rails – GitHub

Webpacker

参考:

Webpacker and CSP · Issue #1057 · rails/webpacker – GitHub

Refused to evaluate a string as JavaScript because ‘unsafe-eval’ is not an allowed source of script in the following Content Security Policy directive: “script-src ‘self’ https:”. · Issue #31298 · rails/rails – GitHub

Webpack

参考:

Add support for `nonce` attribute (CSP) · Issue #455 · webpack/webpack – GitHub

Vue.js

参考:

CSP 環境 | Vue.js [公式]

ランタイム + コンパイラとランタイム限定の違い | Vue.js [公式]

Vue – rails/webpacker: Use Webpack to manage app-like JavaScript modules in Rails – GitHub

CSP environments | Vue.js [Official]

nonce の仕組み

HTTP レスポンスヘッダーで Content-Security-Policy を出力する。

Content-Security-Policy: script-src 'nonce-01234abcde';

レスポンスボディ (HTML) の script タグに nonce を埋め込む。

<script nonce="01234abcde">
  alert('hello, nonce!');
</script>

参考:

rails commit log 流し読み 2018/02/23 | なるようになるブログ

翻訳 現実の Web に向けた CSP | Mozilla Security Blog 日本語版

nonce 属性 | W3 Watch Reference

そろそろ CSP Lv.2 nonce やろう | teppeis blog

Content-Security-Policy と nonce の話 | tokuhirom’s blog

content_security_policy_nonce_generator

config/initializers/content_security_policy.rbnonce ジェネレーターを設定する。

Rails.application.config.content_security_policy_nonce_generator =
  -> (_request) { SecureRandom.base64(16) }

参考:

content_security_policy_nonce_generator= – ActionDispatch::ContentSecurityPolicy::Request | Ruby on Rails API [Official]

rails/content_security_policy.rb.tt at v5.2.2 · rails/rails – GitHub

CSP nonces being added to header after every request indefinitely · Issue #32597 · rails/rails – GitHub

content_security_policy_nonce_directives

nonce を付与するディレクティブを指定する。

Rails.application.config.content_security_policy_nonce_directives =
  %w[script-src]

参考:

content_security_policy_nonce_directives= – ActionDispatch::ContentSecurityPolicy::Request | Ruby on Rails API (edge) [Official]

content_security_policy_nonce_directives – rails/application.rb at v6.0.0.rc2 · rails/rails – GitHub

csp_meta_tag

rails-ujs が Ajax などで用いる nonce を埋め込んだ meta タグを生成する。

<html>
  <head>
    ...
    <%= csp_meta_tag %>
    ...
  </head>
  ...
</html>

参考:

csp_meta_tag – ActionView::Helpers::CspHelper | Ruby on Rails API [Official]

Add support for automatic nonce generation for Rails UJS by pixeltrix · Pull Request #32018 · rails/rails – GitHub

rails/csp_helper.rb at v5.2.2 · rails/rails – GitHub

ActionDispatch::ContentSecurityPolicy

参考:

ActionDispatch::ContentSecurityPolicy | Ruby on Rails API [Official]

rails/content_security_policy.rb at v5.2.2 · rails/rails – GitHub

content_security_policy_nonce

コントローラーやビューからはリクエストに含まれる値を参照できる。

request.content_security_policy_nonce

ミドルウェアからは env に含まれる値を参照できる。

env["action_dispatch.content_security_policy_nonce"]

参考:

rails/javascript_helper.rb at v5.2.2 · rails/rails

rails/action_controller/metal/content_security_policy.rb at v5.2.2 · rails/rails – GitHub

rails/action_dispatch/http/content_security_policy.rb at v5.2.2 · rails/rails – GitHub

cspNonce

JavaScript 内からは Rails.cspNonce()meta タグに設定された nonce を取得できる。

console.log(Rails.cspNonce())

参考:

rails/csp.coffee at v5.2.2 · rails/rails – GitHub

CSP Level 3

参考:

Content Security Policy Level 3 における XSS 対策 | pixiv inside

Chrome の img-src バグ

普通のブラウザはこれで全て読み込める。

img-src: *;

Chrome は *data: が含まれないので、別途 data: の指定が必要。

img-src: * data:;

参考:

img-src * としたのに Chrome で blob の画像を読み込もうとしたらセキュリティーエラーになった。- Qiita

img-src | MDN

Content Security Policy “data” not working for base64 Images in Chrome 28 – Stack Overflow

CSP の設定をしたら RVT が使えなくなった

コントローラーで CSP ヘッダーを設定する。

module RVT
  class ApplicationController < ActionController::Base
    before_action :set_content_security_policy_header

    CONTENT_SECURITY_POLICY = %w[
      default-src 'self' https:;
      font-src 'self';
      img-src * data:;
      object-src 'none';
      style-src
        'self' 'unsafe-inline';
      script-src
        'self' 'unsafe-inline' 'unsafe-eval';
      media-src 'none';
      connect-src
        'self'
        http://localhost:3035
        ws://localhost:3035;
      base-uri 'self';
      frame-ancestors 'self' https:;
    ].join(" ")

    def set_content_security_policy_header
      response.set_header(
        "Content-Security-Policy",
        CONTENT_SECURITY_POLICY
      )
    end
  end
end
タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です