sshguard
sshguard は侵入防止システムです。サーバーのログを精査して害意ある行動を検出し、危害を加えようとする接続元IPアドレスを拒絶するファイアーウォールを用います。sshguard は、C言語で書かれており、インタプリターは不要です。
動作の仕組み
sshguard は、一つないし複数のログファイルを継続追跡する簡単なデーモンです。他のデーモンが記録したログイン試行失敗のログを精査して、その接続を拒絶するようにシステムファイアーウォールを更新することで、更なる試行を阻止します。
sshguard は、その名称にも拘わらず、 SSH のログのみを精査するわけではありません。多くのメールシステムやいくらかの FTP システムにも対応しています。対応しているサービスの全リストは、sshguard.net ウェブサイト で公開されています。
インストール
Emerge
app-admin/sshguard をインストール:
root #
emerge --ask app-admin/sshguard
追加のソフトウェア
sshguard が悪意のあるアクターをブロックするために、init システム、および sshguard に使用させたいファイアウォールバックエンドに応じて、追加のソフトウェアを emerge する必要があるかもしれません。
対応している様々なバックエンドについての詳しい情報は、セットアップ man ページを読むことで見つかります:
root #
man 7 sshguard-setup
iptables
システムのファイアウォールとして iptables が使用されているときは。
root #
emerge --ask net-firewall/iptables
iptables の利用と設定に関しての詳細は、 iptables の記事 も参照してください。
nftables
システムのファイアウォールとして nftables が使用されているときは:
root #
emerge --ask net-firewall/nftables
設定
iptables バックエンド
ファイアーウォールの準備
sshguard が悪意のあるユーザーをブロック (IP アドレスを遮断することによって) するとき、sshguard チェーンを使用します。
iptables でチェーンを準備し、外からの新しい接続が検出されたときにそれが発動することも確認してください:
root #
iptables -N sshguard
root #
iptables -A INPUT -j sshguard
そして、/etc/sshguard.conf で iptables バックエンドライブラリへの適切なパスが設定されていることを確認してください:
# Full path to backend executable (required, no default)
BACKEND="/usr/libexec/sshg-fw-iptables"
ログファイルの監視
sshguard の背後にある基本的な考え方は、管理者がアプリケーションのオプションとして監視対象のログファイルを渡す、ということです。sshguard 固有の構成ファイルは存在しません。
Gentoo では、このオプションは /etc/sshguard.conf ファイル内に設定するのがベストでしょう:
# Space-separated list of log files to monitor. (optional, no default)
FILES="/var/log/messages /var/log/auth.log"
#
# How many problematic attempts trigger a block
THRESHOLD=10
# Blocks last at least 24 hours (60480 seconds)
BLOCKTIME=60480
# Track IP addresses for 24 hours (60480 seconds)
DETECTION_TIME=60480
#
# 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
#
# Full path to PID file (optional, no default)
PID_FILE=/run/sshguard.pid
sshguardランタイムユーザーが、使用するログファイルにアクセス可能であることを確認してください。
サービス
OpenRC
sshguardをデフォルトのランレベルに追加することでデフォルトで起動されます:
root #
rc-update add sshguard default
root #
rc-service sshguard start
systemd
systemd の標準的な方法で有効化して、起動してください:
root #
systemctl enable sshguard
root #
systemctl restart sshguard
ホストをブラックリストに入れる
ブラックリストオプションを使うと、多数の連続アクセスを受けた後、攻撃者の IP アドレスまたは IP サブネットを永続的にブロックします。ブラックリストは起動のたびに読み込まれ、動作中に新しいエントリで拡張されていきます。連続アクセスのしきい値を超えると、sshguard は新しいアドレスを追加します。
ブラックリストに入れられたアドレスは、再び解放 (許可) が予定されることは決してありません。
ブラックリストを有効化するには、適切なディレクトリとファイルを作成してください:
root #
mkdir -p /var/lib/sshguard
root #
touch /var/lib/sshguard/blacklist.db
ブラックリストを定義している間は、信頼された IP ネットワークとホストをホワイトリストに入れて除外するのが重要です。
ホワイトリストを有効化するには、適切なディレクトリとファイルを作成してください:
root #
mkdir -p /etc/sshguard
root #
touch /etc/sshguard/whitelist
ホワイトリストはループバックインターフェースを含む必要があり、少なくとも 1 つの信頼されたネットワーク (この例では 192.0.2.0/24) を持つべきです。
127.0.0.0/8
::1/128
192.0.2.0/24
192.0.2.0/24 のエントリは需要に合うように修正する必要があります。
BLACKLIST_FILE および WHITELIST_FILE ファイルを設定に追加してください。下に例示した設定では、すべてのホストを最初のログイン試行の後にブロックします。より緩やかなブロックポリシーを設定するには、THRESHOLD と BLACKLIST_FILE の整数を、2 の代わりに例えば 10 に設定してください:
BACKEND="/usr/libexec/sshg-fw-iptables"
FILES="/var/log/auth.log"
#
THRESHOLD=2
BLOCK_TIME=43200
DETECTION_TIME=604800
#
IPV4_SUBNET=24
IPV6_SUBNET=64
#
PID_FILE=/run/sshguard.pid
#
# 以下の行を追加してください
BLACKLIST_FILE=2:/var/lib/sshguard/blacklist.db
WHITELIST_FILE=/etc/sshguard/whitelist
変更を反映させるために sshguard デーモンを再起動してください:
root #
/etc/init.d/sshguard restart
トラブルシューティング
File '/var/log/auth.log' vanished while adding!
起動時に sshguard が次のエラーを報告します:
Sep 23 03:39:11 foo.bar.com sshguard[64933]: File '/var/log/auth.log' vanished while adding!
監視対象ファイル (ファイルパスは異なるかもしれません) がシステム上で利用できない場合、このようなエラーが発生します。ファイルが作成されていることを確認するか、ファイルを監視対象に追加しないように sshguard 構成を更新してください。
OpenRC 上で syslog-ng を動かしているシステムでは、syslog-ng.conf に以下の追記を行うだけで十分です:
log { source(src); destination(messages); };
log { source(src); destination(console_all); };
destination authlog {file("/var/log/auth.log"); };
filter f_auth { facility(auth); };
filter f_authpriv { facility(auth, authpriv); };
log { source(src); filter(f_authpriv); destination(authlog); };
変更を有効にするために、設定を再読み込みしてください:
root #
rc-service syslog-ng reload
関連項目
- Fail2ban — a system denying hosts causing multiple authentication errors access to a service.
- Iptables — a program used to configure and manage the kernel's netfilter modules.
外部の情報
sshguard documentation はアプリケーションをさらに調整するのに必要なすべての情報を提供しています。