AWS WAFを使ってIPアドレスを制限する方法

はじめまして、N.Nです。

自由研究という名のもと、AWSサービスの中からお題を決め発表する機会がありました。

その際の内容をここで共有させていただければと思います。

 

 

今回は AWS Web Application Firewall(以下、WAF)についてご紹介します。

1.WAFとは

SQLインジェクションやクロスサイトスクリプティング(XSS)などの攻撃をブロックすることができます。その名の通り、ウェブアプリケーションの保護に特化したファイアウォールです。

 

WAFを使うとこんなことができます。

  • IPセットにcidrを登録し特定のIPアドレスから攻撃をブロックする
  • 本番開発環境のURLには自社ネットワークのアクセスのみ許可する
  • アクセスをブロックも許可もせずカウントしその後、デフォルトのアクションを実行する

 

これらを実現するためにWAFで設定する項目がいくつかあるので見ていきます。

 

【WAFの設定項目】

  • WebACL
    • 以下で設定した項目を関連付けて集めたもの
  • IPセット
    • 拒否または許可したい"IPアドレス"をcidr形式で設定する
  • ルール
    • IPセットをもとに許可・ブロックを設定する 
    • どのルールにも一致しないリクエスト(デフォルトのアクション)を許可・ブロックで設定する
  • 関連するAWSリソース
    • ALB, API Gateway REST API, CloudFrontなどを選択する

 

これらを設定することでIPアドレスの遮断ができるようになります。

他にもありますが今回は最低限の設定項目を取り上げました。

 

2.WAFによるIPアドレス制限

2-1. 前提条件

  • WAFv2を使用
  • CloudFormationで作成
  • WAF以外の作成が済んでいること
    • インスタンスが1台稼働している(Apacheインストール済み)
    • ALBのDNS名で検索かけるとwebページが表示される

2-2. 期待結果

  • 社内ネットワークのみが接続可能なwebページにする

2-3. 手順

今回はCloudFormationでWAFを作成しました。

 

【テンプレート作成】

(以下、参考にしたサイト)

 

 

 

中でも、WebACLの「SampledRequestsEnabled」は"true"にしておくと良いです。

(コンソール上で確認する為です。のちの「2-4. 結果」で出てきます。)

 

2つルールを作成しました。

・「社内ネットワークを許可する」

・「他、特定のネットワーク(テザリングからの接続等)をブロックする」

また、デフォルトのアクションはブロックに設定しました。

 

 

テンプレートができたらスタックを作成し、リソースをデプロイします。

 

マネージメントコンソール上で「WebACL」にいきます。

設定した内容を確認してください。

(「関連するAWSリソース」に既存のALBがアタッチされていたら進めてください。ALBとの関連付けができていなければコンソール上でおこなってみてください。)

2-4. 結果

ALBのDNS名を貼り今回はcurlコマンドを実行して接続確認をおこないます。

 

社内ネットワークから接続する。

接続できました。

 

他のネットワークから接続する。

接続が拒否されています。

 

これでIPアドレス制限ができました。

 

マネージメントコンソールに戻ります。

テンプレート作成時「SampledRequestsEnabled」を"true"に設定したので、

WebACLの「Sampled request」にてアクションの確認ができます。

設定したルールがメトリクスに表示されます。

アクションにはそれぞれ「許可する」「ブロック」とあり、マネージメントコンソール上でも制限できたことが確認できました。

(インスタンスを停止すると「Sampled request」のログが消えてしまいます。ログを保存したい人はS3等の連携を図ってみてください。)

3.最後に

 今回はAWSのサービス、WAFを使って自社ネットワーク接続のみ許可することをしました。細かいルールの設定を行いましたがWAFには「マネージドルール」というものがあります。あらかじめ定義されていて自動で管理されるルールセットです。これを使って構築してみるのも良いかもしれません。ただし、どれにも適応できるので自分でセットした方がより詳細な制限ができるかと思います。

4.参考