Home Blogs Layer0のEdgeJSを使用したカスタムセキュリティヘッダーの設定
Download
Applications

Layer0のEdgeJSを使用したカスタムセキュリティヘッダーの設定

About The Author

Outline

セキュリティヘッダーの実装は、毎日のように侵害やデータ盗難の数が急速に増加しているため、非常に重要になっています。 セキュリティヘッダーは、ソリューションの実装が簡単な部分を提供します。特定のHTTPヘッダーを渡すだけで、XSS、コードインジェクション、クリックジャックなどの一般的な攻撃からWebサイトを保護できます。

セキュリティヘッダーとは

Webアプリケーションは、セキュリティヘッダーと呼ばれるセキュリティ侵害やクライアント側の脆弱性からWebサイトを保護するために、ブラウザに特別なコマンドを送信できます。

ユーザーがブラウザでWebサイトにアクセスすると、サーバーはHTTPレスポンスヘッダーで応答します。 これらのヘッダーはメタデータで構成され、クライアントおよびサーバーと情報を共有します。 この共有情報は、ブラウザがWebサイトとどのように対話するかを定義します。 セキュリティヘッダーは、さまざまなWebアプリの脆弱性や脅威から強力な保護を提供します。

このブログでは、次の重要なセキュリティヘッダーについて説明します。

  • コンテンツセキュリティポリシー(CSP)
  • X-Content-Type-Options(Xコンテンツタイプ-オプション)
  • Xフレーム-オプション
  • クロスオリジンリソースポリシー(CORP)
  • クロスオリジン組み込みポリシー(COEP)
  • クロスオリジンオープナーポリシー(COOP)
  • リファラー-ポリシー
  • 権限-ポリシー
  • HTTP Strict Transport Security(HSTS)

セキュリティヘッダーの重要性

HTTPセキュリティヘッダーは、Webサイトのセキュリティの基本的な部分です。しかし、上位100万のWebサイトのうち、コンテンツセキュリティポリシー(CSP)を実装しているのはわずか1.6%で、CSP-Report-Onlyを実装しているサイトはわずか 2%です。

ショックでしょ? CSP HTTPヘッダーがないため、クロスサイトスクリプティング(XSS)やその他のクライアント側インジェクション攻撃に対する防御メカニズムが損なわれます。 ブリティッシュ・エアウェイズのデータ侵害 は、クライアント側のセキュリティ、名前、住所、電子メールアドレス、クレジットカード番号の欠如が原因で発生した事件の1つです。 380,000のお客様の有効期限とカードのセキュリティコードが公開され、15日間は検出されませんでした。

Layer0のEdgeJSによるセキュリティの追加

Layer0のデプロイメントプラットフォームでは、TLSのようなものがデプロイリンクごとに自動的に構成されるため、開発者はデフォルトで安全に出荷できます。 このブログでは、重要なセキュリティヘッダーと、Layer0のルート設定を使用してWebサイトを保護する方法を示す例を詳しく見ていきます。

Edgioでセキュリティヘッダーを使用する前に

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

CSPが許可されていないオリジンからのリソースのロードを防止する方法

Content-Security-Policyは、スクリプト、スタイル、画像、フォント、メディアが特定の許可されたオリジンからロード(および実行)されることを制限することで、クロスサイトスクリプティング(XSS)攻撃を防ぐための追加レイヤーを提供し ます。 バックエンドがどれほど安全であるかにかかわらず、攻撃者がサーバーではなくブラウザーで実行されるコードを攻撃する可能性がある場合、ユーザーセッションデータが侵害され、機密情報が漏洩します。 多くの例(ブリティッシュ・エアウェイズのデータ侵害など)の1つは、チケットマスターの支払いモジュールに対するMageCart攻撃です。 Ticketmasterの侵害 により、クレジットカードの盗難による40,000の犠牲者が発生し、5が逮捕されるまでの数ヶ月間アクティブなままでした。 ブラウザ内にフォームスキミングスクリプトを挿入するだけです

const { Router } = require(‘@layer0/core/router’) const ContentSecurityPolicy = `default-src‘elf”’unsafe-eval”’unsafe-inline’*.layer0.co; style-src ‘elf””unsafe-inline’* .googleapis.com ; img-src * blob:data:; media-src ‘;connect-src .gstatic.com New Router() .get(“/:route”,({setResponseHeader})={setResponseHeader(“Content-Security-Policy”,ContentSecurityPolicy.replace(/\n/g,””)})>

Content-Security-Policyを使用すると、次のことが可能になります。

  1. XSS(クロスサイトスクリプティング)攻撃の克服
  2. クリックジャッキングの防止
  3. CSPルールに違反を報告する

X-Content-Type-Options(Xコンテンツタイプ-オプション)

X-Content-Type-Optionsを設定してMIMEタイプスニフィングを防止する方法

X-Content-Type-Optionsヘッダーは、Content-Typeヘッダーで指定されたMIME(Multipurpose Internet Mail Extensions、ファイルフォーマットの識別子)タイプが厳密に従うことを示します。 MIMEタイプスニッフィングを使用する と、イメージのアップロードなどの操作で、悪意のある実行可能ファイルが実行され、X-Content-Type-Optionsヘッダーが機能します。

const {Router} = require(‘@layer0/core/router’) new Router() .get(“/:route”, ({setResponseHeader})={setResponseHeader(“X-Content-Type-Options”,> “nosniff”)})

Xフレーム-オプション

Xフレームオプションヘッダー

X-Frame-Optionsヘッダーは、ブラウザーがフレーム、iframe、embed、またはobjectタグ内のページをレンダリングすることを許可するかどうかを示します。 クリックジャッキ 攻撃。 DENYまたはSAMEORIGINのどちらに設定しても、コンテンツが他のサイトに埋め込まれないようにしたり、同じオリジンを持つサイトにのみ埋め込まれたりすることはありません。

const {Router} = require(‘@layer0/core/router’) new Router().get(“/:route”, ({setResponseHeader})={setResponseHeader(“X-Frame-Options”,> “SAMEORIGIN”)})

X-Frame-Optionsでは、次の機能を使用できます。

  1. クリックジャッキング攻撃の防止
  2. ブラウザでページのレンダリングを許可するかどうかを指定します。 <フレーム>、 <iframe>、 <埋め込み> または <オブジェクト>

クロスオリジンリソースポリシー(CORP)

Corpでは、リクエストされたリソースの特定のクロスオリジンまたはクロスサイト埋め込み(API応答など)からサーバーを保護できます。 また、Spectreのような投機的なサイドチャネル攻撃も防止します

const {Router} = require(‘@layer0/core/router’) new Router().get(“/:route”, ({setResponseHeader})={setResponseHeader(“Cross-Origin-Resource-Policy”,> “same-origin”)})

クロスオリジンリソースポリシーは、任意のリソースを保護できるオプトインレスポンスヘッダーです。ブラウザがMIMEタイプをスニフィングする必要はありません。 — MDNドキュメント

クロスオリジン組み込みポリシー(COEP)

COEPヘッダーは、(CORSまたはCORP経由で)許可されていないクロスオリジンリソースのロードを防止します 。 ヘッダーを強制するには「require-corp」を使用し、クロスオリジンドキュメントを取得できるようにするには「unsafe-none」を使用します。

const {Router} = require(‘@layer0/core/router’) new Router().get(“/:route”, ({setResponseHeader})={setResponseHeader(“Cross-Origin-Embedder-Policy”,> “require-corp”)})

クロスオリジンオープナーポリシー(COOP)

COOPヘッダーを適用すると、トップレベルのドキュメントの参照コンテキストグループがクロスオリジンドキュメント間で共有されなくなります。 「same-origin」は、OAuthやPaymentなどのクロスオリジンウィンドウインタラクションを必要とする統合を破壊しますが、「same-origin-allow-popups」はSAMEORIGINからのポップアップのみとコンテキストを共有することを目的としています。

const {Router} = require(‘@layer0/core/router’) new Router() .get(“/:route”, ({setResponseHeader})={setResponseHeader(“Cross-Origin-opener-Policy”,> “same-origin-allow-popups”)})

リファラーポリシー

ユーザーがあるサイト(オリジン)から別のサイト(デスティネーション)に移動(リンクをクリック)すると、後者はユーザーのオリジンに関する情報を受け取ります。 Referrer-Policyヘッダーは、この情報のうち宛先で利用できる量を制御します。 Referrer-Policyのすべてのディレクティブについては、Referrer-Policy—HTTP | MDN(mozilla.org)を参照して ください。

const {Router} = require(“@layer0/core/router”) module.exports = new Router(“/”, ({setResponseHeader})={setResponseHeader(“Referrer-Policy”,> “origin-when-cross-origin”)})

権限ポリシー

独自のフレームおよびドキュメント内の任意のiframeでブラウザ機能を許可/拒否する機能を提供する実験的なHTTPヘッダー。 Referrer-Policyのすべてのディレクティブについては、Feature-Policy—HTTP | MDN(mozilla.org)を参照してください

const {Router} = require(“@layer0/core/router”) module.exports = new Router(“/”, ({setResponseHeader})={setResponseHeader(“Permissions-Policy”, “camera=() , microphone=()> , geolocation=()”);})

HTTP Strict Transport Security(HSTS)

HSTS Strict Transport Securityヘッダー

HTTP Strict-Transport-Security(HSTS)は、HTTPプロトコルを使用するのではなく、HTTPSのみを使用してWebサイトをロードするようにブラウザに通知します。

const {Router} = require(‘@layer0/core/router’) new Router() .get(“/:route”, ({setResponseHeader})={setResponseHeader(“Strict-Transport-Security”,> “max-age=31536000;includeSubDomains”)})

HSTSでは、次のことが可能です。

  1. HTTPダウングレード攻撃(SSLストリッピング攻撃)からの保護
  2. 混合コンテンツ防御はデフォルトでHTTPSに切り替え

Layer0を使用すると、セキュリティヘッダーの実装がこれまで以上に簡単になります。 Layer0のEdgeJSを使用すると、使用しているフレームワークに関係なく、任意のWebサイトにセキュリティヘッダーを追加できます。 以下は、Layer0を介してSapperで構築されたWebサイトに関連するセキュリティヘッダーを実装しようとしています。

例: https://rishi-raj-jain-security-headers-example-default.layer0-limelight.link
GitHub: Rishi-Raj-Jain/security-headers-example
レポート:Security Headersレポートリンク

ディスカッション

Webアプリケーションを保護するために、関連するセキュリティヘッダーを追加してください。 Layer0を使用すると、Edgio Documentation – Securityで、シークレット、キャッシュポイズニング、基本認証の有効化など、さらに多くのことを行うことができます