blacklistd(8)でftpd DoS攻撃を防止する方法 ipfw編
前回までFreeBSD 11.0-RELEASEにNetBSDからマージされたblacklistd(8)の使い方を紹介してきました。blacklistd(8)を使うと設定に基づいて規定の回数ログインに失敗した接続を自動的にブロックするといったことを実現できます。DoS攻撃やブルートフォース攻撃に対する緩和機能として利用できます。
最初はsshd(8)とファイアウォールにipfw(4)を使う方法を紹介しました。前々回はpf(4)を使う場合、そして前回はipf(4)を使う方法を紹介しました。この3回はsshd(8)に対してblacklistd(8)を使う方法を取り上げましたが、今回はftpd(8)に対して利用する方法を紹介します。組み合わせるファイアウォールにはFreeBSDネイティブのipfw(4)を使います。
まず、/etc/rc.confファイルに次のような設定を追加します。FreeBSDのユーザランドにマージされているftpd(8) (/usr/libexec/ftpd)はinetd(8)から起動するように設定されているので、inetd(8)を起動する設定を追加してあります。
inetd(8)からftpd(8)を起動するように、/etc/inetd.confに次の設定を追加します。これでftpdポートにアクセスがあった場合に/usr/libexec/ftpdが起動するようになります。
ftpd(8)のオプションに-Bが追加してある点に注目してください。これが新しく追加されたオプションで、このオプションを指定しておくとログインなどに失敗した場合にblacklistd(8)に報告があがるようになります。これを指定しないとblacklistd(8)には報告があがりませんので注意してください。ちなみに、-lはsyslogを使ってログを記録するための指定です。-lでsyslogd(8)へ、-Bでblacklistd(8)へデータを送っていることになります。blacklistd(8)は仕組みとしてはsyslogd(8)に近いですので、このオプションの指定は興味深いところです。
blacklistd(8)がipfw(4)を使うように/etc/ipfw-blacklist.rcファイルを作成します。すでにipfw(4)を使っている場合には都合がよいように設定をマージして使ってください。
この状態でシステムを再起動すると、次のようにinetd(8)が起動していることを確認できます。
ipfw(4)が有効になっているので、たとえば次のようなフィルタリングルールが動作していることを確認できます。
blacklistd(8)も次のように動作していることを確認できます。
blacklistd(8)の保持しているルールはblacklistclt(8)コマンドで次のように確認できます。システムを再起動した段階では次のようになんのルールも入っているはずです。
blacklistd(8)の設定は/etc/blacklistd.confです。このファイルはデフォルトでは次のようになっています。この場合、ftpにおける認証が3回失敗すると以後24時間はアクセスできない状態になります。
ほかのホストからftpでログインを試み、3回失敗してみます。すると次のように、サーバへの接続がブロックされるようになります。
この状態でipfw(4)のルールをチェックすると、21番ポートへのアクセスがブロックされたことを確認できます。
blacklistctl(8)コマンドでブロック情報を確認すると、次のようにルールが追加されたことを確認できます。
blacklistd(8)はデフォルトの設定だと/var/db/blacklistd.dbに接続エントリ情報を保持していますので、再起動してもこのデータは保持されたままです。再起動後にこの保持しているデータに従ってもう一度ブロックルールを適用するか、またはルールをすべてクリアするかをblacklistd(8)のオプションで指定できます。-fならルールをクリア、-rならルールをベースにブロックルールを再適用します。最初に示した/etc/rc.confにこのオプションを書いておきます。
このようにblacklistd(8)とipfw(4)を使うと自動的にFTPアクセスをブロックするといった設定を実現できます。今回はipfw(4)を取り上げましたけれども、これまでに紹介したのと同じ方法でpf(4)でもipf(4)でも利用することができます。お使いのファイアウォール機能を使えるところがblacklistd(8)の魅力のひとつです。
このあたりも含めてblacklistd(8)の使い方に関して下記勉強会で詳しい内容を取り上げます。ご興味ある方は勉強会の参加を検討してみてください。なかなか面白い仕組みになっています。
勉強会
10月4日(水)19:00~ 第66回 FreeBSD勉強会~vBSD 2017とEuroBSDCon 2017から旬な技術をご報告! - ヴァル研究所 セミナールーム
vBSD 2017とEuroBSDCon 2017から旬な技術をご報告! - ヴァル研究所 セミナールーム
9月に米国バージニア州で開催されるvBSDcon 2017とフランスで開催されるEuroBSDCon 2017から、最新の*BSDトピックを面白いところにしぼってお伝えします。カンファレンスへの渡航費用と参加費用を見ると、日本でこの情報を得られるのはとってもお得です。皆さまのお越しをお待ちしております。
本勉強会への参加者には抽選か勝ち抜きかデーモンTシャツなどのグッズをお渡しします。振るって具参加ください。
10月26日(木)19:00~第67回 FreeBSD勉強会~blacklistd(8)でsshd DoS攻撃を防止する方法 基礎から応用まで - ドワンゴ セミナールーム
FreeBSD 11.0-RELEASEにはblacklistd(8)と呼ばれるデーモンが取り込まれました。これはNetBSDのblacklistd(8)をマージしたもので、設定に従ってサーバに対するDoS攻撃とみられるアクセスに対し、自動的にアクセスを閉じるといった処理をしてくれます。
FreeBSD 11.1-RELEASEからはシステムのsshd(8)がblacklistd(8)に対応するようになりました。ログインに何回か失敗したら何時間の間アクセスをブロックするといった設定を行うことができます。ホワイトリスト的な設定も追加することでき、全体としてのブロック設定をおこないつつ、特定のホストからのアクセスは許可したり、特定のホストからのアクセスは規制を緩くしておくといったことも可能です。
blacklistd(8)と類似した機能を提供するソフトウェアにはsshguard、fail2ban、denyhostsなどがあります。これらソフトウェアと比較したblasklistd(8)の特徴は処理の軽快さにあります。また、ipfw、pf、ipfilterというFreeBSDが提供しているすべてのファイアウォール機能に対応しているほか、もちろんNetBSD npfに対応しています。
blacklistd(8)はライブラリとしてlibblacklistを提供しているため、sshdに限らずほかのさまざまなソフトウェアからも利用できる汎用的な機能です。いくらかのコードの書き換えでblacklistd(8)を利用できるようにすることができます。
今回の勉強会ではblacklistd(8)がどのように動作しているのか紹介するとともに、設定方法などの基本的な方法から、既存のソフトウェアをblacklistd(8)に対応させる場合にどのように開発を行えばよいかなどを紹介します。
参加登録はこちらから。
FreeBSD勉強会 発表者募集
FreeBSD勉強会では発表者を募集しています。FreeBSDに関して発表を行いたい場合、@daichigotoまでメッセージをお願いします。30分~1時間ほどの発表資料を作成していただき発表をお願いできればと思います。