「Sshguard」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
 
(4人の利用者による、間の11版が非表示)
1行目: 1行目:
[[Category:Secure Shell]]
+
[[Category:セキュアシェル]]
  +
[[Category:ファイアウォール]]
 
[[en:Sshguard]]
 
[[en:Sshguard]]
 
[[es:Sshguard]]
 
[[es:Sshguard]]
  +
[[zh-hans:Sshguard]]
 
{{Related articles start}}
 
{{Related articles start}}
 
{{Related|Fail2ban}}
 
{{Related|Fail2ban}}
18行目: 20行目:
 
==設定==
 
==設定==
   
sshguard は {{ic|/var/log/auth.log}} や [[syslog-ng]]、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は7分で、ログインを失敗するたびに2倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。
+
sshguard は {{ic|/var/log/auth.log}} や [[syslog-ng]]、そして systemd の journal にログイン試行の失敗がないか監視することで動作します。試行が失敗するたびに、問題のホストは ban されて、しばらく通信ができなくなります。違反者が通信できなくなるデフォルトの時間は120秒で、ログインを失敗するたびに通信禁止時間が1.5倍になります。何度もログイン失敗したホストは永久的に追放するように sshguard を設定することもできます。
   
一時的な ban も永続的な ban も、どちらも iptables の "sshguard" チェインにエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され {{ic|/var/log/auth.log}} に残ったり、systemd を使っている場合、systemd の journal に記録されます。ban の効果がポート 22 だけ影響するようにするには、単純に他のポートで "sshguard" チェインをパケットが通過しないようにしてください
+
一時的な ban も永続的な ban も、どちらも iptables の "sshguard" チェインにエントリを追加して違反者からのパケットを全て拒否することで行われています。ban は syslog に記録され {{ic|/var/log/auth.log}} に残ったり、systemd を使っている場合、systemd の journal に記録されます。
   
 
sshguard によるブロックを機能させるにはファイアウォールを設定する必要があります。
 
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 ====
31行目: 51行目:
   
 
{{hc|/etc/ufw/before.rules|
 
{{hc|/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
 
# hand off control for sshd to sshguard
  +
# ipv4
-N sshguard
 
  +
:sshguard - [0:0]
 
-A ufw-before-input -p tcp --dport 22 -j sshguard
 
-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
 
}}
 
}}
   
46行目: 74行目:
   
 
次に {{ic|INPUT}} チェインから {{ic|sshguard}} チェインにジャンプするルールを追加します。以下のルールは sshguard が保護するポートを処理する他のルールよりも前に追加してください [http://www.sshguard.net/docs/setup/#netfilter-iptables]:
 
次に {{ic|INPUT}} チェインから {{ic|sshguard}} チェインにジャンプするルールを追加します。以下のルールは sshguard が保護するポートを処理する他のルールよりも前に追加してください [http://www.sshguard.net/docs/setup/#netfilter-iptables]:
# iptables -A INPUT -p tcp --dport 22 -j sshguard
+
# iptables -A INPUT -m multiport -p tcp --destination-ports 21,22 -j sshguard
   
 
ルールを保存するには:
 
ルールを保存するには:
52行目: 80行目:
   
 
{{Note|IPv6 を使っている場合、''ip6tables'' でも同じ設定を行ってから ''ip6tables-save'' で {{ic|/etc/iptables/ip6tables.rules}} にルールを保存してください。}}
 
{{Note|IPv6 を使っている場合、''ip6tables'' でも同じ設定を行ってから ''ip6tables-save'' で {{ic|/etc/iptables/ip6tables.rules}} にルールを保存してください。}}
  +
  +
==== nftables ====
  +
  +
{{ic|/etc/sshguard.conf}} を編集して {{ic|BACKEND}} の値を以下のように変更してください:
  +
  +
{{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]] を見てください。
   
 
==使用方法==
 
==使用方法==
57行目: 95行目:
 
===systemd===
 
===systemd===
   
{{ic|sshguard.service}} を[[systemd#ユニットを使う|起動・有効化]]してください。同梱されている systemd ユニットは {{ic|/var/db/sshguard/blacklist.db}} のブラックリストを使って journalctl を sshguard にパイプで渡しています
+
{{ic|sshguard.service}} を[[systemd#ユニットを使う|起動・有効化]]してください。
 
sshguard に任意の引数を追加したいときは、[[systemd#ユニットファイルの編集]]に書かれているようにパッケージに入っているサービスを修正して下さい。
 
   
 
===syslog-ng===
 
===syslog-ng===
68行目: 104行目:
 
==設定==
 
==設定==
   
  +
''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|sshguard v2 から設定は {{ic|/etc/sshguard.conf}} で行うことができます。sshguard を設定するために systemd ユニットを作成していた場合、{{ic|/etc/systemd/system/sshguard.service}} ファイルを削除することでパッケージに同梱されている systemd ユニットにリバートすることができます。その後 {{ic|/etc/sshguard.conf}} ファイルを編集してください。}}
 
  +
  +
{{Note|''sshguards'' の systemd ユニットにコマンドをパイプで渡したりフラグを付ける方法はサポートされていません [https://sourceforge.net/p/sshguard/mailman/message/35709860/]。フラグは設定ファイルで編集することができます。}}
   
 
===脅威レベルの変更===
 
===脅威レベルの変更===
   
Arch に含まれているデフォルトの systemd ユニットでは、違反者の "danger" レベルが 120 に淘汰すると永続的に ban されるようになっています (もしくはログインを12回失敗。詳しくは [http://www.sshguard.net/docs/terminology/ terminology] を参照)。ブラックリストファイルの前に脅威レベルを付けることで挙動を変えることができます:
+
デフォルトの設定ファイルでは、違反者の "danger" レベルが 120 に淘汰すると永続的に ban されるようになっています (もしくはログインを12回失敗。詳しくは [https://www.sshguard.net/docs/terminology/#attack-dangerousness 攻撃の脅威] を参照)。ブラックリストファイルの前に脅威レベルを付けることで挙動を変えることができます:
   
 
BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db
 
BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db
78行目: 116行目:
 
上記の例では {{ic|200:}} によって、ホストの脅威レベルが 200 にまで達したときに sshguard によって永続的に ban されるようになります。
 
上記の例では {{ic|200:}} によって、ホストの脅威レベルが 200 にまで達したときに sshguard によって永続的に ban されるようになります。
   
設定後 {{ic|sshguard.service}} ユニットを[[再起動]]してください。
+
設定後 {{ic|sshguard.service}} ユニットを [[再起動]] してください。
   
===アグレッシブに ban をおこなう===
+
=== 適度に 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 を設定することができます。設定ファイルのパラメータを以下のように編集してください:
 
断続的な攻撃に悩まされているユーザーにとっては、もっとアグレッシブな ban ポリシーを有効にしたほうが効果的でしょう。偶発的にログインを失敗するようなことは絶対ないと言えるのであれば、一度でもログインを失敗したらホストを自動的に ban するよう SSHGuard を設定することができます。設定ファイルのパラメータを以下のように編集してください:
86行目: 154行目:
 
BLACKLIST_FILE=10:/var/db/sshguard/blacklist.db
 
BLACKLIST_FILE=10:/var/db/sshguard/blacklist.db
   
設定したら {{ic|sshguard.service}} ユニットを[[再起動]]してください。
+
設定したら {{ic|sshguard.service}} ユニットを [[再起動]] してください。
   
  +
また、多重認証を拒否するには {{ic|/etc/ssh/sshd_config}} に以下のように定義します:
==Tips and tricks==
 
  +
MaxAuthTries 1
  +
  +
変更を適用するには {{ic|sshd.service}} を [[再起動]] してください。
  +
  +
==ヒントとテクニック==
   
 
=== ban を解除する ===
 
=== ban を解除する ===
   
自分自身が ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables を使って自分で ban を解除することができます。まず sshguard によって IP が ban されているか確認してください:
+
自分自身が ban されてしまった場合、自動的に ban が解除されるのを待つか、iptables や nftables を使って自分で ban を解除することができます。
  +
# iptables -L sshguard --line-numbers --numeric
 
  +
==== iptables ====
  +
  +
まず sshguard によって IP が ban されているか確認してください。
  +
  +
# iptables --list sshguard --line-numbers --numeric
   
 
それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認した番号に置き換えてください:
 
それから次のコマンドを使って ban を解除します、line-number は前のコマンドで確認した番号に置き換えてください:
# iptables -D sshguard <line-number>
+
# iptables --delete sshguard ''line-number''
   
永続的に ban を解除するには {{ic|/var/db/sshguard/blacklist.db}} から IP アドレスを削除する必要があります:
+
永続的に ban を解除するには {{ic|/var/db/sshguard/blacklist.db}} から IP アドレスを削除する必要があります
  +
# sed -i '/<ip-address>/d' /var/db/sshguard/blacklist.db
 
  +
==== nftables ====
  +
  +
{{ic|attackers}} から自分の IP アドレスを削除するには:
  +
  +
# nft delete element ''family'' sshguard attackers { ''ip_address'' }
  +
  +
{{ic|''family''}} には {{ic|ip}} または {{ic|ip6}} のどちらかを指定します。
   
 
=== ログ出力 ===
 
=== ログ出力 ===
106行目: 191行目:
   
 
$ journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
 
$ journalctl -afb -p info SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
  +
  +
{{TranslationStatus|Sshguard|2024-07-21|812155}}

2024年8月16日 (金) 18:38時点における最新版

関連記事

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

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

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

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

インストール

sshguard パッケージをインストールしてください。

設定

sshguard は /var/log/auth.logsyslog-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.confBACKEND 行を以下のように変更してください:

BACKEND="/usr/lib/sshguard/sshg-fw-firewalld"

UFW

UFW をインストール・有効化している場合、DROP の制御を sshguard に渡す必要があります。/etc/ufw/before.rules を編集して以下の行を記述することで設定できます。ループバックデバイスのセクションの後に挿入してください。

ノート: sshd を標準のポートで動作させていない場合は最後の行を修正する必要があります (22 が標準ポートです)。
/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

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

iptables

ノート: 先に 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
ノート: IPv6 を使っている場合、ip6tables でも同じ設定を行ってから ip6tables-save/etc/iptables/ip6tables.rules にルールを保存してください。

nftables

/etc/sshguard.conf を編集して BACKEND の値を以下のように変更してください:

/etc/sshguard.conf
BACKEND="/usr/lib/sshguard/sshg-fw-nft-sets"

sshguard.service起動有効化したときに、ipip6 アドレスファミリーに新しいテーブル 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 にもあります。

ノート: sshguards の systemd ユニットにコマンドをパイプで渡したりフラグを付ける方法はサポートされていません [2]。フラグは設定ファイルで編集することができます。

脅威レベルの変更

デフォルトの設定ファイルでは、違反者の "danger" レベルが 120 に淘汰すると永続的に ban されるようになっています (もしくはログインを12回失敗。詳しくは 攻撃の脅威 を参照)。ブラックリストファイルの前に脅威レベルを付けることで挙動を変えることができます:

BLACKLIST_FILE=200:/var/db/sshguard/blacklist.db

上記の例では 200: によって、ホストの脅威レベルが 200 にまで達したときに sshguard によって永続的に ban されるようになります。

設定後 sshguard.service ユニットを 再起動 してください。

適度に ban を行う例

ここでは、さまざまなオプションを説明するために、デフォルトよりも少し積極的な ban ルールを提案します。

  • sshdvsftpdsystemd/ジャーナル のログから監視する。
  • 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
翻訳ステータス: このページは en:Sshguard の翻訳バージョンです。最後の翻訳日は 2024-07-21 です。もし英語版に 変更 があれば、翻訳の同期を手伝うことができます。