sshguardでブルートフォースアタック対策

sshdログとiptablesを用いて、SSHのブルートフォースアタック(総当たり攻撃)から守る sshguard を試す機会があったのでメモっておきます。

ぶっちゃけ、お外からSSHで繋げるサーバとかほぼ皆無だし、鍵認証だしで、実際に活躍することなどないのですが・・・開ける必要があったり、ミスって開いちゃってたりした時に、iptables でがっちりカットできるので使いドコロはまぁまぁあるかもしれません。



OSとsshguardのバージョンについて

ここでの構築は、Debian Wheezyで行っています。
Wheezyのパッケージは、ちゃんと設定ファイルとデーモンになっていてナイスです。

SqueezeやLenny、CentOS5 などもパッケージはあるのですが、内容は /usr/sbin/sshguard が入っているだけのクソパッケージです。その理由がおそらく、sshguard の -l オプションがないバージョンのためで、tail … | sshguard の形で起動する格好悪い形だからです(※古い紹介ページを見るとわかります)。

新しい sshguard は -l auth.log のように綺麗に指定できるので、使う場合は頑張って最新を使うとよいです。


インストール

Debian Wheezy

パッケージを入れるだけです。

Debian Squeeze

パッケージはありますがデーモンになっていないので、ちょっとアレですが Wheezyの .deb でも動くので、持ってきて入れるとよさげです。

Debian Lenny

ここまで落とすとWheezyの.debは依存で入らないので、source からパッケージを作って入れます。

CentOS 5

セント君は今回は適当に対応。パッケージ持ってきて、無理矢理Wheezyと同じ構成にしました。実際にはちゃんと rpm 作るべきです。
  • sshguard-1.5-2.el5.x86_64.rpm CentOS 5 (RHEL 5) Download

  • 諸情報の確認

    apt-cache showpkg sshguard

    dpkg -L sshguard

    ps -C sshguard w


    設定

    ホワイトリスト

    man から持ってきた例はこんな感じです。

    内側をスルーするならこんな感じに編集します。
    /etc/sshguard/whitelist

    sshdログのファイル指定

    Debianなら /var/log/auth.log , CentOS なら /var/log/secure ですが、設定を共通させたいなら両方書いておきます。

    /etc/default/sshguard

    ただし、initスクリプトでこうなっているので、起動時に既にファイルがないと -l オプションが追加されません。もし両方あったら、-l オプションが複数追加されます。

    回数/秒数制限

    defaultにオプションが書いてありますが、これはデフォルト値をそのまま明記しています。
    /etc/default/sshguard

    オプションの意味は

  • -a : 危険度の閾値。1回あたり10なので、40だと4回目でアタック判定となる
  • -p : アタック判定となってからこの秒数は確実にアタック判定のままとなる(=iptablesを開放しない)
  • -s : -p 秒後、-s 秒以内にアタック判定が解除される(=iptablesから削除される)

  • デフォで十分なバランスなので、あとはお好みで編集しておきます。


    動作確認

    起動時の ipatbles は全INPUTパケットを、何もないsshguardチェインに渡す形になっています。

    iptables -L -v -n

    適当に存在しないユーザでSSHログインしようとします。ログはこんな感じ。

    4回しくじったら、sshguardさんが怒ってログを出します。

    sshguardチェインにソースアドレスが追加されています。

    追加されたルールは、指定オプション値に従って、数分後に削除されます。


    改造コーナー

    この仕様だと、全INPUTパケットをsshguardチェインに渡し、アタック判定を受けたソースアドレスは全ポートを塞がれるので、80番ポートなども同時にアクセスできなくなります。多分、別にそれでも困らないけど、なんか気持ち悪いのでSSHに限定した動作にする場合は、

    いったん sshguard を停止してから、
    勝手にこんなのを追加して、
    /etc/default/sshguard

    追加と削除のルールにオプションを追加しておくと、
    /etc/init.d/sshguard

    –dportsで羅列したポートのみが動作の対象となります。先にsshguardを停止しないと、追加済みのルールが綺麗に削除されないので、注意してください。


    その他メモ

    判定条件

    SSHGuard – Defend from brute force attacks | Attack signatures に基本条件が書かれていますが、SSH+LDAPだとrootを含む既存ユーザに対する認証失敗は、ログの都合上カウントされないようです。

    ログローテート

    当然ですが、-l /var/log/auth.log で指定したログがローテートしても、ちゃんと新規ファイルを追ってくれます。


    ガーッと書いちゃいましたが、実にシンプルかつ強力なので、知っといて損はないかと思います。