Linux環境におけるCrowdSecの導入と設定:Fail2banを刷新してボットネットを効率的にブロック

Security tutorial - IT technology blog
Security tutorial - IT technology blog

背景と導入の理由

午前2時、PagerDutyのアラートでスマートフォンが激しく振動しました。SSH踏み台サーバー(bastion)クラスタのCPU使用率は一気に96%まで跳ね上がっています。急いでターミナルを開き、ログを確認しました。

sudo journalctl -u ssh -f

Failed password for invalid userというログ行が滝のように激しく流れ続けます。毎秒約300リクエスト。分散型ブルートフォース攻撃がサーバークラスタを直撃していました。サーバー上で稼働していたFail2banは過負荷に陥り始めました。Fail2banはPythonベースの正規表現でログを解析するため、トラフィックが急増するとCPUの1コアを丸ごと消費してしまうのです。

さらに深刻だったのは、ボットネットの攻撃手法でした。攻撃者は数万単位のIPプールを次々とローテーションさせていました。各IPは1回試行するだけで別のIPアドレスに切り替わります。そのため、Fail2banでお馴染みのmaxretry = 5といった閾値設定はまったく役に立ちませんでした。

これが、CrowdSecへ移行を決めた理由です。Go言語で書かれたCrowdSecは、RAMやCPUのリソース消費が極めて軽量です。何より重要なのは、協調型脅威インテリジェンス(Collaborative Threat Intelligence)ネットワークとして機能する点です。世界中のいずれかのノードが脆弱性スキャンを行うIPを検知すると、そのIPは即座にネットワーク全体へ共有されます。自身のサーバーはそのリストを自動取得し、ネットワーク層の段階で接続を遮断できるのです。

CrowdSecのアーキテクチャは明確に2つのコンポーネントに分離されています。

  • Security Engine: ログを読み込み、事前定義されたシナリオに基づいて振る舞いを解析し、対処(IPのBANやCAPTCHA適用)を決定します。
  • Remediation Component (Bouncer): Engineからの指示を受け取り、nftables、iptables、Nginx、Cloudflareなどを通じてパケットレベルでIPを直接ブロックします。

インストール手順

Ubuntu/Debian環境でファイアウォールルールの競合を防ぐため、CrowdSecのリポジトリを追加する前にFail2banを停止・無効化しておきます。

# Fail2banの停止と無効化
sudo systemctl stop fail2ban
sudo systemctl disable fail2ban

# CrowdSec公式リポジトリの追加
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash

# Security Engineのインストール
sudo apt-get update
sudo apt-get install -y crowdsec

インストールが完了すると、Security Engineは実行中のサービス(OpenSSHやNginxなど)を自動検出し、適切なパーサーを読み込みます。ただし、Engine自体は検知を行うのみでパケットを遮断しません。検知結果を実際のブロックアクションに結びつけるには、Firewall Bouncerを追加で導入する必要があります。

# Firewall Bouncerのインストール(nftablesまたはiptablesを自動識別)
sudo apt-get install -y crowdsec-firewall-bouncer-iptables

2つのサービスのステータスを確認します。

sudo systemctl status crowdsec
sudo systemctl status crowdsec-firewall-bouncer

詳細設定

1. ログ取得元の設定(Acquisition)

デフォルトのログ取得設定ファイルは/etc/crowdsec/acquis.yamlにあります。ファイルを開いて設定を確認します。

sudo nano /etc/crowdsec/acquis.yaml

CrowdSecがシステムの適切なログファイルを読み込んでいることを確認します。

filenames:
  - /var/log/auth.log
  - /var/log/syslog
labels:
  type: syslog
---
filenames:
  - /var/log/nginx/*.log
labels:
  type: nginx

2. 検知シナリオ(Collections)のインストール

CrowdSecでは、パーサーと検知シナリオがcollectionとしてパッケージ化されています。CLIツールであるcscliを使えば、素早く管理できます。SSHやNginx向けの代表的なルールセットをインストールしましょう。

# 最新のルールカタログを更新
sudo cscli hub update

# SSHおよびNginx保護ルールのインストール
sudo cscli collections install crowdsecurity/sshd
sudo cscli collections install crowdsecurity/nginx
sudo cscli collections install crowdsecurity/http-cve

# 設定のリロード
sudo systemctl reload crowdsec

サービスアカウントの整理やパスワード再設定を行う際は、toolcraft.app/ja/tools/security/password-generatorのツールを利用してエントロピーの高いセキュアなランダム文字列を生成できます。処理ロジックはブラウザ上のJavaScriptで完結し、ネットワーク経由でデータを送信しないため、ターミナルに貼り付ける際も安全です。

3. CrowdSec Consoleとの連携

CrowdSecには、複数サーバーに対する攻撃を視覚的に一括確認できる無料のWebダッシュボードが用意されています。app.crowdsec.netでアカウントを作成し、登録キー(enrollment key)を取得してサーバーを紐付けます。

# ノードをコンソールアカウントに紐付け
sudo cscli console enroll [YOUR_ENROLL_KEY]

# Engineの再起動
sudo systemctl restart crowdsec

検証とモニタリング

起動後わずか数分で、ターミナルから直接コマンドを実行して動作状況や効果を確認できます。

1. 攻撃アラート一覧の確認

以下のコマンドを実行すると、アラートをトリガーした直近のスキャンや攻撃が一覧表示されます。

sudo cscli alerts list

取得データは視認性の高いテーブル形式で出力されます。

+----+------------------+-------------------------------+--------+---------+----+--------+--------------------------------+
| ID |      scope       |             value             | reason | country | as | events |           created_at           |
+----+------------------+-------------------------------+--------+---------+----+--------+--------------------------------+
|  1 | Ip:194.26.29.112 | crowdsecurity/ssh-bf          | ban    | RU      | .. |      6 | 2026-10-30 02:22:15 +0000 UTC  |
|  2 | Ip:45.154.255.89 | crowdsecurity/http-crawl-non_ | ban    | NL      | .. |     42 | 2026-10-30 02:35:40 +0000 UTC  |
+----+------------------+-------------------------------+--------+---------+----+--------+--------------------------------+

2. ブロック対象IPリスト(Decisions)の管理

現在アクセスを禁止されているIP一覧を表示します。

sudo cscli decisions list

必要に応じて、手動でIPをBANまたはBAN解除することも可能です。

# 不審なIPを手動で24時間ブロック
sudo cscli decisions add --ip 198.51.100.25 --duration 24h --reason "Manual ban suspicious IP"

# 必要に応じてブロックを解除
sudo cscli decisions delete --ip 198.51.100.25

3. カーネルファイアウォール層の確認

Bouncerはブラックリストをipsetまたはnftablesのセットへ直接同期します。確認するには以下のコマンドを実行します。

sudo nft list set inet crowdsec crowdsec-blacklists
# またはiptablesの場合:
sudo iptables -L -n -v | grep crowdsec

何千もの悪意あるIPがカーネルのRAM上に効率よく展開されます。悪質なパケットはネットワークカードレベルで即座にドロップされ、NginxやSSHデーモンには一切到達しません。

4. リアルタイムパフォーマンスの監視

システムがこれまでにどれだけのログ行を処理したか確認するには、以下を実行します。

sudo cscli metrics

私のサーバークラスタでは、CrowdSecへ移行したことで、夜間にボットネットが激しくスキャンを繰り返している最中でもCPU使用率が95%から6%未満へと劇的に低減しました。

Share: