SSHGUARDを使用してSSHブルートフォース攻撃をブロックする方法
SSHGuardは、ブルートフォース攻撃からホストを保護するオープンソースのデーモンです。これは、システムログの監視と集約を通じて攻撃を検出し、iptables、FirewallD、pf、ipfwのいずれかのLinuxファイアウォールバックエンドを使用して攻撃者をブロックすることで実現されます。
当初、OpenSSHサービスに追加の保護層を提供するように設計されたSSHGuardは、VsftpdやPostfixなど、さまざまなサービスも保護します。これは、Syslog、Syslog-ng、及び生のログファイルを含むいくつかのログ形式を認識します。
SSHGuard は Fail2ban と非常に似ていますが、C で書かれているのに対し、Fail2ban は Python で書かれています。また、より軽量で、提供される機能は少ないです。
このガイドでは、LinuxサーバーでSSHのブルートフォース攻撃をブロックするためにSSHGuardをインストールおよび構成する方法を示します。
ステップ1:LinuxにSSHGuardをインストールする
私たちはLinux上にSSHGuardをインストールすることから始めます。
Debian/UbuntuにSSHGuardをインストールする
まず、パッケージリストを更新し、その後、aptパッケージマネージャーを使用してデフォルトのリポジトリからSSHGuardをインストールしてください。
$ sudo apt update
sudo apt install sshguard
インストールが完了すると、SSHGuard サービスは自動的に起動し、このコマンドを使用して確認できます:
$ sudo systemctl status sshguard
RHELシステムにSSHGuardをインストールする
RHELベースのディストリビューション、例えばCentOS、Rocky、AlmaLinuxでは、以下のコマンドに記載されているように、まずEPELリポジトリをインストールします。
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
OR
sudo dnf install epel-release
EPEL がセットアップされたら、dnf パッケージマネージャーを使用して SSHGuard をインストールしてください。
$ sudo dnf install sshguard
インストールが完了したら、SSHGuard を起動して、システムの起動または再起動時に自動的に開始するように設定します。
$ sudo systemctl start sshguard
sudo systemctl enable sshguard
必ず SSHGuard が正常に動作していることを確認してください。
$ sudo systemctl status sshguard
ステップ2:LinuxでのSSHGuardの設定
SSHGuard は、/var/log/auth.log、/var/log/secure systemd ジャーナル、および syslog-ng ログファイルを監視し、失敗したログイン試行をアクティブに監視します。
失敗したログイン試行ごとに、リモートホストは制限時間内で禁止されます。この時間はデフォルトで120秒に設定されています。その後、禁止時間は連続した失敗したログイン試行ごとに1.5倍に増加します。
違反したホストが禁止される時間は、その他のパラメータとともにsshguard.confファイルに指定されています。設定ファイルには、示されているようにvimエディタを使用してアクセスできます。
$ sudo vim /etc/sshguard/sshguard.conf
RHELベースのディストリビューションでは、設定ファイルは次のパスにあります。
$ sudo vim /etc/sshguard.conf
ここに、Ubuntu/Debian から見た設定ファイルのサンプルがあります。
メインの選択肢に集中しましょう。
- BACKENDディレクティブはバックエンド実行可能ファイルのフルパスを指します。この例では、IPtablesがデフォルトのファイアウォールバックエンドとして設定されていることがわかります。
- THRESHOLDディレクティブは、攻撃者の攻撃スコアが指定された値を超えた場合に攻撃者をブロックします。
- BLOCK_TIMEオプションは、攻撃者が毎回の失敗したログイン試行の後にブロックされる秒数です。デフォルトでは、最初の試行後に120秒に設定されています。これは、各連続した失敗したログイン試行ごとに増加します。
- DETECTION_TIMEオプションは、攻撃者がシステムに登録または記憶されている秒数を指し、その後スコアがリセットされる前の時間を示します。
- このWHITELIST_fileオプションは、ブラックリストに載るべきでないホストを含むホワイトリストファイルのフルパスを指します。
ステップ3: SSHGuardを設定してSSHブルートフォース攻撃をブロックする
ブルートフォース攻撃を防ぐためには、以下のファイアウォールをsshguardと連携させるように設定する必要があります。
UFWを使用してSSH攻撃をブロックする
UFWがインストールされ、有効になっている場合は、Ubuntu/Debianシステムの/etc/ufw/before.rulesファイルを修正してください。
$ sudo vim etc/ufw/before.rules
次の行をallow all on loopbackセクションのすぐ後に追加してください。
# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
hand off control for sshd to sshguard
:sshguard - [0:0]
-A ufw-before-input -p tcp --dport 22 -j sshguard
ファイルを保存してUFWを再起動します。
$ sudo systemctl restart ufw
異なるシステムから誤った資格情報でサーバーにログインを試みて、最初のログイン試行が失敗した後、120秒間ロックアウトされることに気付いてください。
このことは、auth.log ログファイルを確認することで検証できます。
$ sudo tail -f /var/log/auth.log
次のログイン試行が失敗した後、ブロック時間は240秒に増加し、その後480秒、さらに960秒と続きます。
Firewalldを使用してSSH攻撃をブロックする
firewalldを実行している場合は、それが設定されて有効になっていることを確認してください。その後、好みのゾーンでsshguardを有効にするために、次のコマンドを実行します。
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule source ipset=sshguard4 drop"
変更を適用するには、Firewalldとsshguardを再読み込みしてください。
$ sudo firewall-cmd --reload
sudo systemctl restart sshguard
次のようにルールを確認してください:
$ sudo firewall-cmd —-info-ipset=sshguard4
Iptablesを使用してSSH攻撃をブロックする
まだIptablesを使用している場合は、まずsshguardのためにIptablesで新しいチェーンルールを作成して、不正アクセスを防ぎ始めてください。
# iptables -N sshguard
次に、INPUT チェーンを更新して、トラフィックを sshguard に送信し、悪意のある当事者からのすべてのトラフィックをブロックします。
# iptables -A INPUT -j sshguard
悪用者からSSH、POP、およびIMAPなどの特定のポートをブロックするには、次のコマンドを実行します:
# iptables -A INPUT -m multiport -p tcp --destination-ports 22,110,143 -j sshguard
そして最後に、変更が有効になるようにルールを保存してください。
# iptables-save > /etc/iptables/iptables.rules
ステップ4: SSHがブロックされたホストをホワイトリストに追加する方法
ブロックされたホストをホワイトリストに追加するには、そのホスト名またはIPアドレスをホワイトリストファイルに指定するだけで済みます。そのファイルは次の場所にあります:
/etc/sshguard/whitelist - Ubuntu/Debian
/etc/sshguard.whitelist - RHEL-based distros
その後、変更を適用するためにsshguardデーモンとファイアウォールのバックエンドを必ず再起動してください。
このガイドでは、LinuxサーバーでSSHGuardデーモンを使用してSSHのブルートフォース攻撃をブロックする方法を示しました。ご意見をお寄せください。




