Sshguard
関連記事
sshguard は SSH などのサービスをブルートフォース攻撃から守るためのサービスで、fail2ban と似ています。
sshguard は他の2つと違って C で書かれており、軽量かつシンプルです。コアの機能は同等ながら機能は抑えめに作られています。
sshguard は同じようなツールが持っている、ログ解析による 脆弱性 から攻撃されることは (ほとんど、または絶対に) ありません。
目次
インストール
設定
sshguard は /var/log/auth.log
や syslog-ng、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は7分で、ログインを失敗するたびに2倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。
一時的な ban も永続的な ban も、どちらも iptables の "sshguard" チェインにエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され /var/log/auth.log
に残ったり、systemd を使っている場合、systemd の journal に記録されます。ban の効果がポート 22 だけ影響するようにするには、単純に他のポートで "sshguard" チェインをパケットが通過しないようにしてください。
sshguard によるブロックを機能させるにはファイアウォールを設定する必要があります。
UFW
UFW をインストール・有効化している場合、DROP の制御を sshguard に渡す必要があります。/etc/ufw/before.rules
を編集して以下の行を記述することで設定できます。ループバックデバイスのセクションの後に挿入してください。
/etc/ufw/before.rules
# hand off control for sshd to sshguard -N sshguard -A ufw-before-input -p tcp --dport 22 -j sshguard
iptables
必要な設定は iptables に sshguard
という名前のチェインを作成することです。sshguard はこのチェインに自動的に悪いホストからのパケットを拒否するルールを追加します:
# iptables -N sshguard
次に INPUT
チェインから sshguard
チェインにジャンプするルールを追加します。以下のルールは sshguard が保護するポートを処理する他のルールよりも前に追加してください [1]:
# iptables -A INPUT -p tcp --dport 22 -j sshguard
ルールを保存するには:
# iptables-save > /etc/iptables/iptables.rules
使用方法
systemd
sshguard.service
を起動・有効化してください。同梱されている systemd ユニットは /var/db/sshguard/blacklist.db
のブラックリストを使って journalctl を sshguard にパイプで渡しています。
syslog-ng
syslog-ng をインストールしている場合、コマンドラインから直接 sshguard を起動することができます:
/usr/sbin/sshguard -l /var/log/auth.log -b /var/db/sshguard/blacklist.db
設定
sshguard を使うのに必要な設定は /etc/sshguard.conf
で行います。
脅威レベルの変更
デフォルトの設定ファイルでは、違反者の "danger" レベルが 120 に淘汰すると永続的に ban されるようになっています (もしくはログインを12回失敗。詳しくは terminology を参照)。ブラックリストファイルの前に脅威レベルを付けることで挙動を変えることができます:
BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db
上記の例では 200:
によって、ホストの脅威レベルが 200 にまで達したときに sshguard によって永続的に ban されるようになります。
設定後 sshguard.service
ユニットを再起動してください。
アグレッシブに ban をおこなう
断続的な攻撃に悩まされているユーザーにとっては、もっとアグレッシブな ban ポリシーを有効にしたほうが効果的でしょう。偶発的にログインを失敗するようなことは絶対ないと言えるのであれば、一度でもログインを失敗したらホストを自動的に ban するよう SSHGuard を設定することができます。設定ファイルのパラメータを以下のように編集してください:
THRESHOLD=10 BLACKLIST_FILE=10:/var/db/sshguard/blacklist.db
設定したら sshguard.service
ユニットを再起動してください。
ヒントとテクニック
ban を解除する
自分自身が ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables を使って自分で ban を解除することができます。まず sshguard によって IP が ban されているか確認してください:
# iptables -L sshguard --line-numbers --numeric
それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認した番号に置き換えてください:
# iptables -D sshguard <line-number>
永続的に ban を解除するには /var/db/sshguard/blacklist.db
から IP アドレスを削除する必要があります:
# sed -i '/<ip-address>/d' /var/db/sshguard/blacklist.db
ログ出力
sshguard に渡されたものを確認したい場合、/usr/lib/systemd/scripts/sshguard-journalctl
のスクリプトや systemd サービス sshguard.service
をチェックしてください。以下のコマンドでもターミナルで同じログを表示できます:
$ journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10