「Sshguard」の版間の差分
細 |
Kusanaginoturugi (トーク | 投稿記録) |
||
(4人の利用者による、間の16版が非表示) | |||
1行目: | 1行目: | ||
− | [[Category: |
+ | [[Category:セキュアシェル]] |
+ | [[Category:ファイアウォール]] |
||
[[en:Sshguard]] |
[[en:Sshguard]] |
||
[[es:Sshguard]] |
[[es:Sshguard]] |
||
+ | [[zh-hans:Sshguard]] |
||
{{Related articles start}} |
{{Related articles start}} |
||
− | {{Related| |
+ | {{Related|Fail2ban}} |
+ | {{Related|Secure Shell}} |
||
{{Related articles end}} |
{{Related articles end}} |
||
− | {{warning|IP ブラックリストを使えば取るに足らない攻撃を防ぐことはできますが、 |
+ | {{warning|IP ブラックリストを使えば取るに足らない攻撃を防ぐことはできますが、専用のデーモンを使う必要がありログは残ります (特に攻撃者が何度もサーバーにアタックした場合 {{ic|/var}} を含むパーティションが一杯になってしまう可能性もあります)。さらに、攻撃者が IP アドレスを知っている場合、ソースヘッダーを偽装したパケットを送りつけてサーバーからロックアウトさせるよう仕向けてくるかもしれません。[[SSH 鍵]]はこれらの問題に煩わされることなくブルートフォースの問題を解決する方法を提供します。}} |
− | [http://www.sshguard.net sshguard] は [[ |
+ | [http://www.sshguard.net sshguard] は [[SSH]] などのサービスをブルートフォース攻撃から守るためのサービスで、[[fail2ban]] と似ています。 |
sshguard は他の2つと違って C で書かれており、軽量かつシンプルです。コアの機能は同等ながら機能は抑えめに作られています。 |
sshguard は他の2つと違って C で書かれており、軽量かつシンプルです。コアの機能は同等ながら機能は抑えめに作られています。 |
||
13行目: | 16行目: | ||
==インストール== |
==インストール== |
||
− | + | {{Pkg|sshguard}} パッケージを[[インストール]]してください。 |
|
==設定== |
==設定== |
||
− | === UFW === |
||
− | {{Warning|現在、[community] の ufw-033-3 は以下の方法と互換性がありません。ユーザーは AUR の {{AUR|ufw-bzr}} を使う必要があります。}} |
||
+ | sshguard は {{ic|/var/log/auth.log}} や [[syslog-ng]]、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は120秒で、ログインを失敗するたびに通信禁止時間が1.5倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。 |
||
− | UFW に DROP のコントロールを sshguard へ伝達させる必要があります。{{ic|/etc/ufw/before.rules}} を編集して以下の行を含めることで設定できます。ループバックデバイスのセクションの後に挿入してください。 |
||
+ | |||
+ | 一時的な ban も永続的な ban も、どちらも iptables の "sshguard" チェインにエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され {{ic|/var/log/auth.log}} に残ったり、systemd を使っている場合、systemd の journal に記録されます。 |
||
+ | |||
+ | sshguard によるブロックを機能させるにはファイアウォールを設定する必要があります。 |
||
+ | |||
+ | ==== FirewallD ==== |
||
+ | |||
+ | sshguard は Firewalld で使うことができます。firewalld が有効になっていることを確認して、先に firewalld をセットアップしてください。sshguard から設定ゾーンに書き込みが行われるようにするには、以下のコマンドを実行します: |
||
+ | |||
+ | # firewallctl zone "<zone name>" --permanent add rich-rule "rule source ipset=sshguard4 drop" |
||
+ | |||
+ | IPv6 を使っている場合、sshguard4 を sshguard6 に置き換えて同じコマンドを実行してください。設定したら、以下のコマンドを実行します: |
||
+ | |||
+ | # firewall-cmd --reload |
||
+ | |||
+ | 以下のコマンドで確認できます: |
||
+ | |||
+ | # firewall-cmd --info-ipset=sshguard4 |
||
+ | |||
+ | 最後に {{ic|/etc/sshguard.conf}} の {{ic|BACKEND}} 行を以下のように変更してください: |
||
+ | |||
+ | BACKEND="/usr/lib/sshguard/sshg-fw-firewalld" |
||
+ | |||
+ | ==== UFW ==== |
||
+ | |||
+ | UFW をインストール・有効化している場合、DROP の制御を sshguard に渡す必要があります。{{ic|/etc/ufw/before.rules}} を編集して以下の行を記述することで設定できます。ループバックデバイスのセクションの後に挿入してください。 |
||
{{Note|sshd を標準のポートで動作させていない場合は最後の行を修正する必要があります (22 が標準ポートです)。}} |
{{Note|sshd を標準のポートで動作させていない場合は最後の行を修正する必要があります (22 が標準ポートです)。}} |
||
+ | {{hc|/etc/ufw/before.rules| |
||
− | # hand off control for sshd to sshguard |
||
+ | # allow all on loopback |
||
− | -N sshguard |
||
− | + | -A ufw-before-input -i lo -j ACCEPT |
|
+ | -A ufw-before-output -o lo -j ACCEPT |
||
+ | # hand off control for sshd to sshguard |
||
− | この変更を行った後に ufw を[[systemd#ユニットを使う|再起動]]してください。 |
||
+ | # ipv4 |
||
+ | :sshguard - [0:0] |
||
+ | -A ufw-before-input -p tcp --dport 22 -j sshguard |
||
+ | #for ipv6 |
||
+ | :sshguard - [0:0] |
||
+ | -A ufw6-before-input -p tcp --dport 22 -j sshguard |
||
+ | }} |
||
+ | 上記の変更を行った後に [[ufw]] を[[systemd#ユニットを使う|再起動]]してください。 |
||
− | === ストレートの iptables === |
||
+ | |||
− | 主に必要な設定は iptables の INPUT チェインに "sshguard" という名前のチェインを作成することです。sshguard はこのチェインに自動的に悪いホストからのパケットを拒否するルールを追加します: |
||
+ | ==== iptables ==== |
||
+ | |||
+ | {{Note|先に [[iptables]] や[[シンプルなステートフルファイアウォール]]を読んでファイアウォールをセットアップしてください。}} |
||
+ | |||
+ | 必要な設定は iptables に {{ic|sshguard}} という名前のチェインを作成することです。sshguard はこのチェインに自動的に悪いホストからのパケットを拒否するルールを追加します: |
||
# iptables -N sshguard |
# iptables -N sshguard |
||
+ | |||
− | # iptables -A INPUT -p tcp --dport 22 -j sshguard |
||
+ | 次に {{ic|INPUT}} チェインから {{ic|sshguard}} チェインにジャンプするルールを追加します。以下のルールは sshguard が保護するポートを処理する他のルールよりも前に追加してください [http://www.sshguard.net/docs/setup/#netfilter-iptables]: |
||
+ | # iptables -A INPUT -m multiport -p tcp --destination-ports 21,22 -j sshguard |
||
+ | |||
+ | ルールを保存するには: |
||
# iptables-save > /etc/iptables/iptables.rules |
# 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 を使っていない場合、次のコマンドで空の {{ic|ip6tables.rules}} ファイルを作成して下さい: |
||
− | # touch /etc/iptables/ip6tables.rules |
||
− | 最後に: |
||
− | # systemctl reload iptables |
||
+ | {{Note|IPv6 を使っている場合、''ip6tables'' でも同じ設定を行ってから ''ip6tables-save'' で {{ic|/etc/iptables/ip6tables.rules}} にルールを保存してください。}} |
||
− | 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 |
||
+ | ==== nftables ==== |
||
− | 上記の手順を {{ic|ip6tables}} で IPv6 のファイアウォールルールも繰り返し設定して {{ic|ip6tables-save}} を使って {{ic|/etc/iptables/ip6tables.rules}} に保存して下さい。 |
||
+ | {{ic|/etc/sshguard.conf}} を編集して {{ic|BACKEND}} の値を以下のように変更してください: |
||
− | 強力なファイアウォールを作成するのに iptables を使う方法は、[[Simple stateful firewall]] を見て下さい。 |
||
+ | |||
+ | {{hc|1=/etc/sshguard.conf|2= |
||
+ | BACKEND="/usr/lib/sshguard/sshg-fw-nft-sets" |
||
+ | }} |
||
+ | |||
+ | {{ic|sshguard.service}} を[[起動]]・[[有効化]]したときに、{{ic|ip}} と {{ic|ip6}} アドレスファミリーに新しいテーブル {{ic|sshguard}} が追加され、受信トラフィックが sshguard の IP アドレスリストを経由してフィルタリングされるようになります。{{ic|sshguard}} テーブルのチェインのプライオリティは -10 に設定されるため、他のルールよりも先に処理されます。詳しくは {{man|7|sshguard-setup}} や [[nftables]] を見てください。 |
||
==使用方法== |
==使用方法== |
||
− | sshguard には設定ファイルが存在しません。全てのオプションは sshguard を起動するときに引数として指定します。{{ic|man sshguard}} を見て下さい。 |
||
− | ===systemd |
+ | ===systemd=== |
{{ic|sshguard.service}} を[[systemd#ユニットを使う|起動・有効化]]してください。 |
{{ic|sshguard.service}} を[[systemd#ユニットを使う|起動・有効化]]してください。 |
||
+ | ===syslog-ng=== |
||
− | sshguard に任意の引数を追加したいときは、[[systemd#ユニットファイルの編集|systemd#ユニットファイルの編集]] に書かれているようにパッケージに入っているサービスを修正して下さい。 |
||
− | |||
− | ===syslog-ng を使う=== |
||
{{Pkg|syslog-ng}} をインストールしている場合、コマンドラインから直接 sshguard を起動することができます: |
{{Pkg|syslog-ng}} をインストールしている場合、コマンドラインから直接 sshguard を起動することができます: |
||
/usr/sbin/sshguard -l /var/log/auth.log -b /var/db/sshguard/blacklist.db |
/usr/sbin/sshguard -l /var/log/auth.log -b /var/db/sshguard/blacklist.db |
||
− | == |
+ | ==設定== |
+ | |||
+ | ''sshguard'' を使うのに必要な設定は {{ic|/etc/sshguard.conf}} で行います。コメント付きの例は /usr/share/doc/sshguard/sshguard.conf.sample にあります。また、[https://bitbucket.org/sshguard/sshguard/src/master/examples/sshguard.conf.sample Bitbucket sshguard.conf.sample] にもあります。 |
||
+ | |||
+ | {{Note|''sshguards'' の systemd ユニットにコマンドをパイプで渡したりフラグを付ける方法はサポートされていません [https://sourceforge.net/p/sshguard/mailman/message/35709860/]。フラグは設定ファイルで編集することができます。}} |
||
+ | |||
+ | ===脅威レベルの変更=== |
||
+ | |||
+ | デフォルトの設定ファイルでは、違反者の "danger" レベルが 120 に淘汰すると永続的に ban されるようになっています (もしくはログインを12回失敗。詳しくは [https://www.sshguard.net/docs/terminology/#attack-dangerousness 攻撃の脅威] を参照)。ブラックリストファイルの前に脅威レベルを付けることで挙動を変えることができます: |
||
+ | |||
+ | BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db |
||
+ | |||
+ | 上記の例では {{ic|200:}} によって、ホストの脅威レベルが 200 にまで達したときに sshguard によって永続的に ban されるようになります。 |
||
+ | |||
+ | 設定後 {{ic|sshguard.service}} ユニットを [[再起動]] してください。 |
||
+ | |||
+ | === 適度に ban を行う例 === |
||
+ | |||
+ | ここでは、さまざまなオプションを説明するために、デフォルトよりも少し積極的な ban ルールを提案します。 |
||
+ | * [[sshd]] と [[vsftpd]] を [[systemd/ジャーナル]] のログから監視する。 |
||
+ | * 2 回の試行 (それぞれのコストは 10、{{ic|THRESHOLD}} パラメーターの値が 20 として) で 180 秒間攻撃者をブロックし、その後のブロック時間は 1.5 倍長くなります。この 1.5 倍の遅延は内部的なものであり、設定では制御されないことに注意してください。 |
||
+ | * 攻撃者は 10 回の試行後に永続的にブラックリストに登録されます (10 回の試行のコストは 10 であり、BLACKLIST_FILE パラメーターの値が 100 とします。) |
||
+ | * 攻撃者の IP だけでなく、すべての IPv4 サブネット 24 ([[wikipedia:ja:Classless Inter-Domain Routing|CIDR 表記]]) をブロックします。 |
||
+ | {{hc|/etc/sshguard.conf|2= |
||
+ | # Full path to backend executable (required, no default) |
||
+ | BACKEND="/usr/lib/sshguard/sshg-fw-iptables" |
||
+ | |||
+ | # Log reader command (optional, no default) |
||
+ | LOGREADER="LANG=C.UTF-8 /usr/bin/journalctl -afb -p info -n1 -t sshd -t vsftpd -o cat" |
||
+ | |||
+ | # How many problematic attempts trigger a block |
||
+ | THRESHOLD=20 |
||
+ | # Blocks last at least 180 seconds |
||
+ | BLOCK_TIME=180 |
||
+ | # The attackers are remembered for up to 3600 seconds |
||
+ | DETECTION_TIME=3600 |
||
+ | |||
+ | # Blacklist threshold and file name |
||
+ | BLACKLIST_FILE=100:/var/db/sshguard/blacklist.db |
||
+ | |||
+ | # IPv6 subnet size to block. Defaults to a single address, CIDR notation. (optional, default to 128) |
||
+ | IPV6_SUBNET=64 |
||
+ | # IPv4 subnet size to block. Defaults to a single address, CIDR notation. (optional, default to 32) |
||
+ | IPV4_SUBNET=24 |
||
+ | }} |
||
+ | |||
+ | === 積極的に ban を行う === |
||
+ | |||
+ | 断続的な攻撃に悩まされているユーザーにとっては、もっとアグレッシブな ban ポリシーを有効にしたほうが効果的でしょう。偶発的にログインを失敗するようなことは絶対ないと言えるのであれば、一度でもログインを失敗したらホストを自動的に ban するよう SSHGuard を設定することができます。設定ファイルのパラメータを以下のように編集してください: |
||
+ | THRESHOLD=10 |
||
+ | BLACKLIST_FILE=10:/var/db/sshguard/blacklist.db |
||
+ | |||
+ | 設定したら {{ic|sshguard.service}} ユニットを [[再起動]] してください。 |
||
+ | |||
+ | また、多重認証を拒否するには {{ic|/etc/ssh/sshd_config}} に以下のように定義します: |
||
+ | MaxAuthTries 1 |
||
+ | |||
+ | 変更を適用するには {{ic|sshd.service}} を [[再起動]] してください。 |
||
+ | ==ヒントとテクニック== |
||
− | sshguard は {{ic|/var/log/auth.log}} や [[syslog-ng|syslog-ng]]、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は7分で、ログインを失敗するたびに2倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。 |
||
+ | === ban を解除する === |
||
− | 一時的な ban も永続的な ban も、どちらも iptables の "sshguard" にエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され {{ic|/var/log/auth.log}} に残ったり、systemd を使っている場合、systemd の journal に記録されます。ban の効果がポート 22 だけ影響するようにするには、単純に他のポートで "sshguard" チェインをパケットが通過しないようにしてください。 |
||
+ | 自分自身が ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables や nftables を使って自分で ban を解除することができます。 |
||
− | archlinux のパッケージのデフォルトでは、違反者は "danger" レベルの40にまで達すると永続的に ban されます (もしくはログインを4回失敗。詳しくは [http://www.sshguard.net/docs/terminology/ terminology] を参照)。この挙動は blacklist ファイルの前に danger レベルを付け加えることで変えられます。例えば、systemd を使っていれば {{ic|/usr/lib/systemd/system/sshguard.service}} に以下のように挙動を設定することが可能です: |
||
+ | ==== iptables ==== |
||
− | [Service] |
||
− | ExecStart=/usr/lib/systemd/scripts/sshguard-journalctl "-b 200:/var/db/sshguard/blacklist.db" SYSLOG_FACILITY=4 SYSLOG_FACILITY=10 |
||
+ | まず sshguard によって IP が ban されているか確認してください。 |
||
− | 上の例では {{ic|200:}} によって danger レベル 200 まで達したホストは永久的に sshguard によって ban されます。 |
||
+ | # iptables --list sshguard --line-numbers --numeric |
||
− | ===アグレッシブに ban をおこなう=== |
||
+ | それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認した番号に置き換えてください: |
||
− | 断続的な攻撃に悩まされているユーザーにとっては、もっとアグレッシブな ban ポリシーを有効にしたほうが効果的でしょう。偶発的にログインを失敗するようなことは絶対ないと言えるのであれば、一度でもログインを失敗したらホストを自動的に ban するよう SSHGuard を設定することができます。systemd を使っているなら以下の手順にしたがって設定できます: |
||
+ | # iptables --delete sshguard ''line-number'' |
||
+ | 永続的に ban を解除するには {{ic|/var/db/sshguard/blacklist.db}} から IP アドレスを削除する必要があります。 |
||
− | SSHGuard を停止: |
||
+ | ==== nftables ==== |
||
− | # systemctl stop sshguard |
||
+ | {{ic|attackers}} から自分の IP アドレスを削除するには: |
||
− | {{ic|/usr/lib/systemd/system/sshguard.service}} の以下の行を編集: |
||
+ | # nft delete element ''family'' sshguard attackers { ''ip_address'' } |
||
− | [Service] |
||
− | ExecStart=/usr/lib/systemd/scripts/sshguard-journalctl "-a 1 -b 10:/var/db/sshguard/blacklist.db" SYSLOG_FACILITY=4 SYSLOG_FACILITY=10 |
||
+ | {{ic|''family''}} には {{ic|ip}} または {{ic|ip6}} のどちらかを指定します。 |
||
− | 次のコマンドでユニットをリロードする必要があります: |
||
+ | === ログ出力 === |
||
− | # systemctl daemon-reload |
||
+ | sshguard に渡されたものを確認したい場合、{{ic|/usr/lib/systemd/scripts/sshguard-journalctl}} のスクリプトや systemd サービス {{ic|sshguard.service}} をチェックしてください。以下のコマンドでもターミナルで同じログを表示できます: |
||
− | そして SSHGuard を再起動: |
||
+ | $ journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10 |
||
− | # systemctl start sshguard |
||
+ | {{TranslationStatus|Sshguard|2024-07-21|812155}} |
||
− | ==ban を解除する方法== |
||
− | ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables を使って自分で ban を解除することができます。まず sshguard によって ip が ban されているか確認してください: |
||
− | # iptables -L sshguard --line-numbers |
||
− | それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認したものに置き換えてください: |
||
− | # iptables -D sshguard <line-number> |
2024年8月16日 (金) 18:38時点における最新版
関連記事
sshguard は SSH などのサービスをブルートフォース攻撃から守るためのサービスで、fail2ban と似ています。
sshguard は他の2つと違って C で書かれており、軽量かつシンプルです。コアの機能は同等ながら機能は抑えめに作られています。
sshguard は同じようなツールが持っている、ログ解析による 脆弱性 から攻撃されることは (ほとんど、または絶対に) ありません。
目次
インストール
設定
sshguard は /var/log/auth.log
や syslog-ng、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は120秒で、ログインを失敗するたびに通信禁止時間が1.5倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。
一時的な ban も永続的な ban も、どちらも iptables の "sshguard" チェインにエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され /var/log/auth.log
に残ったり、systemd を使っている場合、systemd の journal に記録されます。
sshguard によるブロックを機能させるにはファイアウォールを設定する必要があります。
FirewallD
sshguard は Firewalld で使うことができます。firewalld が有効になっていることを確認して、先に firewalld をセットアップしてください。sshguard から設定ゾーンに書き込みが行われるようにするには、以下のコマンドを実行します:
# firewallctl zone "<zone name>" --permanent add rich-rule "rule source ipset=sshguard4 drop"
IPv6 を使っている場合、sshguard4 を sshguard6 に置き換えて同じコマンドを実行してください。設定したら、以下のコマンドを実行します:
# firewall-cmd --reload
以下のコマンドで確認できます:
# firewall-cmd --info-ipset=sshguard4
最後に /etc/sshguard.conf
の BACKEND
行を以下のように変更してください:
BACKEND="/usr/lib/sshguard/sshg-fw-firewalld"
UFW
UFW をインストール・有効化している場合、DROP の制御を sshguard に渡す必要があります。/etc/ufw/before.rules
を編集して以下の行を記述することで設定できます。ループバックデバイスのセクションの後に挿入してください。
/etc/ufw/before.rules
# 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 # ipv4 :sshguard - [0:0] -A ufw-before-input -p tcp --dport 22 -j sshguard #for ipv6 :sshguard - [0:0] -A ufw6-before-input -p tcp --dport 22 -j sshguard
iptables
必要な設定は iptables に sshguard
という名前のチェインを作成することです。sshguard はこのチェインに自動的に悪いホストからのパケットを拒否するルールを追加します:
# iptables -N sshguard
次に INPUT
チェインから sshguard
チェインにジャンプするルールを追加します。以下のルールは sshguard が保護するポートを処理する他のルールよりも前に追加してください [1]:
# iptables -A INPUT -m multiport -p tcp --destination-ports 21,22 -j sshguard
ルールを保存するには:
# iptables-save > /etc/iptables/iptables.rules
nftables
/etc/sshguard.conf
を編集して BACKEND
の値を以下のように変更してください:
/etc/sshguard.conf
BACKEND="/usr/lib/sshguard/sshg-fw-nft-sets"
sshguard.service
を起動・有効化したときに、ip
と ip6
アドレスファミリーに新しいテーブル sshguard
が追加され、受信トラフィックが sshguard の IP アドレスリストを経由してフィルタリングされるようになります。sshguard
テーブルのチェインのプライオリティは -10 に設定されるため、他のルールよりも先に処理されます。詳しくは sshguard-setup(7) や nftables を見てください。
使用方法
systemd
sshguard.service
を起動・有効化してください。
syslog-ng
syslog-ng をインストールしている場合、コマンドラインから直接 sshguard を起動することができます:
/usr/sbin/sshguard -l /var/log/auth.log -b /var/db/sshguard/blacklist.db
設定
sshguard を使うのに必要な設定は /etc/sshguard.conf
で行います。コメント付きの例は /usr/share/doc/sshguard/sshguard.conf.sample にあります。また、Bitbucket sshguard.conf.sample にもあります。
脅威レベルの変更
デフォルトの設定ファイルでは、違反者の "danger" レベルが 120 に淘汰すると永続的に ban されるようになっています (もしくはログインを12回失敗。詳しくは 攻撃の脅威 を参照)。ブラックリストファイルの前に脅威レベルを付けることで挙動を変えることができます:
BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db
上記の例では 200:
によって、ホストの脅威レベルが 200 にまで達したときに sshguard によって永続的に ban されるようになります。
設定後 sshguard.service
ユニットを 再起動 してください。
適度に ban を行う例
ここでは、さまざまなオプションを説明するために、デフォルトよりも少し積極的な ban ルールを提案します。
- sshd と vsftpd を systemd/ジャーナル のログから監視する。
- 2 回の試行 (それぞれのコストは 10、
THRESHOLD
パラメーターの値が 20 として) で 180 秒間攻撃者をブロックし、その後のブロック時間は 1.5 倍長くなります。この 1.5 倍の遅延は内部的なものであり、設定では制御されないことに注意してください。 - 攻撃者は 10 回の試行後に永続的にブラックリストに登録されます (10 回の試行のコストは 10 であり、BLACKLIST_FILE パラメーターの値が 100 とします。)
- 攻撃者の IP だけでなく、すべての IPv4 サブネット 24 (CIDR 表記) をブロックします。
/etc/sshguard.conf
# Full path to backend executable (required, no default) BACKEND="/usr/lib/sshguard/sshg-fw-iptables" # Log reader command (optional, no default) LOGREADER="LANG=C.UTF-8 /usr/bin/journalctl -afb -p info -n1 -t sshd -t vsftpd -o cat" # How many problematic attempts trigger a block THRESHOLD=20 # Blocks last at least 180 seconds BLOCK_TIME=180 # The attackers are remembered for up to 3600 seconds DETECTION_TIME=3600 # Blacklist threshold and file name BLACKLIST_FILE=100:/var/db/sshguard/blacklist.db # IPv6 subnet size to block. Defaults to a single address, CIDR notation. (optional, default to 128) IPV6_SUBNET=64 # IPv4 subnet size to block. Defaults to a single address, CIDR notation. (optional, default to 32) IPV4_SUBNET=24
積極的に ban を行う
断続的な攻撃に悩まされているユーザーにとっては、もっとアグレッシブな ban ポリシーを有効にしたほうが効果的でしょう。偶発的にログインを失敗するようなことは絶対ないと言えるのであれば、一度でもログインを失敗したらホストを自動的に ban するよう SSHGuard を設定することができます。設定ファイルのパラメータを以下のように編集してください:
THRESHOLD=10 BLACKLIST_FILE=10:/var/db/sshguard/blacklist.db
設定したら sshguard.service
ユニットを 再起動 してください。
また、多重認証を拒否するには /etc/ssh/sshd_config
に以下のように定義します:
MaxAuthTries 1
変更を適用するには sshd.service
を 再起動 してください。
ヒントとテクニック
ban を解除する
自分自身が ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables や nftables を使って自分で ban を解除することができます。
iptables
まず sshguard によって IP が ban されているか確認してください。
# iptables --list sshguard --line-numbers --numeric
それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認した番号に置き換えてください:
# iptables --delete sshguard line-number
永続的に ban を解除するには /var/db/sshguard/blacklist.db
から IP アドレスを削除する必要があります。
nftables
attackers
から自分の IP アドレスを削除するには:
# nft delete element family sshguard attackers { ip_address }
family
には ip
または ip6
のどちらかを指定します。
ログ出力
sshguard に渡されたものを確認したい場合、/usr/lib/systemd/scripts/sshguard-journalctl
のスクリプトや systemd サービス sshguard.service
をチェックしてください。以下のコマンドでもターミナルで同じログを表示できます:
$ journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10