コンテンツデリバリネットワーク(CDN)

Hanamiアプリケーションは、コンテンツ配信ネットワーク(CDN)からアセットを配信できます。この機能は、静的資産の処理を高速化したいプロダクション環境で役に立ちます。

この機能を利用するには、CDN設定を指定する必要があります。

# apps/web/application.rb
module Web
  class Application < Hanami::Application
    # ...
    configure :production do
      scheme 'https'
      host   'bookshelf.org'
      port   443

      assets do
        # ...
        fingerprint true

        # CDN settings
        scheme 'https'
        host   '123.cloudfront.net'
        port   443
      end
    end
  end
end

いったんCDNモードがオンになっている、すべての資産ヘルパーは戻ります絶対URLを

<%= stylesheet 'application' %>
<link href="https://123.cloudfront.net/assets/application-9ab4d1f57027f0d40738ab8ab70aba86.css" type="text/css" rel="stylesheet">

 

サブリソースの整合性

CDNはページのスピードを飛躍的に向上させることができますが、セキュリティ違反が発生する可能性があります。使用しているCDNが侵害され、悪質なjavascriptやスタイルシートファイルを提供している場合、XSS(Cross Site Scripting)などのセキュリティ攻撃にユーザーがさらされています。

この問題を解決するために、ブラウザのベンダーはSubresource Integrityと呼ばれる防御を導入しました

有効にすると、ブラウザはダウンロードしたファイルのチェックサムが宣言されたファイルと一致することを確認します。

 

CDNから

CDNからjQueryを使用している場合は、その.jsファイルのチェックサムをWebサイトで見つけて、次のように記述する必要があります。

<%= javascript 'https://code.jquery.com/jquery-3.1.0.min.js', integrity: 'sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=' %>

出力は次のようになります。

integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" src="https://code.jquery.com/jquery-3.1.0.min.js" type="text/javascript" crossorigin="anonymous">

 

ローカル資産

上記のセキュリティ上の問題は、CDNだけでなくローカルファイルにも関係します。私たちがファイルシステムを侵害したとしたら、誰かがjavascriptを悪質なファイルに置き換えることができたとします。私たちは同じ種類の攻撃に対して脆弱です。

このセキュリティ問題に対する防御として、Hanami はデフォルトでプロダクションでSubresource Integrityを有効にします。
私たちはときに資産をプリコンパイルデプロイ時に、花見は、すべて当社の資産のチェックサムを計算し、それが特別なHTML属性を追加するintegrityなどの当社のアセットタグに

 javascript 'application' %>
src="/assets/application-92cab02f6d2d51253880cd98d91f1d0e.js" type="text/javascript" integrity="sha256-WB2pRuy8LdgAZ0aiFxLN8DdfRjKJTc4P4xuEw31iilM=" crossorigin="anonymous">

 

設定

この機能をオフにするには、またはそれを構成するために、見ていてくださいproductionにブロックをapps/web/application.rb

module Web
  class Application < Hanami::Application
    configure :production do
      assets do
        # ...
        subresource_integrity :sha256
      end
    end
  end
end

その行を削除またはコメントすることで、機能はオフになります。

1つまたは複数のチェックサムアルゴリズムを選択できます。

subresource_integrity :sha256, :sha512

Hanamiは、この設定を使用して、integrityHTML属性に2つの値(1つはfor SHA256、1つはfor)をレンダリングしSHA512ます。

src="/assets/application-92cab02f6d2d51253880cd98d91f1d0e.js" type="text/javascript" integrity="sha256-WB2pRuy8LdgAZ0aiFxLN8DdfRjKJTc4P4xuEw31iilM= sha512-4gegSER1uqxBvmlb/O9CJypUpRWR49SniwUjOcK2jifCRjFptwGKplFWGlGJ1yms+nSlkjpNCS/Lk9GoKI1Kew==" crossorigin="anonymous">

注意してくださいそのチェックサムの計算はCPUに負荷をかけているので、追加の追加subresource_integrityスキームが、それはするのにかかる時間が延長されますassestsをプリコンパイルし、そのために展開。デフォルト設定(:sha256)のままにすることをお勧めします。