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波状攻撃だけを遮断できることになります。

さらに、この全遮断中に別のIPアドレスから同様のsshd攻撃が来た場合は、その時点から遮断期間のカウントを再スタートすることにしました。そのため、IPアドレスを変えながら行うsshdへの波状攻撃は皆無となりました。

このシステムを作ってすぐにsshdへの攻撃がありましたが、Fail2Banで遮断したのは1つのIPアドレスだけです。つまりGlobal Lockが発動している間は別のIPアドレスからの攻撃は一切届かないことになります。

私はこのあたりのセキュリティ状況の監視用にダッシュボードを独自に作っているのですが、そこにもこんな感じで遮断状況や残り時間などを表示できるようにしてみました。

実は、sshdへのログインにはかなり特殊な仕組みを組んでいるので、正直ここまでやる必要はありません(笑)。この仕組みとFail2Banだけでも十分防御できています。

ただ、IPアドレスを次々と変えながら攻撃してくるのを見ていると、

「だったら攻撃が来たときだけSSHの入口そのものを一時的に閉じてしまえばいいじゃないか」

と思ったわけです。

今回の仕組みでは、SSHだけを一時的に閉じるので、WebサイトやオンラインQSLシステムなどには影響しません。そして自宅からの管理用SSHはそのまま使えます。何より、実際に攻撃が来たときにGlobal Lockの残り時間が延長されていくのを見るのがちょっと面白いです。🙂

しばらくこれで様子を見てみようと思います。

 


自宅サーバーの道

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です