今回はAWS WAFでIPアドレス直打ちによるアクセスを防ぐ方法を紹介します。

IP直打ちアクセスによるデメリット
IP直打ちによってアクセスされることのデメリット、反対にIP直打ちによってアクセスをブロックすることのメリットは何でしょうか。主に信頼性の観点から挙げられます。
1つ目はドメインだけのアクセスに絞ることで、知らず知らずのうちにIPでアクセスした際に、不信感を持たずにサイトを使用することができるということ。IPアドレスでアクセスすることを防ぎ、周知させることで、IPアドレスでサイトを展開しているようなフィッシング対策にもなります。
2つ目はSSLを強制することができるということです。IPアドレスを直打ちによるアクセスは、HTTPSで有効な通信を確立することができません。盗聴リスクおよびログイン情報の盗聴による不正アクセスの危険性を踏まえると、HTTPS以外の通信をブロックする、ないしはHTTPSへリダイレクトさせることが好ましいと言えます。
この2点からIPアドレス直打ちでは、リダイレクトするからアクセスできないようにするかという対応が必要になると考えます。
IP直アクセスによるブロックの手順
どうやって対応するのか
HTTPリクエストヘッダーの中のheader(http 2だと:authority)に、リクエストを送った際に使用したIPやドメイン情報などが記載されています。そちらを見てIPアドレスでアクセスしていたらブロックするという方法で良いかと思います。
手順0.前提条件・事前準備
WAFを作成する前に、WAFをアタッチする予定のリソースを作成する必要があります。今回はALBをあらかじめ作成しております。
手順1.ALBのIPアドレスを確認
EC2のコンソール画面から「ネットワークインターフェース」からALBのIPアドレスを確認しておきます。

手順2.IP setsの作成
まず、IPのグループであるIP setを作成します。
AWS WAF & Shieldsのコンソール画面からIP setsの画面を開きます。
リージョンを東京リージョンに変更し、「Create IP sets」をクリックします。

適当なIP sets名を作成し、IP versionでIP v4を選択し、IPアドレスを入力します。注意としてはCIDR表記をしなければいけないという点です。今回は/32としておきます。
また、ALBは複数のIPアドレスを保持しているので、両方のIPアドレスを追加したいという場合は、改行して追加してください。

手順3.Web ACLを作成する
続いてWeb ACLの作成です。
AWS WAF & Shieldsのコンソール画面からWeb ACLの画面を開き、東京リージョンを選択し、「Create Web ACL」をクリックします。(キャプチャし忘れたので、画像はありません)
続いて、Web ACL DetailsでACL名などを入力します。(こちらもキャプチャし忘れたので、画像はありません)
Associated AWS resourcesで作成しておいたALBを追加します。
「Add AWS resources」をクリックします。

「Appliccation Load Balancer」をクリックし、作成したALBを選択し、「Add」をクリックします。

WAFにアタッチするリソースにALBにリソースが追加出来たら「Next」をクリックします。

続いて「Rules」でWAFのルールを作成、追加していきます。
「Add rules」→「Add my own rules and rule groups」をクリックします。

「Rule type」では「IP set」を選択し、適当にルール名を入力します。

「IP set」で先ほど作成したIP setを選択します。
「IP address to use as the originating address」ではリクエストのソースIPを検査対象とするのか、ヘッダー内に記載されているIPを検査対象とするのかを選択します。今回はヘッダー内を検査したいので、「IP address in header」を選択します。
「Header Field name」ではヘッダー内のどの項目を検査するかになります。今回はHost内を検査したいので、「Host」と記載します。
「Position inside header」は項目内のどのIPアドレスを見るのかになります。host内にIPアドレスが複数ある場合があるのかは分かりませんが、漏れがあると嫌なので「Any IP address」を選択します。
「Fallback for missing IP address」は無効なIPアドレスが含まれていた場合、IP setのアドレスに一致したアドレスとして扱うのか、一致していないアドレスとして扱うのかになります。どちらでもいいですが、ここでは「Match」としておきます。
最後に「Action」ですが、IPアドレスが一致していた場合どうするかになります。今回はアクセスをブロックしたいので「Block」を選択します。
ここまで出来たら、「Add rule」をクリックします。

元の画面に戻りましたら、設定内容を確認します。
ここでは「Default web ACL action for requests that don’t match any rules」を「Allow」に変更します。WAFルールに引っかからなかった場合、リクエストを許可するのか拒否するのかの項目になります。基本的なリクエストは許可していいので「Allow」を選択します。
次に「Next」をクリックします。

次の画面では、WAFルールの優先順位を決めますが、特に設定することもないので「Next」をクリックします。

メトリックスに関しての設定を行いますが、ここでは変更する点は特にないので説明を割愛します。
選択内容はそのままで「Next」をクリックします。

次の画面では諸々の設定を確認します。問題がなければ、「Create Web ACL」をクリックします。

動作検証とまとめ
これでIPアドレスでアクセスしてみるとちゃんと「403 Forbidden」でちゃんとアクセスがブロックされています。

これで一応IPアドレスによってブロックをできました。
カスタムルールだとWCUは5と低いので他のルールへの影響もそこまで大きくないので、防ぎたい攻撃がはっきりしている場合は、カスタムルールでセキュリティ対策をしてもいいのかなと思います。
ただ、今回の場合、ALBはAWSの内部メンテナンスによってIPアドレスが変わるので本当に意味があるのだろうかということが気になりました。そこらへんは次回に書いていきたいともいます。
コメント