Fedora ServerにおけるCrowdSecのインストールとfirewalld連携設定ガイド

Fedora tutorial - IT technology blog
Fedora tutorial - IT technology blog

クイックスタート:5分で完了するCrowdSecとFirewalld bouncerの導入

SSHの22番ポートをインターネットに公開しているだけで、低スペックな安価なVPSであっても毎日3,000〜5,000回もの自動パスワード総当たり(ブルートフォース)攻撃に晒されます。長年にわたりFail2banが定番ツールとして使われてきましたが、シングルスレッドによる正規表現ログ解析の仕組みは、パフォーマンス面で明らかな限界を見せ始めています。CrowdSecはこの課題を抜本的に解決します。ローカルでの攻撃を即座に検知するだけでなく、コミュニティ全体で共有される数万件もの悪性IPをプロアクティブに事前ブロックできます。

Fedora Server上でのクイックセットアップ手順(rootまたはsudo権限が必要です):

ステップ 1:CrowdSec公式リポジトリの追加

# PackageCloudから公式リポジトリ設定スクリプトを実行
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.rpm.sh | sudo bash

ステップ 2:Security EngineとFirewall Bouncerのインストール

# ログ解析エンジンとファイアウォール連携コンポーネントをインストール
sudo dnf install -y crowdsec crowdsec-firewall-bouncer-iptables

ステップ 3:サービスの起動と自動起動の有効化

# CrowdSecデーモンを起動
sudo systemctl enable --now crowdsec

# Firewall Bouncerを起動
sudo systemctl enable --now crowdsec-firewall-bouncer

ステップ 4:接続と動作の確認

# 現在ブロックされているIPリストを確認
sudo cscli decisions list

# BouncerがEngineに正常に連携されているか確認
sudo cscli bouncers list

Valid 列が true と表示されていれば、システムはログの解析を開始し、違反IPをfirewalldへ即座に反映する準備が整っています。

動作アーキテクチャ:EngineとBouncerの明確な分離

Fedora Serverはデフォルトでバックエンドに nftables を採用した firewalld を使用しています。これまでFedoraにfail2banを導入する際、ルールセットの競合や線形なiptablesチェインの肥大化・遅延に悩まされるケースが少なくありませんでした。CrowdSecは完全にモジュール化されたアーキテクチャにより、これらの問題を極めてスマートに解決します。

1. EngineとBouncerの連携メカニズム

ログ解析とネットワーク遮断を単一の重たいプロセスにまとめるのではなく、CrowdSecは明確に役割を2つに分割しています:

  • CrowdSec Engine: ログの収集・解析に特化したコアコンポーネントです。バックグラウンドで動作し、消費メモリはわずか60〜80MB程度です。journald、Nginx、SSHなどのログを事前定義されたシナリオに基づいて直接パースします。例えばクライアントが10秒間に5回パスワードを間違えた場合、Engineは即座に通常4時間のBAN期間を含む「Decision(遮断判定)」を生成します。
  • Firewall Bouncer: 判定の執行(ブロッキング)を担当します。Bouncerはローカルホスト限定で開放されているポート 8080 のLocal APIを介して、定期的にEngineへ問い合わせを行います。新たな遮断命令があると、対象IPを即座に firewalld のブロックリストに追加します。この処理は瞬時に行われ、ファイアウォールの再起動や既存のアクティブな接続セッションを中断させることはありません。

2. コミュニティ主導の早期警戒ネットワーク(Crowd-sourced Intelligence)

これこそが従来のFail2banに対するCrowdSecの最大の強みです。例えば、フランクフルトにあるFedoraサーバーがボットネットによる脆弱性スキャンを受けたとします。その攻撃元IPは直ちにCrowdSecのセントラルサーバーへ送信され、ノイズや誤検知を排除するアルゴリズムで検証されます。そしてわずか数分後には、あなたのサーバーにもこのブラックリストが同期されます。攻撃者がネットワークの境界に触れた瞬間、パケットは即座にドロップされ、SSHやNginxのプロセスに到達することすらできません。

本番環境向けのおすすめ最適化設定

1. firewalldのipsetを活用したBouncerの最適化チューニング

Bouncerの設定ファイルを開きます:

sudo nano /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml

パラメータが firewalld モードに正しく設定されていることを確認します:

mode: firewalld
blacklists_ipv4: crowdsec-blacklists
blacklists_ipv6: crowdsec6-blacklists
supported_actions:
  - ban

このモードでは、Bouncerは crowdsec-blacklists という名称のipsetを作成し、アクティブなゾーンに直接バインドします。O(1)の計算量で検索できるハッシュテーブル構造のおかげで、ブロックリストに50,000件以上のIPが登録されていても、サーバーのCPU負荷はほぼゼロのままであり、ネットワークスループットの低下も一切発生しません。

変更を反映するためにBouncerを再起動します:

sudo systemctl restart crowdsec-firewall-bouncer

2. Nginx保護シナリオとWebスキャン対策の有効化

インストール直後の初期状態では、CrowdSecはSSHログのみを解析対象としています。サーバー上でNginxやリバースプロキシを運用している場合は、CrowdSec Hubから対応するコレクション(シナリオ群)を追加導入しましょう:

# Nginxに対する機密パス探索やWeb攻撃を検知
sudo cscli collections install crowdsecurity/nginx

# SQLmapやNiktoなどの自動スキャナーをブロック
sudo cscli collections install crowdsecurity/http-cve

# 設定をEngineに再読み込み
sudo systemctl reload crowdsec

3. CrowdSec Consoleによる集中管理

3台以上のFedoraノードを運用する場合、ターミナルで個別にサーバーを監視するのは非効率です。app.crowdsec.net で無料アカウントを作成し、すべてのセキュリティアラートを直感的なWebダッシュボードへ一元集約しましょう:

# Webコンソールで発行されたキーを使ってノードを連携
sudo cscli console enroll <YOUR_ENROLL_KEY>

# 同期を有効にするためEngineを再起動
sudo systemctl restart crowdsec

実運用におけるTipsとトラブル回避術

1. 自身のアクセス遮断を防ぐホワイトリストの設定

最も避けたいトラブルは、スクリプトでSSHセッションを同時に複数開いたり秘密鍵を誤指定したりした結果、管理者自身が半日締め出されてしまう事態です。作業前にオフィスの固定IPやVPNサブネットをホワイトリストへ登録しておきましょう:

sudo nano /etc/crowdsec/parsers/s02-enrich/my-whitelist.yaml

以下の内容を記述します:

name: my/admin-whitelist
description: "管理者IPホワイトリスト"
filter: "true"
whitelist:
  reason: "管理者の固定IP"
  ip:
    - "123.45.67.89"       # 管理者の固定IP
  cidr:
    - "192.168.1.0/24"     # 社内ローカルネットワーク
    - "10.8.0.0/24"        # WireGuardまたはOpenVPNのサブネット

安全リストを適用するためにEngineを再読み込みします:

sudo systemctl reload crowdsec

2. 誤遮断されたIPを迅速に解除(Unban)する方法

チームメンバーがパスワード入力ミスなどで誤ってブロックされてしまった場合、即座に対象IPのBANを解除できます:

# 特定のIPのBANを解除
sudo cscli decisions delete --ip 198.51.100.25

# 緊急時:現在のすべての遮断リストをクリア
sudo cscli decisions delete --all

3. cscli metricsによる運用メトリクスの可視化

ログが正常に捕捉・解析されているかどうかを勘に頼る必要はありません。次のコマンドを実行します:

sudo cscli metrics

ターミナルに詳細な統計テーブルが表示されます。読み取られたログの行数、正常にパースされたイベント数、過去24時間に最も多くトリガーされたシナリオなどが一目で把握できます。生ログを1行ずつ手作業で追うことなく、しきい値(Threshold)のチューニングを的確に行うための確かな判断材料となります。

Share: