Upgrade to Pro — share decks privately, control downloads, hide ads and more …

HTTP ヘッダ観点で見る CloudFront

HTTP ヘッダ観点で見る CloudFront

4hei4hei

June 27, 2024
Tweet

More Decks by 4hei4hei

Other Decks in Technology

Transcript

  1. HTTP ヘッダ観点で見る CloudFront 〜 NRI ネットコム TECH AND DESIGN STUDY

    #35 〜 2024 年 06 ⽉ 27⽇ NRI ネットコム株式会社 NT システム事業二部 西 洋平
  2. 1 Copyright(C) NRI Netcom, Ltd. All rights reserved. n 西

    洋平 (NISHI Yohei) l NRI ネットコム株式会社 NT システム事業二部 (@Osaka) n Web システム開発運用チームのインフラ担当 l IaC や SaaS による運用とシステム改善 l たまにサーバレスアプリケーション開発 自己紹介 https://jawsug-asa.connpass.com/event/291918/ https://tech.nri-net.com/entry/automation_with_stepfunctions https://nrinetcom.connpass.com/event/307324/
  3. 2 Copyright(C) NRI Netcom, Ltd. All rights reserved. nAWS マネージドな、グローバル展開されている

    CDN サービス n世界中に存在する Edge location によって高信頼 / 低遅延な Web コンテンツ配信を実現する Amazon CloudFront (CloudFront) おさらい
  4. 3 Copyright(C) NRI Netcom, Ltd. All rights reserved. nHTTP メッセージにおけるリクエスト

    / レスポンスの詳細情報、メタ情報や追加情報を表現 n以下はサーバ (www.google.com) からのレスポンスに付与されているヘッダ HTTP ヘッダおさらい
  5. 4 Copyright(C) NRI Netcom, Ltd. All rights reserved. nCloudFront に関わる

    HTTP ヘッダの用例では、取り扱う情報は以下のケースであることが多い l リクエスト時の処理で利用されることが多いもの l リクエストに対するレスポンスに付与される代表的な HTTP ヘッダ (主にセキュリティ用途) CloudFront と HTTP ヘッダ ヘッダ 表現する情報や役割 X-Forwarded-For リクエストが経由してきた IP アドレス Authorization Basic 認証用の ユーザ ID / Password User-Agent リクエスト元のユーザエージェント (ブラウザ情報等) ヘッダ 表現する情報や役割 HTTP Strict Transport Security (HSTS) Web サイト側がブラウザに HTTP 通信の代わりに HTTPS 通信を課す Content Security Policy (CSP) XSS / データインジェクション攻撃等の 検知を有効化する Referrer-Policy リクエストされているページが どのページ / URL から辿られたかを示す
  6. 5 Copyright(C) NRI Netcom, Ltd. All rights reserved. n接続元 IP

    アドレスに応じたアクセス制限を⾏いたい場合 nWeb サイト / サービスに Basic 認証を施したい場合 nオリジンへの接続を制限したい場合 nViewer へのレスポンスに特定のヘッダを付与したい場合 nヘッダに応じたルーティングを⾏いたい場合 CloudFront において HTTP ヘッダを活用する事例 (代表的なもの)
  7. 6 Copyright(C) NRI Netcom, Ltd. All rights reserved. nAWS WAF

    による保護が可能だが、それ以外の方法を採りたい場合 l 開発の都合で一時的に細やかなケアをしたい、ルール数の制約があるので厳しい、等 nCloudFront では CloudFront Functions や Lambda@Edge による制限が可能 接続元 IP アドレスに応じたアクセス制限を行いたい場合
  8. 7 Copyright(C) NRI Netcom, Ltd. All rights reserved. nAWS WAF

    による保護が可能だが、それ以外の方法を採りたい場合 l 開発の都合で一時的に細やかなケアをしたい、ルール数の制約があるので厳しい、等 nCloudFront では CloudFront Functions や Lambda@Edge による制限が可能 接続元 IP アドレスに応じたアクセス制限を行いたい場合 X-Forwarded-For: xx.xx.xx.xx HTTP ヘッダ X-Forwarded-For に含まれる IP アドレスに応じてアクセスを制御する
  9. 8 Copyright(C) NRI Netcom, Ltd. All rights reserved. nAWS WAF

    による保護が可能だが、それ以外の方法を採りたい場合 l 開発の都合で一時的に細やかなケアをしたい、ルール数の制約があるので厳しい、等 nCloudFront では CloudFront Functions や Lambda@Edge による制限が可能 接続元 IP アドレスに応じたアクセス制限を行いたい場合 CloudFront-Viewer-Address: xx.xx.xx.xx:yy CloudFront 用に存在する CloudFront-Viewer-Address ヘッダも利用可能 CloudFront で接続元 (Viewer) の IP アドレス / ポートを確認できるヘッダ
  10. 9 Copyright(C) NRI Netcom, Ltd. All rights reserved. nWeb サイトでの

    ID / Password 情報を Authorization ヘッダとして付与し、リクエストを送る nCloudFront においては CloudFront Functions や Lambda@Edge で実現可能 Web サイトに Basic 認証を施したい場合 Authorization: xxxxxxxx CloudFront Functions / Lambda@Edge でヘッダで付与された情報を判定する
  11. 10 Copyright(C) NRI Netcom, Ltd. All rights reserved. nヘッダの取り扱いは必要な処理とその実行タイミングがそれぞれ存在する n各タイミングで

    CloudFront Functions や Lambda@Edge で処理を実行させる 実装 / 設定におけるポイント ~ CloudFront Functions / Lambda@Edge ~ ViewerRequest CloudFront に ACL / Basic 認証を施したい、ヘッダベースのルーティングを実現したい場合など
  12. 11 Copyright(C) NRI Netcom, Ltd. All rights reserved. nヘッダの取り扱いは必要な処理とその実行タイミングがそれぞれ存在する n各タイミングで

    CloudFront Functions や Lambda@Edge で処理を実行させる 実装 / 設定におけるポイント ~ CloudFront Functions / Lambda@Edge ~ OriginRequest CloudFront からオリジンへのリクエストでヘッダを操作したい場合など
  13. 12 Copyright(C) NRI Netcom, Ltd. All rights reserved. nヘッダの取り扱いは必要な処理とその実行タイミングがそれぞれ存在する n各タイミングで

    CloudFront Functions や Lambda@Edge で処理を実行させる 実装 / 設定におけるポイント ~ CloudFront Functions / Lambda@Edge ~ Origin Response / Viewer Response ビューワー / オリジンレスポンスでカスタムヘッダやセキュリティ用途のヘッダを操作したい場合など
  14. 13 Copyright(C) NRI Netcom, Ltd. All rights reserved. n CloudFront

    Funitons (CF2) と Lambda@Edge (L@E) にはそれぞれ制約や管理コストが存在する l ◯: 実⾏可能, ×: 実⾏不可能 実装 / 設定におけるポイント ~ CloudFront Functions / Lambda@Edge ~ CF2 L@E 主なヘッダ処理用途 ViewerRequest ◯ ◯ • ACL • Basic 認証 OriginRequest × ◯ • ヘッダ操作 OriginResponse × ◯ • ヘッダ操作 ViewerResponse ◯ ◯ • ヘッダ操作
  15. 14 Copyright(C) NRI Netcom, Ltd. All rights reserved. n CloudFront

    Funitons (CF2) と Lambda@Edge (L@E) にはそれぞれ制約や管理コストが存在する l ◯: 実⾏可能, ×: 実⾏不可能 実装 / 設定におけるポイント ~ CloudFront Functions / Lambda@Edge ~ CF2 L@E 主なヘッダ処理用途 ViewerRequest ◯ ◯ • ACL • Basic 認証 OriginRequest × ◯ • ヘッダ操作 OriginResponse × ◯ • ヘッダ操作 ViewerResponse ◯ ◯ • ヘッダ操作 L@E は全タイミングをトリガに起動できる CF2 は実行時間やコードサイズに制約はあるが、実行費用が L@E の 1/6
  16. 15 Copyright(C) NRI Netcom, Ltd. All rights reserved. n CloudFront

    Funitons (CF2) と Lambda@Edge (L@E) にはそれぞれ制約や管理コストが存在する l ◯: 実⾏可能, ×: 実⾏不可能 実装 / 設定におけるポイント ~ CloudFront Functions / Lambda@Edge ~ CF2 L@E 主なヘッダ処理用途 ViewerRequest ◯ ◯ • ACL • Basic 認証 OriginRequest × ◯ • ヘッダ操作 OriginResponse × ◯ • ヘッダ操作 ViewerResponse ◯ ◯ • ヘッダ操作 L@E は全タイミングをトリガに起動できる CF2 は実行時間やコードサイズに制約はあるが、実行費用が L@E の 1/6 → CF2 で可能な処理は CF2 で、複雑性が高い処理やタイミングに制約があれば L@E
  17. 16 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストに付与されたカスタムヘッダで オリジンへのリクエストを操作

    オリジンへの接続を制限したい場合 X-xxxxx: “From CloudFront” X-xxxxx: “From viewer” CloudFront から来たリクエストのみ許可するように オリジンを設定する
  18. 17 Copyright(C) NRI Netcom, Ltd. All rights reserved. nヘッダによる制御の他にも……? l

    オリジンが S3 の場合 • CloudFront Origin Access Control / Identity (OAC / OAI) 機能で実現可能 (こちらの方が王道) l オリジンが ALB の場合 • CloudFront のマネージドプレフィックスを利用することで実現可能 • AWS WAF を ALB へアタッチしてヘッダ制御も可能 オリジンへの接続を制限したい場合 HTTP ヘッダ X-Forwarded-For に含まれる IP アドレスに応じてアクセスを制御する OAC / OAI による制限
  19. 18 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストに付与された特定ヘッダの情報を基に、対応する オリジンへルーティングする

    n複数のオリジンやサービスが存在する場合、ヘッダに応じたルーティングが可能 HTTP ヘッダベースのルーティング
  20. 19 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストに付与された特定ヘッダの情報を基に、対応する オリジンへルーティングする

    n複数のオリジンやサービスが存在する場合、ヘッダに応じたルーティングが可能 HTTP ヘッダベースのルーティング e.g. x-service: オリジン B リクエストに付与されたヘッダを確認 → ヘッダの内容に応じた オリジンへリクエストを流す
  21. 20 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストに付与された特定ヘッダの情報を基に、対応する オリジンへルーティングする

    n複数のオリジンやサービスが存在する場合、ヘッダに応じたルーティングが可能 HTTP ヘッダベースのルーティング リクエストに付与されたヘッダを確認 → ヘッダの内容に応じた オリジンへリクエストを流す ヘッダと内容に応じて振り分ける先を制御したいケース等で活用 e.g. x-service: オリジン B
  22. 21 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストに付与された特定ヘッダの情報を基に、対応する オリジンへルーティングする

    n複数のオリジンやサービスが存在する場合、ヘッダに応じたルーティングが可能 HTTP ヘッダベースのルーティング ALB が CloudFront の オリジンとなる場合 ヘッダを伝搬させて ALB リスナのカスタムルールで振り分けも可能 e.g. x-service: オリジン B e.g. x-service: オリジン B
  23. 22 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストに付与された特定ヘッダの情報を基に、対応する オリジンへルーティングする

    n複数のオリジンやサービスが存在する場合、ヘッダに応じたルーティングが可能 HTTP ヘッダベースのルーティング ALB が CloudFront の オリジンとなる場合 ヘッダを伝搬させて ALB リスナのカスタムルールで振り分けも可能 e.g. x-service: オリジン B e.g. x-service: オリジン B
  24. 23 Copyright(C) NRI Netcom, Ltd. All rights reserved. n オリジンへのヘッダ伝搬には以下のポリシを

    CloudFront で設定する必要がある l キャッシュポリシ (CP) • CloudFront にキャッシュさせるクエリ文字列や HTTP ヘッダ、Cookie を管理する l オリジンリクエストポリシ (ORP) • CloudFront がオリジンへオブジェクト取得リクエストを送る際に送信する情報を管理する 実装 / 設定におけるポイント ~ オリジンへのヘッダ伝搬 ~
  25. 24 Copyright(C) NRI Netcom, Ltd. All rights reserved. n オリジンへのヘッダ伝搬には以下のポリシを

    CloudFront で設定する必要がある l キャッシュポリシ (CP) • CloudFront にキャッシュさせるクエリ文字列や HTTP ヘッダ、Cookie を管理する l オリジンリクエストポリシ (ORP) • CloudFront がオリジンへオブジェクト取得リクエストを送る際に送信する情報を管理する 実装 / 設定におけるポイント ~ オリジンへのヘッダ伝搬 ~ これらの組み合わせでビュワーリクエストからオリジンリクエストへ伝搬されるヘッダが決定される
  26. 25 Copyright(C) NRI Netcom, Ltd. All rights reserved. n CP

    と ORP の組み合わせでビュワーリクエストからオリジンリクエストへ伝搬されるヘッダが決定される l 以下の表は縦がCP / 横が ORP 実装 / 設定におけるポイント ~ オリジンへのヘッダ伝搬 ~ なし ALL (全て許可) 許可リスト ブロックリスト なし デフォルト以外は 含まない 全ての値 ORP で 許可しているものだけ ORP で ブロックしたもの以外 ALL (全て許可) すべての クエリ⽂字列と Cookie ※ CP で 全ヘッダは操作できない 全ての値 すべての クエリ⽂字列と Cookie & ORP で 許可しているヘッダ すべての クエリ⽂字列と Cookie ※ 優先度は CP > ORP ブロック設定 許可リスト CP で 許可しているものだけ 全ての値 いずれかで 許可されているものだけ CP で 許可しているものすべて ※ 優先度は CP > ORP ブロック設定 ブロックリスト ※ ヘッダのブロックは不可 CP でブロックしてない クエリ⽂字列と Cookie ※ ヘッダはデフォルトのみ 全ての値 ORP で 許可しているものだけ ORP で ブロックされていないもの
  27. 26 Copyright(C) NRI Netcom, Ltd. All rights reserved. n CP

    と ORP の組み合わせでビュワーリクエストからオリジンリクエストへ伝搬されるヘッダが決定される l 以下の表は縦がCP / 横が ORP 実装 / 設定におけるポイント ~ オリジンへのヘッダ伝搬 ~ なし ALL (全て許可) 許可リスト ブロックリスト なし デフォルト以外は 含まない 全ての値 ORP で 許可しているものだけ ORP で ブロックしたもの以外 ALL (全て許可) すべての クエリ⽂字列と Cookie ※ CP で 全ヘッダは操作できない 全ての値 すべての クエリ⽂字列と Cookie & ORP で 許可しているヘッダ すべての クエリ⽂字列と Cookie ※ 優先度は CP > ORP ブロック設定 許可リスト CP で 許可しているものだけ 全ての値 いずれかで 許可されているものだけ CP で 許可しているものすべて ※ 優先度は CP > ORP ブロック設定 ブロックリスト ※ ヘッダのブロックは不可 CP でブロックしてない クエリ⽂字列と Cookie ※ ヘッダはデフォルトのみ 全ての値 ORP で 許可しているものだけ ORP で ブロックされていないもの
  28. 27 Copyright(C) NRI Netcom, Ltd. All rights reserved. n CP

    と ORP の組み合わせでビュワーリクエストからオリジンリクエストへ伝搬されるヘッダが決定される l 以下の表は縦がCP / 横が ORP 実装 / 設定におけるポイント ~ オリジンへのヘッダ伝搬 ~ なし ALL (全て許可) 許可リスト ブロックリスト なし デフォルト以外は 含まない 全ての値 ORP で 許可しているものだけ ORP で ブロックしたもの以外 ALL (全て許可) すべての クエリ⽂字列と Cookie ※ CP で 全ヘッダは操作できない 全ての値 すべての クエリ⽂字列と Cookie & ORP で 許可しているヘッダ すべての クエリ⽂字列と Cookie ※ 優先度は CP > ORP ブロック設定 許可リスト CP で 許可しているものだけ 全ての値 いずれかで 許可されているものだけ CP で 許可しているものすべて ※ 優先度は CP > ORP ブロック設定 ブロックリスト ※ ヘッダのブロックは不可 CP でブロックしてない クエリ⽂字列と Cookie ※ ヘッダはデフォルトのみ 全ての値 ORP で 許可しているものだけ ORP で ブロックされていないもの
  29. 28 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストでの付与やルーティングだけでなく、 Viewer

    へのレスポンスヘッダも制御可能 nレスポンスヘッダポリシで Viewer レスポンスに特定の HTTP ヘッダを付与することが可能 Viewer へのレスポンスにおける HTTP ヘッダの取り扱い
  30. 29 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストでの付与やルーティングだけでなく、 Viewer

    へのレスポンスヘッダも制御可能 nレスポンスヘッダポリシで Viewer レスポンスに特定の HTTP ヘッダを付与することが可能 Viewer へのレスポンスにおける HTTP ヘッダの取り扱い レスポンスヘッダポリシで付与できる HTTP ヘッダ例 • HTTP セキュリティヘッダ • HSTS、X-XSS-Protection、Content-Security-Policy…… • CORS 有効化のためのヘッダ • Access-Control-Allow-Origin • ブラウザ側のキャッシュ制御ヘッダ • Cache-Control
  31. 30 Copyright(C) NRI Netcom, Ltd. All rights reserved. nリクエストでの付与やルーティングだけでなく、 Viewer

    へのレスポンスヘッダも制御可能 nレスポンスヘッダポリシで Viewer レスポンスに特定の HTTP ヘッダを付与することが可能 Viewer へのレスポンスにおける HTTP ヘッダの取り扱い CloudFront Functions や Lambda@Edge によるヘッダ付与も可能
  32. 31 Copyright(C) NRI Netcom, Ltd. All rights reserved. nCloudFront の

    Web コンテンツ配信で HTTP ヘッダを活用することで幅広い機能を提供可能 nヘッダで扱われる情報は、CloudFront に関わる用例では以下のような情報であることが多い l 接続元 IP アドレス l ID / Password l User-Agent l セキュリティ用途のヘッダ l 固有のヘッダ nCloudFront Functions / Lambda@Edge や CloudFront 設定でのヘッダ操作で実現する n実現する内容によっては、 オリジンとなるサービスへのヘッダ伝搬設定が必要になる おわりに