動的にセキュリティヘッダーを付与するsellAWS,CloudFront,lambda春の陽気を感じられる良い季節になりました。天気の良い日に鴨川で日向ぼっこをしたい、そんな今日この頃。Lambda@Edgeを使って動的にセキュリティヘッダーを付与する機能についてまとめてみようと思います。自社サイトがクリックジャッキングによる攻撃を受けないようにしたいという課題意識で、対策を考えてみたいと思います。自社で公開しているウェブサイト1がある。問題意識このページを、外部の悪意を持ったサイト上で<iframe>による埋め込みをされたくない。その他要件しかし、一部の許可したサイトでは<iframe>による埋め込みによって自社のウェブサイトのページを利用して良いという形を取りたい。このような埋め込みを許可するサイトは固定ではなく、後で変えられるようにしたい。ヘッダーContent-Security-Policyのframe-ancestorsディレクティブに、埋め込みを許可するサイトを指定することで、上記のような対策を施すことができます。使う方法があることを知り、実際に検証をしてみました。CloudFrontの機能で、アプリケーションのユーザーに近いロケーションでコードを実行できるため、パフォーマンスが向上し、待ち時間が短縮されます。世界中の複数のロケーションでインフラストラクチャをプロビジョニングまたは管理する必要はありません。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。エッジサーバー上でコードを実行することができます。レスポンスを返す際にセキュリティヘッダーを付与するというものがあり、今回はそのアプローチを取ってみました。アクセスをする必要があったため、採用を見送りました。両者の違いについては、公式ドキュメントをご参照ください。検証内容の具体的な説明それでは、具体的に取り組んだ構成やコードについて説明をしていきます。説明にできるだけ絞る形で、簡略化したものを説明したいと思います。静的コンテンツを配置している。静的コンテンツを配信する。frame-ancestorsで埋め込みを許可したいサイトの情報が記録されている。読み取った自社サイトの情報をレスポンスヘッダーにセットする。起動できるイベントは4種類あります。イベントにつきましては、公式ドキュメントをご参照ください。実現してみたいと思います。関数をデプロイします。実際の構築手順の細かな点は公式ドキュメントを参照してください。決め打ちにしています。決めることが実際の利用シーンでは必要になるかと思います。許可したいサイトの情報を取得するためのロジックを、システムの要件に応じて適切に決めることが必要になるかと思います。セキュリティ対策をやってみた紹介記事の資料です。タグを配置し、埋め込みが禁止されることを確認します。</body></html><iframe>によって、自社のサイトのページを埋め込んで表示しようと試みています。いった操作を制御したい!というのがそもそもの目的でした。アクセスしてみましょう〜。許可したいサイトとして登録していたことがどうやら効いている気がしますね。詳しくみていきましょう。上記ページを開きました。値を変更して、再度ページを開いてみましょう。frame-ancestorsにセットされております。ブラウザのログも確認してみると、以下のようなログが出力されており、実際にこのヘッダーの値が効いており、<iframe>による表示を禁止できていることが確認できました。関数が実行される場所が、アクセス元の地理的位置によって変わりうるということでした。詰まった点の解決1点目については、公式ドキュメントに以下の記載がありました。ログストリームを作成します。