AWS WAFでCookieを使ったアクセス制限をしてみた
前回似たようなケースでリクエストヘッダーを使ったアクセス制限を試してみたのですが、今回は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を追加するページを作成するだけで実現できます。アクセス制限の一例として誰かのお役に立てば幸いです。