AWS WAFにてIP制限かけてみた。(EC2 + ALB + WAF)

#はじめに
こんばんは、山田です。
今回は、AWS WAFについて検証していきたいと思います。

#全体構成図
全体構成図は以下の通りです。
クライアントVPNからの接続は許可し、パブリックサブネットに配置されているEC2からのアクセスは拒否するように設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/3b759bed-0beb-a750-3ef1-fa2c184941a1.png)

|接続方法|接続可否|
|---|---|
|User → クライアントVPN → ALB| 〇|
|User → IGW → EC2 → ALB |×|

##構築手順
下記より、構築手順について記載していきます。

##前提条件
今回は、クライアントVPN、WAFの構築に焦点を当てて記載していきます。
なので、EC2,ALB等は構築済みとします。
また,EC2はWindowsServerとしIISの機能は追加済みとします。

##クライアントVPNの構築
AWS管理コンソール -> VPC -> クライアントVPNエンドポイント -> クライアントVPNエンドポイントの作成をクリックします。

|設定項目|設定値|備考|
|---|---|---|
|名前|yamada-test-clientvpn|-|
|クライアントCIDR|10.2.0.0/22|※/22以上でVPCのCIDR範囲と被らないように注意!|
|サーバ証明書|ACMに登録してある証明書選択する|-|
|認証オプション|相互認証|
|DNSサーバー|10.1.0.2|※AWSのDNSサーバーはVPCのCIDR範囲に+2した値になる。<br>今回のVPCのCIDR範囲は10.1.0.0/24を指定したので、DNSサーバーは10.1.0.2になる。
              
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/6d651939-5b4f-50c4-8409-08286791be4d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/6730c3de-cf61-19ea-98fd-8f6143e29458.png)

###ターゲットネットワークの選定
AWS管理コンソール -> VPC -> クライアントVPNエンドポイント -> 関連付け ->関連付けをクリックします。
ターゲットネットワークの選択を行う。その際、注意点として、`/27以上のサブネットを指定する必要があります。`
今回は、ターゲットサブネットとして、`10.1.0.0/26`の範囲を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/c5dc53d8-e392-1093-790c-3c482de9d2f7.png)

###承認済みネットワークの選定
AWS管理コンソール -> VPC -> クライアントVPNエンドポイント -> 認証 -> 受信の認証をクリックします。
今回は、承認済みサブネットとして、`10.1.0.64/26`の範囲を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/61c84164-e888-e081-3efb-5ca1155a4803.png)

###クライアント設定ファイルのダウンロード
AWS管理コンソール -> VPC -> クライアントVPNエンドポイント -> クライアント設定のダウンロードをクリックします。
以下のようなファイルがダウンロードされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/69fac052-eb19-5f5c-19be-cadf28cf9a98.png)

末尾に以下の記載を追加します。
`cert部分：クライアント証明書本文`
`key部分：クライアント証明書のプライベートキー`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/295b9571-92be-b561-ee4c-009444d35608.png)

###AWS VPN CLientのダウンロード
以下のURLより、AWS VPN Clientをダウンロードします。

https://aws.amazon.com/jp/vpn/client-vpn-download/

以下のようなアイコンが表示されるのでダブルクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/2fac9f23-b3bc-8552-04b2-39702a05fb64.png)

ファイル -> プロファイルの管理 -> プロファイルを追加をクリックします。
表示名は人で入力し、VPN設定ファイルは先ほどダウンロードしたファイルを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/16e33a02-3b0a-d62c-0626-27cedbea1d68.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/078c8514-c541-0c7a-5b96-0a2a018c4339.png)

接続をクリックします。以下のように表示されれば接続完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/2b9de2e8-758c-6b53-afdf-f048e4be42f8.png)

#WAF構築手順
今回は、IPによるアクセス制限をかけてみたいと思います。

|CIDR範囲|アクセス可否|備考|
|---|---|---|
|10.1.0.0/26|〇|ターゲットネットワークのCIDR範囲|
|10.1.0.128/26|X|パブロックサブネットのCIDR範囲|

###IPホワイトリスト設定
AWS管理コンソール -> WAF -> IP sets -> Create Ip Setをクリックします。
ホワイトリストに登録したIP範囲を指定します。
今回は、`10.1.0.0/26`をホワイトリストとして登録しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/316c1d0f-8cf4-20de-072b-166610c4b7da.png)

###Web ACLsの作成
AWS管理コンソール -> WAF -> Web ACLs -> Create web ACLをクリックします。
name等を入力し、AWS resourceの選択では今回は`ALB`を選択します
。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/774895c7-9cb3-e6d2-012f-0dd7d5c2712f.png)

Add rules -> Add my own rules and rule groupsをクリックします。
以下のような画面が表示されます。

|設定項目|設定値|備考|
|---|---|---|
|Rule type|IP set|-|
|Name|yamada-test-rule|-|
|IP set|yamada-test-ipset|先ほど作成したIPホワイトリストを選択する。|
|Action|Allow|-|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/36959955-0acd-ed62-05e4-dbd425c7cb30.png)

ルールにマッチしなかったリクエストはブロックするように設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/844e7cd1-b83d-718a-1597-524aa10cb108.png)

上記の設定値でWeb ACLsを作成します。

#動作確認
クライアントVPNに接続し、`<ALBのDNS名>`に接続します。
例)internal-yamada-test-alb-1082603350.ap-northeast-1.elb.amazonaws.com

以下のように表示されればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/a3f7cc36-a7ed-bc96-5398-a7764617506f.png)

次にパブリックサブネットに配置されているEC2に接続し、`<ALBのDNS名>`に接続する。
例)internal-yamada-test-alb-1082603350.ap-northeast-1.elb.amazonaws.com

以下のようにアクセスが拒否されればOKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1096361/b586d610-edb1-8f54-6ae5-469af062d3a7.png)