夏休み明けに考えたいセキュリティ強化の話です。
インターネット上にサーバを公開すると、ものの数時間で大量の攻撃を受け始めます。 攻撃を受けていることは、サーバのログを見ると確認できます。 例えばsshサーバに大量の認証失敗ログが残っている場合、それはsshにブルートフォース攻撃を受けている証拠です。 長いパスワードや公開鍵認証、脆弱性のないサーバやWebアプリケーションを使っていればこのような攻撃が成功する可能性はきわめて低いのですが、攻撃のログを見るのは全く気持ちの良いものではありません。
そのような攻撃を手軽に防ぐ方法としてIPブラックリストがあります。 FireHOLプロジェクトで提供されている良質なIPブラックリストを簡単に適用できるDocker imageを作成しましたので、今回はそれを紹介します。
使い方
本Docker imageを使うにはまず、Dockerをインストールしてください。
Dockerのインストールができたら、まずはfirehol-update-ipsetsコンテナを起動します。 以下のコマンドを実行するとコンテナイメージのダウンロードと実行、最新のIPブラックリストのダウンロードと定期更新が自動で開始されます。
$ docker volume create firehol-update-upsets
$ docker run --name firehol-update-ipsets -it -d --restart=always --cap-add=NET_ADMIN --net=host -v firehol-update-ipsets:/etc/firehol/ipsets devrt/firehol-update-ipsets
上のコマンドが実行できたら、IPブラックリストを設定し有効化しましょう。ここではfirehol_level2とtor_exitsを設定します。
$ docker exec firehol-update-ipsets enable firehol_level2
$ docker exec firehol-update-ipsets enable tor_exits
firehol_level2は、sshブルートフォース攻撃などインターネット上の攻撃を行ってくるサーバのIPアドレスを様々な情報源から自動収集したIPブラックリストで、現在約42,000個のIPアドレスが登録されています。 IPアドレスの内訳(総数や国別)は以下のURLで閲覧できます。
http://iplists.firehol.org/?ipset=firehol_level2
tor_exitsは、Torの出口サーバのIPアドレス一覧をブラックリスト化したものです。 このブラックリストを適用することでTorネットワークからのアクセスを防ぐことができます。 Torは正義のための匿名化をうたってはいますが、実態は悪用がほとんどなのでアクセスをできなくするのがおすすめです。
http://iplists.firehol.org/?ipset=tor_exits
上記以外にもFireHOLでは様々なIPブラックリストが公開されており、攻撃の状況に合わせて選ぶことができます。
一点、注意点として、FireHOLで提供されているIPブラックリストには、プライベートIPを含むものがあります(例えば、firehol_level1)。 管理用にプライベートIPを設定したサーバに、このブラックリストを適用するとsshを使ったログインなどができなくなってしまうので気を付けてください。 プライベートIPを含むIPブラックリストは以下のURLから確認できます。
http://iplists.firehol.org/?ipset=iblocklist_iana_private
IPブラックリストの適用ができたら、その設定がカーネルに反映されているか、以下のコマンドで確認してみましょう。
$ sudo ipset list -t
$ sudo iptables-save
IPブラックリストはカーネルのipsetの仕組みを使って適用されるので、大量のIPアドレスを含んだブラックリストでも高速にフィルタ処理できます。
しばらくしてからサーバのログを見ると、攻撃のログが目に見えて減っているはずです。 tor_exitsが動作しているかどうかは、Torブラウザを使ってサーバにアクセスしてみることでも確認できます。
一度設定を行うと、以降は最新のIPブラックリストへの更新と適用が自動で行われます。 以下のコマンドで更新のログを確認できます。
$ docker logs firehol-update-ipsets