Falco + Nginx プラグインで Web 攻撃をリアルタイム検知!
AWS EC2環境で試してみる

1. はじめに - なぜFalco + Nginxプラグインが必要なのか

Webアプリケーションセキュリティの現実

現代のWebアプリケーションは、以下のような深刻なセキュリティ脅威に常に晒されています:

  • SQL インジェクション: データベースへの不正アクセス
  • クロスサイトスクリプティング(XSS): ユーザーブラウザでの悪意のあるスクリプト実行
  • ディレクトリトラバーサル: システムファイルへの不正アクセス
  • コマンドインジェクション: サーバー上での任意コマンド実行

Falco + Nginxプラグインが提供するソリューション

falco-plugin-nginx は、CNCF プロジェクトである Falco に Nginx アクセスログ解析機能を追加するプラグインです。これにより、Nginx を経由したリクエストから SQLインジェクション、XSS、ディレクトリトラバーサル、コマンドインジェクションなどの攻撃パターンをリアルタイムに検知できます。

主な特徴:

🔍 リアルタイム攻撃検知

Nginxアクセスログを即座に解析し、SQLi・XSSなどの攻撃を瞬時に発見

⚡ 超軽量動作

Go言語実装でオーバーヘッド最小

📝 柔軟なルール作成

YAML形式で攻撃パターンを柔軟に定義・カスタマイズ

2. システム構成と動作原理

全体アーキテクチャー

📊 システムアーキテクチャーフロー

👥 攻撃者/正規ユーザー
⬇️
🌐 Nginx Webサーバー
⬇️
📄 アクセスログファイル
/var/log/nginx/access.log
⬇️
🔍 Falco + falco-plugin-nginx
リアルタイム解析
⬇️
📋 検知ルール
nginx_rules.yaml
⬇️
🚨 アラート生成・通知
ログ出力

動作原理の詳細

📥 Step 1: ログファイル監視

falco-plugin-nginxは、Falcoフレームワークの一部として動作し、Nginxのアクセスログファイル(/var/log/nginx/access.log)をtail -fのようにリアルタイムで監視します。新しいログエントリが追加されるたびに、即座に読み取りとパースが実行されます。

🔍 Step 2: ログ解析とパターン抽出

各ログエントリから以下の要素を抽出・解析します:

  • IPアドレス: リクエスト送信元の特定
  • HTTPメソッド: GET/POST等の判定
  • リクエストパス: アクセス対象URLの検査
  • クエリパラメータ: 攻撃パターンが潜む主要領域
  • User-Agent: 攻撃ツールの特定
  • レスポンスステータス: 攻撃の成否判定

🎯 Step 3: ルールエンジンによる脅威判定

抽出された情報は、事前定義されたYAMLベースのルールセット(nginx_rules.yaml)と照合されます。このルールエンジンは以下の処理を行います:

  • パターンマッチング: 正規表現や文字列パターンによる攻撃検知
  • 重要度判定: Critical/Warning/Notice/Infoのレベル分類
  • コンテキスト分析: IPアドレス、パス、パラメータの組み合わせ評価
  • ホワイトリスト処理: 正当なトラフィックの除外

🚨 Step 4: アラート生成と出力

脅威が検知された場合、構造化されたアラートが生成されます:

  • 検知ログ: タイムスタンプ付きの詳細情報
  • 攻撃分類: SQLi/XSS/CMDi等のカテゴリ
  • 送信元情報: IPアドレス、User-Agent等
  • 攻撃内容: 実際のペイロードと検知理由

検知対象の攻撃パターン例

攻撃タイプ重要度検知対象
SQL InjectionCriticalクエリパラメータ' OR '1'='1
XSSWarningスクリプトタグ<script>alert(1)</script>
Directory TraversalCriticalパストラバーサル../../etc/passwd
Command InjectionCriticalコマンド実行;cat /etc/passwd

3. 環境準備 - AWS EC2セットアップ

推奨環境仕様

効果的なテスト環境を構築するための推奨仕様:

項目推奨値説明
インスタンスタイプt2.micro以上無料利用枠でも動作
OSUbuntu 22.04 LTS長期サポート版
カーネル5.8以上modern eBPF対応
メモリ1GB以上Falco動作に最低限必要
ストレージ10GB以上ログファイル保存用(必要な場合)

4. インストール - ワンライナーで簡単導入

🚀 ワンライナーインストール

最も簡単な方法は、公式インストールスクリプトを使用することです:

基本インストール
curl -sSL https://raw.githubusercontent.com/takaosgb3/falco-plugin-nginx/main/install.sh | sudo bash

📋 テスト環境付きインストール

攻撃テスト用のサンプルサイトも同時にセットアップする場合:

テスト環境付きインストール
curl -sSL https://raw.githubusercontent.com/takaosgb3/falco-plugin-nginx/main/install.sh \ | sudo SETUP_TEST_CONTENT=yes bash

💡 インストールスクリプトが実行する処理

  1. 依存関係の解決(jq、Nginxの設定確認)
  2. Falcoのインストール(modern eBPFモード有効化)
  3. falco-plugin-nginxバイナリの配置
  4. 検知ルールファイルの設定
  5. Falco設定の更新
  6. サービスの起動・有効化

⚠️ インストール時の注意事項

権限エラーやカーネルバージョンの問題が発生した場合は、システムの更新やFalcoの依存関係を確認してください。また、インストール完了後は必ずテスト環境で動作確認を行ってください。

5. テスト環境の構築

インストール起動時の画面

インストールが正常に起動すると、以下のような画面が表示されます:

インストール起動画面

falco-plugin-nginxインストール起動時の画面

テスト環境のセットアップ

SETUP_TEST_CONTENT=yesオプションでインストールした場合、攻撃テスト用のサンプルサイトが自動構築されます:

テストサイト画面

セキュリティテスト専用サイト - 各種攻撃パターンのテストエンドポイントを提供

インストール完了とテスト準備

インストールが完了すると、次のステップとしてテスト方法が案内されます:

インストール完了とテスト案内

インストール完了後のテスト方法案内 - 各種攻撃パターンのテストコマンドとFalcoログ監視方法を表示

💡 テスト環境の特徴

  • 専用テストページ: 各攻撃パターン専用のエンドポイント
  • URL エンコーディング対応: 実際の攻撃と同様の形式でテスト
  • 検知確認機能: リアルタイムでFalcoアラートを確認可能
  • 安全な環境: 隔離されたテスト専用環境

6. 攻撃パターンの実践検証

リアルタイム監視の開始

まず、別のターミナルでFalcoのログをリアルタイム監視します:

Falcoログの監視
sudo journalctl -u falco-modern-bpf -f -o cat

攻撃テストの実行

攻撃テスト実行画面

実際の攻撃テスト実行とリアルタイム検知の様子

1. SQL Injection攻撃

SQL Injection攻撃コマンド
curl "http://localhost/search.php?q=%27%20OR%20%271%27%3D%271"

URLデコード後: ' OR '1'='1

この攻撃は、SQL文の論理条件を常に真にして認証を回避しようとします。

検知ログ例
Critical [NGINX SQLi] ip=127.0.0.1 method=GET path=/search.php qs=q=%27%20OR%20%271%27%3D%271 ua=curl/7.81.0 status=200

2. XSS攻撃

XSS攻撃コマンド
curl "http://localhost/search.php?q=%3Cscript%3Ealert(1)%3C/script%3E"

URLデコード後: <script>alert(1)</script>

悪意のあるJavaScriptコードをWebページに注入しようとする攻撃です。

検知ログ例
Warning [NGINX XSS] ip=127.0.0.1 method=GET path=/search.php qs=q=%3Cscript%3Ealert(1)%3C/script%3E ua=curl/7.81.0 status=200

検知結果の確認

実行した攻撃パターンがすべて検知されていることを確認できます:

検知ログ画面

Falcoによる各種攻撃パターンの検知ログ

7. カスタムルールの作成

ルール構造の理解

Falcoのルールは3つの要素で構成されています:

1. list

検知対象の値やパターンを定義

2. macro

条件の組み合わせを再利用可能な形で定義

3. rule

実際の検知条件と出力を定義

カスタムルールの作成例

管理画面への不正アクセス検知

/etc/falco/rules.d/local_nginx_rules.yaml
# 管理系パスのリスト
- list: admin_paths
  items: ["/admin", "/administrator", "/wp-admin", "/phpmyadmin"]

# 許可された管理者IPのリスト  
- list: admin_ips
  items: ["192.168.1.100", "10.0.1.50"]

# Nginxイベントを判定するマクロ
- macro: is_nginx_event
  condition: (evt.source = nginx)

# 管理画面への不正アクセス検知ルール
- rule: NGINX Unauthorized Admin Access
  desc: Detect unauthorized access to admin pages
  condition: >
    is_nginx_event and 
    (nginx.path startswith "/admin" or nginx.path in (admin_paths)) and
    not (nginx.ip in (admin_ips))
  output: >
    [UNAUTHORIZED ADMIN ACCESS] Suspicious admin access detected
    (ip=%nginx.ip method=%nginx.method path=%nginx.path ua="%nginx.ua" 
     status=%nginx.status size=%nginx.size)
  priority: Critical
  tags: [nginx, web, unauthorized, admin]

ルールの検証とデプロイ

1. 構文チェック
sudo falco --validate /etc/falco/rules.d/local_nginx_rules.yaml
2. ルール適用
sudo systemctl restart falco-modern-bpf
3. 動作確認
curl "http://localhost/admin/" -H "User-Agent: testbot"

8. まとめ

今回達成したこと

✅ 環境構築

AWS EC2上でFalco + Nginxプラグインの動作環境を構築

✅ 攻撃検知

SQLi、XSS、Directory Traversal、Command Injectionの検知を実証

✅ ルール理解

検知ロジックとカスタマイズ方法を習得

セキュリティ向上の効果

  • 可視性の向上: 従来見えなかった攻撃パターンをリアルタイム検知
  • 迅速な対応: 攻撃発生から検知までのタイムラグを最小化
  • コスト効率: オープンソースで高機能なセキュリティ監視を実現
  • 統合性: 既存のモニタリング・アラート基盤との連携が容易