AWSのEC2+ELBで、ロードバランサへのアクセス時点で特定IPからのアクセスを弾く
つい先日、どこぞのサーバからEC2のサーバに対してDosアタックを受けました。
別にある程度の攻撃を受けること自体は想定してサーバを公開していましたし、
Apache側ではmod_dosdetectorというDos攻撃をある程度受けた場合、検知出来る仕組みを用意していたので特に問題ない、、、と思っていました。
stanaka/mod_dosdetector · GitHub
が、しかし。
Apache側で検知するということは、WEBサーバのリソースを結構食っちゃうんですよね…。
実際、普段5%以内で収まっていたCPU Usageが、攻撃を食らっている間50%オーバーをずっとマークしていました。
真ん中の跳ねてるグラフが攻撃受けてた期間ですね。
さすがに運営に支障が出るレベルだったので、出来ればWEBサーバの前に立っているELBにアクセス来た時点で、対象の攻撃者IPを弾いて欲しかったんですが
AWS側で用意されているSecurity Groupsはホワイトリスト形式での指定は可能なのですが、ブラックリスト形式での指定が出来ないため途方に暮れていました。
Google先生に「aws ロードバランサ ip拒否」とか聞いてみたんですが、
求めていた一発回答は存在せずに結構悩みました。
が、上記で出てきたDevelopers.io様の記事の中に
[Apache] 非VPCのELBでX-Forwarded-Forを利用したアクセス制限 | Developers.IO
非VPC環境で、ELB配下のWebサーバがインターネットからのDoS攻撃にさらされた場合に、特定のIPアドレスからのアクセスを拒否(403)します。
VPC環境であればNetworkACLやSecurityGroupで制限をかけることができますが、非VPCではELBへのアクセスを制限することができません。この場合httpdレベルで制限する必要があります。
という内容が書かれていたのを見つけました。
…ん?NetworkACL、かけれるの?
という今更知りました感満載の内容を見つけ、今度は「AWS ACL」で検索。
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_ACLs.html
ありました。
今まで全く気にしてもいなかったんですが、かけれるんですね。
ということでまずはELBのVPC-IDを確認。
みつけました。これを今度はVPC画面で確認します。
で、左のナビゲーションからNetwork ACLsを選択。
恥ずかしながら今まで、
「VPC-IDって何やねんそれ、おまじないか?」
ぐらいにしか思ってなかったのでVPC-IDは1つしか無いです。
Editを押して編集に入ります。
ルール番号は100がデフォルトでAll RangeのAllowを行っているみたいです。
番号が若いほど優先処理をされるようなので、今回はとりあえず直前の99で該当IPの拒否処理をしようと思います。
※画像にIPおもいっきり乗っかってますが、攻撃者のIPなんて晒されても何も文句ないと思うので放置です。海外みたいですし。
最後にSaveを押せば、特にELBの再起動とか必要なく、リアルタイムでACLがかかりました。
とりあえず一時しのぎで手動で対応しましたが、最終的にはDosアタック検知したら自動でACLで弾いてしまうようにしたいですね。。。
というかこれ以外でスマートなやり方をご存知な方がいらっしゃったら是非ご教授願いたいです。