AWS WAFでCookieを使ったアクセス制限をしてみた

アクセス制限としてIP制限が利用できない場合に、AWS WAFで独自に追加したCookieの値でアクセス制御を試してみました。IP制限が利用できない場合、開発環境などでアクセス制限をかけたい時にご利用ください。
2021.07.21

前回似たようなケースでリクエストヘッダーを使ったアクセス制限を試してみたのですが、今回はCookieを使ったアクセス制限をしてみました。

IPが固定ではない環境からアクセス制限をかけたい、というケースを想定して「Cookieに特定の値が含まれていれば許可する」というパターンでアクセス制限を試してみました。

リクエストヘッダーによる制限はブラウザからアクセスする場合、Chromeなどブラウザの拡張機能を利用する前提となってしまうため、社内ポリシー上利用しづらい時こともあります。

そんなときにCookieを使ったアクセス制限を検討してみてください。

構成

今回はWAF-CloudFront-S3という構成で試していきます。

表示したい静的なコンテンツをS3に保存しておき、特定のCookieが含まれている場合のみ表示できるようにしていきます。

Cookieの追加方法

一番簡単な方法はChromeなどの拡張機能で追加なのですが、今回は拡張機能を利用できない前提でCookieを付与するためのページをS3に用意してみます。

Cookieの追加用ページをS3のパスabcdefghijk/index.htmlとして用意し、そのページだけはWAFのアクセス制限をかけない状態にしておきます。

Cookie発行用のページはアクセス制限をしておらず、誰でも参照可能な状態となってしまうため配置するパスは第三者からは分からないような複雑なものにしておきましょう。今回は分かりやすくabcdefghijkとしています。

上記のCookie付与の仕組みがあれば、Cookieの発行ページURLを知っている人のみにアクセスを制限できます。

やってみる

S3バケット作成

まずはアクセス先となるS3バケットを作成します。 バケット名以外はデフォルトで作成しました。

CloudFrontの作成

CloudFrontのディストリビューションを作成します。オリジンに作成したバケットを指定して、OAIの設定を追加しましょう。その他はデフォルトのまま作成します。

S3にアクセス確認用のページをアップロードして正しく表示されるか確認すると、問題なくテストページが表示されました。

Web ACL作成

ここからアクセス制限をかけて、Cookieがない状態では先ほどのテストページにはアクセスできないようにWAFを設定していきます。Web ACLの作成からCloudFrontを指定します。

Cookieによるアクセス制限のルール

特定のCookieがある場合にアクセスを許可するルールを設定していきます。Cookieがない場合にはWAFから403エラーが返されることを確認します。

Ruleの追加からAdd my own rules and rule groupsを選択します。

ルール名はtest-cookie-access-restriction-ruleとして以下のように入力します。Cookieの中にaccess_id=e3b52dxxxxxxxxxxxxxという文字列が含まれていれば許可するようにしました。

String to matchの値はなるべく複雑なものにしておきましょう。

  • Inspect:Header
  • Header field name:cookie
  • Match type:Contains string
  • String to match:access_id=e3b52dxxxxxxxxxxxxx
  • Action:Allow

Cookie追加用ページの許可ルール

Cookie発行用のページだけはCookieが追加されていない状態でもアクセスできるようにしておく必要があるので、許可するためのルールを追加します。同じようにAdd my own rules and rule groupsから新しくルールを追加していきましょう。設定する項目は以下の通りです。

  • Inspect:URI path
  • Match type:Contains string
  • String to match:abcdefghijk
  • Action:Allow

ここまで追加できたら、最後にデフォルトアクションをBlockにしてWeb ACLを作成しましょう。

ここまで追加できたら、先ほどの確認用ページにアクセスしてWAFによるブロックを確認しましょう。403 ERRORが返ってくれば指定されたCookieがないためブロックされていることを確認できます。

Cookie追加用ページ作成

S3にCookie追加用のページを追加します。

画面表示用のcookie.htmlとCookieを設定するcookie.jsファイルを用意しました。

cookie.htmlは単純にボタンを用意あるだけのページです。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>クッキー追加ページ</title>
        <script type="text/javascript" src="cookie.js"></script>
    </head>
    <body>
        <button id="cookie">Cookie追加</button>
    </body>
</html>

cookie.jsはボタンがクリックされたときにCookieを書き込む関数を定義しています。今回はkeyをaccess_id、valueをe3b52dxxxxxxxxxxxxxxxxxxxxxxxとしました。

window.onload = function() {
    document.getElementById("cookie").onclick = setCookie;
}

function setCookie() {
    document.cookie = "access_id=e3b52dxxxxxxxxxxxxxxxxxxxxxxx;path=/";
}

今回はページ全体に対して付与するためpath=/としています。Cookieの書き込みについて詳細はこちらをご確認ください。

フォルダabcdefghijkを作成して、この2ファイルをS3にアップロードします。

Cookieを追加してアクセス

それでは実際にアクセス制御ができているのか確認していきます。まずはCookieを追加する必要があるので、Cookie発行用にアップロードしたページへアクセスします。このページのパスはWAFでは許可するルールを追加しているため問題なくアクセスできます。

Cookie追加ボタンをクリックすると、次回以降Cookieが追加された形でアクセスできるようになります。

試しにWAF設定後アクセスできなかったテストページへアクセスしてみると、問題なくページが表示できていることを確認できました。

Cookieを削除するとWAFでブロックされることを確認できるので、動作確認したいかたはブラウザのCookieを削除してみてください。

まとめ

AWS WAFのルールを使用してCookieを使ったアクセス制御を試してみました。リクエストヘッダーによる制限とは違い、拡張機能を使わずCookieを追加するページを作成するだけで実現できます。アクセス制限の一例として誰かのお役に立てば幸いです。