share facebook facebook twitter menu hatena pocket slack

2016.08.29 MON

AWS WAFでHost Header +IP Addressでアクセス制限してコミュ症ウェッブアプリケーションを作ろう

岸上 健太郎

WRITTEN BY 岸上 健太郎

俺です。コミュ症です。

最近EC2原人を脱却すべくAPI Gatewayのドキュメントを読んで電卓アプリケーションを作りました。

作成した電卓アプリケーションを俺の考えた最強のドメイン名でアクセスできるようにして、最強のアクセス制限を設定したいと思います。

図は端折ります。

API GatewayとLambdaの準備

API Gatewayのドキュメント に従って作成します。

コレを読んで手を動かせば誰でもサーバレス童貞を捨てることができます。最高。

Route53の準備

かっこいいやつを設定しましょう

SSL証明書の準備

AWS WAFはCloudFrontのトラフィック制限サービスなのでCloudFrontを準備します。
CFに設定するSSL証明書はACMで準備します。

バージニアリージョン(us-east-1)に *.gluerecord.oreda.be という名前で準備しました。

CloudFrontの準備

  • CloudFrontディストリビューションを一つ作成します。
  • ディストリビューションにACMで準備した証明書を設定しておきます。
  • 俺俺ドメインで利用するため以下の様なAlternate Domain Namesを設定しておきます
Alternate Domain Names 用途
apigw.gluerecord.oreda.be オフィスからアクセスできるAPI Gatewayアプリケーション用サブドメイン
unko.gluerecord.oreda.be EC2からアクセスできるAPI Gatewayアプリケーション用サブドメイン
saitei.gluerecord.oreda.be どこからもアクセス許可しないAPI Gatewayアプリケーション用サブドメイン(WAFのDefault Action挙動チェック用)

WAFの準備

こっから本題

WebACLの構成

1つのDistributionに対して1つのWebACLを設定します。

WebACLは複数のルールの集まりです。
こんな感じの構成になります。

WebACL
|
|--Order1.RuleA(Action Allow or Block)
|--Order2.RuleB(Action Allow or Block)
|--Order3.RuleN(Action Allow or Block)
|--Default Action Rule(Action Allow or Block)

WebACLのルールは以下のとおりとします。

  • Alternate Domain Name毎にAllowルールを作成する(saitei.gluerecord.oreda.beに対してルールは作らない)
  • デフォルトアクションはBlockにする

CFのエッジロケーションにのっちゃうのに拒否されるってどういうこと悔しいビクンビクンアプリケーションになるようルールを構成します。

Order Rule Name Allow/Block
1 apigw.gluerecord.oreda.be Allow
2 unko.gluerecord.oreda.be Allow
どのルールにもマッチしない場合 Default Action Block

Rule

WebACL内に作成するRuleは以下のとおりにします。

  • CloudFrontのAlternate Domain Names単位でルールを作成する
  • 各ルールはHostヘッダ判定のString MatchingとIP AddressをAnd条件で設定する

Conditionsの設定

今回必要なConditionはString MatchingとIP Addressです。
IP Addressは2016/8/15時点で/32またはClass単位でしか制限できません..
悲しい。

Rule1. apigw.gluerecord.oreda.be

Condition条件はAND条件とします。

Condition 条件
String Matching ホストヘッダがapigw.gluerecord.oreda.beに完全一致する
IP Address IPアドレスがオフィスのIP/32に一致する

参考画像

1a6f373d-99e7-fbe3-6401-79c5cb01863b

Rule2. unko.gluerecord.oreda.be
Condition 条件
String Matching ホストヘッダがunko.gluerecord.oreda.beに完全一致する
IP Address IPアドレスがEC2のEIP/32に一致する

参考画像

b2ebc0f5-4a90-8d57-689e-f61e5ac543e0

WAFをCloudFront Distributionへの関連付け

以下の作成/設定が完了したらWebACLをCloudFront Distributionへ関連付けます

  • Rule作成
  • Conditions設定
  • WebACLにRule順序設定

WebACLのAWS resources using this web ACLより関連付けすることができます。

動作確認

オフィスからのアクセス

a074214b-5cdd-a9f3-7bd7-af175a127ca6

EC2からのアクセス

87055213-48cc-016c-3fae-ea9feaadd3c7

EC2にしか許可してないAlternate Domain NamesへオフィスIPからアクセス

見事弾かれました。

3708ff05-e9f7-765e-a79b-22bca369b57c

Default Actionのチェック

どのルールにもマッチしないDefault ActionはBlockです。
Allow ActionとなってないルールにマッチするAlternate Domain Namesへのアクセスは、弾かれるはずです。
こんな感じで弾くことができました。

5e517b78-f3cb-5b0a-fc82-33e5f9792344

API Gatewayで作成した1つのWebアプリケーションを、複数のサブドメインで提供したいけどそれぞれ提供先からのみ許可するようにアクセス制限かけたいなーってときに使えますね。

おわり。

元記事はこちら

AWS WAFでHost Header +IP Addressでアクセス制限してコミュ症ウェッブアプリケーションを作ろう

岸上 健太郎

岸上 健太郎

頑張るぞ!