
Fail2Banの拡張防御システム開発
せっかくのシルバーウィークが雨と台風で台無しですね。 仕方ないのでこんなことをやって遊んでおります。
IPv6アドレスだけのシステムでは、サーバーに対しての攻撃は極端に減りました。これはIPv6アドレスがほぼ無尽蔵にあるため、IPv4のような総当たり攻撃がしにくいためです。
しかし、ここで以前投稿したように、IPv4でのサーバー公開を再開しましたので、自宅サーバーへの攻撃も急増しています。大半は海外からの攻撃です。
自宅サーバーへの攻撃を防御する方法として、国ごとに割り当てられているIPアドレスを指定して拒否する方法もあります。しかし、これだとIPアドレスの割り当てが変更された時に管理が面倒です。
さらに現在は、全世界からアクセスしてもらう必要がある「オンラインQSLシステム」を自宅サーバー内で動かしているため、国単位で通信を遮断という方法は使えません。
自宅サーバー運用開始した20年以上前から「Fail2Ban」を導入してこのような攻撃に備えています。
Fail2Banは、ログを監視して攻撃を検知すると、その攻撃元IPアドレスからの通信をファイアウォールで一定期間、遮断する仕組みです。何度も来るIPアドレスに対しては、さらに長い期間の遮断時間を適用するような仕組みも作ることができます。
このFail2Banを自宅サーバーだけでなくVPSにも導入しています。現在の攻撃パターンを見ると、そのほとんどがIPv4からのものですので、VPSでFail2Banを動かしておくことは攻撃対策としてかなり効果があります。
いろんな攻撃パターンがありますが、明らかにシステムに侵入しようと試みているSSH(sshd)へのログイン攻撃は、悪意のある攻撃と判断できます。
そのためsshdへの攻撃については、かなり厳しめの遮断期間を設定しています。もちろん、sshdのポートを閉じてしまえば話は簡単です。しかし、VPSと自宅サーバーの間で利用している通信があるため、今はポートを開けています。外部から簡単に侵入できるような仕組みにはしていないのですが、とにかく大量にこのsshdの攻撃が来るのでウザい・・・・ 🙂
そして下のようにIPアドレスを次々に変えながら攻撃をしてくるパターンもあります。 これらはすべてFail2Banで遮断しています。 典型的なSSH攻撃元なので、モザイク処理もせずそのまま公開します。
Fail2Banの遮断時間を見てもらうと分かると思いますが、これだけの短時間に次々と攻撃してきていますので、おそらく自動化された仕組みから波状攻撃を仕掛けているのでしょう。
このようにIPアドレスを次々に変えながら波状攻撃してくるものに対しての対策を考える中で、
「SSH攻撃を検知したら、まずFail2BanでそのIPアドレスを遮断すると同時に、sshdの新規接続そのものを一定期間すべて遮断するシステム」を開発してみました。
名付けて「SSH Global Lock」です。
仕組みとしては、Fail2BanがSSH攻撃を検知して攻撃元IPアドレスを遮断すると、それをトリガーにしてGlobal Lockを発動します。
すると、攻撃元IPだけではなく、外部からの新しいSSH接続を一定時間すべて遮断します。
これなら、攻撃者が別のIPアドレスに変えてきても、
という動作になります。
つまり、IPアドレスを変えてくること自体が意味を持たなくなるわけです。
しかし、単純にsshdポートを全部遮断してしまうと、自分もsshd通信ができなくなります。
そこで、
- 自宅からのSSHは常に許可
- すでに接続中のSSHセッションは維持
- HTTP/HTTPSなど他のサービスには影響させない
という構成にしました。
したがって、Global Lockが発動していても、自宅からは普通にサーバーへSSH接続できます。
また、Global Lockが対象とするのはsshdの新規接続だけなので、Webサーバーなどの運用には全く影響しません。悪意のある攻撃者のsshd波状攻撃だけを遮断できることになります。
さらに、この全遮断中に同じsshd攻撃が別IPアドレスから来た場合は、遮断期間のカウントをそこから再スタートすることにしたので、sshdのIPアドレスを変えたような波状攻撃は皆無となりました。
このシステムを作ってすぐにsshdの攻撃がありましたがFail2Banでの遮断は1つのIPアドレスのみです。つまりGlobal Lockが発動している間は別のIPアドレスからの攻撃は一切届かないことになります。
私はこのあたりのセキュリティの管理モニター用としてダッシュボードを独自に作っているのですが、そこにもこんな感じで遮断状況と残り時間なども表示できるようにしてみました。
実は、sshdへのログインにはかなり特殊な仕組みを組んでいるので、正直ここまでやる必要はありません(笑)。この仕組みとFail2Banだけでも十分防御できています。
ただ、IPアドレスを次々と変えながら攻撃してくるのを見ていると、
「だったら攻撃が来たときだけSSHの入口そのものを一時的に閉じてしまえばいいじゃないか」
と思ったわけです。
今回の仕組みでは、SSHだけを一時的に閉じるので、WebサイトやオンラインQSLシステムなどには影響しません。そして自宅からの管理用SSHはそのまま使えます。何より、実際に攻撃が来たときにGlobal Lockの残り時間が延長されていくのを見るのがちょっと面白いです。🙂
しばらくこれで様子を見てみようと思います。



