テックブログ

AWS WAFで海外IPからのアクセスを遮断する

お疲れ様です。MKです。 業務を行っているうえで、最近「海外IPからのアクセスを遮断してほしい」という要望が多く感じられるため、

AWS WAFとは?

1.AWS WAF とは何ですか?

AWS WAF はお客様が定義する条件に基づきウェブリクエストを許可、ブロック、または監視 (カウント) するルールを設定し、ウェブアプリケーションを攻撃から保護するのを助ける Web アプリケーションファイアウォールです。

https://aws.amazon.com/jp/waf/faq/

要は、普段皆さんがPCやサーバで設定しているファイアウォールの機能をAWS側で提供してくれるサービスの一つですね。
Amazon CloudFrontやApplication Load Balancer(ALB)やAmazon API Gatewayといったリソースに
設定をすることで、直接サーバへアクセスが届く前に処理を行ってくれるところが非常に嬉しい点です。

AWS WAFの使い方

AWS WAFを使用する為には、まず「Web ACLs」というルールを作る必要があります。 どういったIPからのアクセスを遮断したいか、等ですね。

そして、作成したルールをAmazon CloudFrontやApplication Load Balancer(ALB)等に設定し アクセスの制御を行うイメージです。

とは言っても、言葉だけだと中々想像がし辛いと思いますので「日本国内IPからのアクセスのみを許可する」ルールを実際に作ってみましょう。

AWS WAFを使用する為には、まず「Web ACLs」というルールを作る必要があります。

どういったIPからのアクセスを遮断したいか、等ですね。

Web ACLsを作ってみよう

それではまず、Web ACLsを作ってみましょう。 AWSのコンソール画面にログインしていただき、検索窓で「WAF & Shield」と入力し「WAF & Shield」サービスを開いてください。

そしたら、「Web ACLs」→「Create web ACL」の順に選択していただき、「Web ACLs」の作成に入ります。

上記の画面が表示されたら、画像の通りに下記の項目を入力します。 今回のルールの名前は分かりやすく「AllowJapanOnly」にします。

▼Web ACL details
・NAME
AllowJapanOnly

・Resource type
「Regional resources (Application Load Balancer, API Gateway, AWS AppSync)」を選択

・Region
「Asia Pacific (Tokyo)」を選択

▼Associated AWS resources - optional
今回はApplication Load Balancerに設定をしたいと思いますので「Add AWS resources」をクリックし
Application Load Balancerにチェックを入れて、対象ロードバランサーを選択し(今回はTESTを選択)
「Add」をクリック

上記を選択し、「Next」をクリック

次のページへ進んだら、今度は下記の項目の設定をしましょう。

▼Rules
・Add Rules
「 Add my own rules and rule groups」を選択

・Rule builder
こちらの項目にチェック

▼Rule
・Name
AllowJapanOnly

・Type
「Regular rule」を選択

・If a request
「matches the statement」を選択

▼Statement
・Inspect
プルダウンより「Originates from a country in」を選択

・Country codes
「Japan - JP」を選択
今回は、国内IPからのアクセスのみ許可をする設定にしたいので上記を選びましょう。

・IP address to use to determine the country of origin
「Source IP address」にチェック

▼Action
「Allow」にチェック

今回は、国内IPからのアクセスのみを許可したいので「Allow」にチェックを入れます。

上記の設定が出来ましたら、「Add rule」をクリックし、次のページへいきましょう。

上記、3つの画面でそれぞれ設定内容を確認し「Next」をクリック

上記、ページにて最終確認ができましたら、「Create web ACL」をクリックしてルールの完成です!

実際にアクセスをして確認をしてみよう

今回、日本のIPと海外IP(ロンドンIP)の2つのサーバを用意しましたので、実際に「curl」コマンドにて、アクセスをして動作を確認してみましょう。

▼日本IPのサーバからのアクセスの場合

[mk@test ~]$ curl -I  http://xx.xx.xx.xx
HTTP/1.1 200 OK
Date: Wed, 28 Sep 2022 23:29:42 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 10
Connection: keep-alive
Server: Apache/2.4.54 ()
Upgrade: h2,h2c
Last-Modified: Tue, 20 Sep 2022 23:06:44 GMT
ETag: "a-5e923e1bdf796"
Accept-Ranges: bytes

こちらのアクセスは当然、ステータス200 が返ってきてアクセスが正常に出来ていますね!

▼海外IP(ロンドンIP)のサーバからのアクセスの場合

[root@mk-test ~]# curl -I http://xx.xx.xx.xx
HTTP/1.1 403 Forbidden
Server: awselb/2.0
Date: Wed, 28 Sep 2022 23:31:07 GMT
Content-Type: text/html
Content-Length: 118
Connection: keep-alive

こちらの場合は、ステータス403 が返ってきてアクセスが出来ていない事が分かります。

リクエスト状況の確認

作成したWeb ACLのOverviewから、実際に許可/遮断したアクセスも確認が出来ます。

因みに、丁度よく?海外IPからのアタックを弾けている事も確認できました!

ちゃんと、中国IP(CN)やアメリカIP(US)を遮断出来ている事が分かりますね!

おまけ

どうせ海外IPを遮断するのであれば、.htaccessファイルに記載でもよいのでは? と思った方もいらっしゃるかと思います。

当然、それでも全然OKなのですがAWS WAFのメリットとして「サーバへ直接アクセスが届く前」に処理をしてくれるという点があります。

例えば、同じ様に.htaccessファイルに記載をして同じことをしようとした場合、ファイルの中身は恐らく何十万行という膨大な量になってしまうでしょう。

ただ、当然そうなると都度アクセスの度に処理が入ってしまう為、アクセス時間が遅くなってしまいますが、その点AWS WAFの場合「サーバへ直接アクセスが届く前」に処理をしてくれるため処理によって、著しくアクセス時間が変わることはありません。

試しに、下記に.htaccessファイルに記載した場合とAWS WAFを使った場合でアクセスの時間を比較してみました!

▼.htaccessファイル有の場合
※因みに.htaccessファイルの行数は10万行程度です

[mk@test ~]# wc -l /var/www/vhosts/mk/public_html/.htaccess
104753 /var/www/vhosts/mk/public_html/.htaccess

[root@mk-test ~]$ time curl -I http://xx.xx.xx.xx
HTTP/1.1 200 OK
Date: Wed, 28 Sep 2022 23:42:49 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 10
Connection: keep-alive
Server: Apache/2.4.54 ()
Upgrade: h2,h2c
Last-Modified: Tue, 20 Sep 2022 23:06:44 GMT
ETag: "a-5e923e1bdf796"
Accept-Ranges: bytes


real    0m0.106s
user    0m0.005s
sys     0m0.005s

▼AWS WAFの場合(.htaccessなし)

[root@mk-test ~]$ time curl -I http://xx.xx.xx.xx
HTTP/1.1 200 OK
Date: Wed, 28 Sep 2022 23:44:11 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 10
Connection: keep-alive
Server: Apache/2.4.54 ()
Last-Modified: Tue, 20 Sep 2022 23:06:44 GMT
ETag: "a-5e923e1bdf796"
Accept-Ranges: bytes


real    0m0.015s
user    0m0.004s
sys     0m0.006s

なんと、約10倍程度ものアクセス時間に差が出ました!
些細な差と思う方もいらっしゃるかもしれませんが、毎アクセスの度にこの差が生じると考えると非常に大きな効果になると思います。

最後に

以上、今回は最近需要が多いな~と感じた海外IPからのアクセスをAWS WAFを使って遮断をしてみました。
この他にも、特定のクローラからのアクセスのみ許可する、といった柔軟な設定もすることが出来ますので、機会があればまたお話ししたい思います。

最後まで読んでいただき、誠にありがとうございました。
今後ともネットアシストをよろしくお願いいたします!

この記事をシェアする

  • facebook
  • twitter
  • hatena
  • line
URLとタイトルをコピーする

実績数30,000件!
サーバーやネットワークなど
ITインフラのことならネットアシストへ、
お気軽にご相談ください