Sshguard

提供: ArchWiki
移動先: 案内検索

関連記事

警告: IP ブラックリストを使えば取るに足らない攻撃を防ぐことはできますが、別にデーモンを使う必要がありログは残ります (特に攻撃者が何度もサーバーにアタックした場合 /var を含むパーティションが一杯になってしまう可能性もあります)。さらに、攻撃者が IP アドレスを知っている場合、ソースヘッダーを偽装したパケットを送りつけてサーバーからロックアウトさせるよう仕向けてくるかもしれません。SSH 鍵はこれらの問題に煩わされることなくブルートフォースの問題を解決する方法を提供します。

sshguardSSH などのサービスをブルートフォース攻撃から守るためのサービスで、fail2ban と似ています。

sshguard は他の2つと違って C で書かれており、軽量かつシンプルです。コアの機能は同等ながら機能は抑えめに作られています。

sshguard は同じようなツールが持っている、ログ解析による 脆弱性 から攻撃されることは (ほとんど、または絶対に) ありません。

インストール

公式リポジトリから sshguard をインストールしてください。

設定

UFW

警告: 現在、[community] の ufw-033-3 は以下の方法と互換性がありません。ユーザーは AUR の ufw-bzrAUR を使う必要があります。

UFW に DROP のコントロールを sshguard へ伝達させる必要があります。/etc/ufw/before.rules を編集して以下の行を含めることで設定できます。ループバックデバイスのセクションの後に挿入してください。

ノート: sshd を標準のポートで動作させていない場合は最後の行を修正する必要があります (22 が標準ポートです)。
# hand off control for sshd to sshguard
-N sshguard
-A ufw-before-input -p tcp --dport 22 -j sshguard

この変更を行った後に ufw を再起動してください。

ストレートの iptables

主に必要な設定は iptables の INPUT チェインに "sshguard" という名前のチェインを作成することです。sshguard はこのチェインに自動的に悪いホストからのパケットを拒否するルールを追加します:

# iptables -N sshguard
# iptables -A INPUT -p tcp --dport 22 -j sshguard
# iptables-save > /etc/iptables/iptables.rules

IPv6 を使っている場合:

# ip6tables -N sshguard
# ip6tables -A INPUT -p tcp --dport 22 -j sshguard
# ip6tables-save > /etc/iptables/ip6tables.rules

IPv6 を使っていない場合、次のコマンドで空の ip6tables.rules ファイルを作成して下さい:

# touch /etc/iptables/ip6tables.rules

最後に:

# systemctl reload iptables

iptables を使用しておらず、sshguard を立ち上げるのにシステムに影響を与えたくない場合、以下のコマンドで sshguard を動かすのに必要なことだけをする iptables の設定が作成・保存されます:

# iptables -F
# iptables -X
# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -N sshguard
# iptables -A INPUT -j sshguard 
# iptables-save > /etc/iptables/iptables.rules    

上記の手順を ip6tables で IPv6 のファイアウォールルールも繰り返し設定して ip6tables-save を使って /etc/iptables/ip6tables.rules に保存して下さい。

強力なファイアウォールを作成するのに iptables を使う方法は、シンプルなステートフルファイアウォールを見て下さい。

使用方法

sshguard には設定ファイルが存在しません。全てのオプションは sshguard を起動するときに引数として指定します。man sshguard を見て下さい。

systemd を使う

sshguard.service起動・有効化してください。

sshguard に任意の引数を追加したいときは、systemd#ユニットファイルの編集 に書かれているようにパッケージに入っているサービスを修正して下さい。

syslog-ng を使う

syslog-ng をインストールしている場合、コマンドラインから直接 sshguard を起動することができます:

/usr/sbin/sshguard -l /var/log/auth.log -b /var/db/sshguard/blacklist.db

一般情報

ExecStart=

sshguard は /var/log/auth.logsyslog-ng、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は7分で、ログインを失敗するたびに2倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。

一時的な ban も永続的な ban も、どちらも iptables の "sshguard" にエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され /var/log/auth.log に残ったり、systemd を使っている場合、systemd の journal に記録されます。ban の効果がポート 22 だけ影響するようにするには、単純に他のポートで "sshguard" チェインをパケットが通過しないようにしてください。

archlinux のパッケージのデフォルトでは、違反者は "danger" レベルの40にまで達すると永続的に ban されます (もしくはログインを4回失敗。詳しくは terminology を参照)。この挙動は blacklist ファイルの前に danger レベルを付け加えることで変えられます。例えば、systemd を使っていれば /usr/lib/systemd/system/sshguard.service に以下のように挙動を設定することが可能です:

[Service]
ExecStart=
ExecStart=/usr/lib/systemd/scripts/sshguard-journalctl "-b 200:/var/db/sshguard/blacklist.db" SYSLOG_FACILITY=4 SYSLOG_FACILITY=10

上の例では 200: によって danger レベル 200 まで達したホストは永久的に sshguard によって ban されます。

アグレッシブに ban をおこなう

断続的な攻撃に悩まされているユーザーにとっては、もっとアグレッシブな ban ポリシーを有効にしたほうが効果的でしょう。偶発的にログインを失敗するようなことは絶対ないと言えるのであれば、一度でもログインを失敗したらホストを自動的に ban するよう SSHGuard を設定することができます。systemd を使っているなら以下の手順にしたがって設定できます:

SSHGuard を停止:

# systemctl stop sshguard

/usr/lib/systemd/system/sshguard.service の以下の行を編集:

[Service]
ExecStart=
ExecStart=/usr/lib/systemd/scripts/sshguard-journalctl "-a 1 -b 10:/var/db/sshguard/blacklist.db" SYSLOG_FACILITY=4 SYSLOG_FACILITY=10

次のコマンドでユニットをリロードする必要があります:

# systemctl daemon-reload

そして SSHGuard を再起動:

# systemctl start sshguard

ban を解除する方法

ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables を使って自分で ban を解除することができます。まず sshguard によって ip が ban されているか確認してください:

# iptables -L sshguard --line-numbers

それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認したものに置き換えてください:

# iptables -D sshguard <line-number>