1. はじめに - なぜFalco + Nginxプラグインが必要なのか
Webアプリケーションセキュリティの現実
現代のWebアプリケーションは、以下のような深刻なセキュリティ脅威に常に晒されています:
- SQL インジェクション: データベースへの不正アクセス
- クロスサイトスクリプティング(XSS): ユーザーブラウザでの悪意のあるスクリプト実行
- ディレクトリトラバーサル: システムファイルへの不正アクセス
- コマンドインジェクション: サーバー上での任意コマンド実行
Falco + Nginxプラグインが提供するソリューション
falco-plugin-nginx は、CNCF プロジェクトである Falco に Nginx アクセスログ解析機能を追加するプラグインです。これにより、Nginx を経由したリクエストから SQLインジェクション、XSS、ディレクトリトラバーサル、コマンドインジェクションなどの攻撃パターンをリアルタイムに検知できます。
主な特徴:
🔍 リアルタイム攻撃検知
Nginxアクセスログを即座に解析し、SQLi・XSSなどの攻撃を瞬時に発見
⚡ 超軽量動作
Go言語実装でオーバーヘッド最小
📝 柔軟なルール作成
YAML形式で攻撃パターンを柔軟に定義・カスタマイズ
2. システム構成と動作原理
全体アーキテクチャー
📊 システムアーキテクチャーフロー
/var/log/nginx/access.log
リアルタイム解析
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 Injection | Critical | クエリパラメータ | ' OR '1'='1 |
XSS | Warning | スクリプトタグ | <script>alert(1)</script> |
Directory Traversal | Critical | パストラバーサル | ../../etc/passwd |
Command Injection | Critical | コマンド実行 | ;cat /etc/passwd |
3. 環境準備 - AWS EC2セットアップ
推奨環境仕様
効果的なテスト環境を構築するための推奨仕様:
項目 | 推奨値 | 説明 |
---|---|---|
インスタンスタイプ | t2.micro以上 | 無料利用枠でも動作 |
OS | Ubuntu 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
💡 インストールスクリプトが実行する処理
- 依存関係の解決(jq、Nginxの設定確認)
- Falcoのインストール(modern eBPFモード有効化)
- falco-plugin-nginxバイナリの配置
- 検知ルールファイルの設定
- Falco設定の更新
- サービスの起動・有効化
⚠️ インストール時の注意事項
権限エラーやカーネルバージョンの問題が発生した場合は、システムの更新やFalcoの依存関係を確認してください。また、インストール完了後は必ずテスト環境で動作確認を行ってください。
5. テスト環境の構築
インストール起動時の画面
インストールが正常に起動すると、以下のような画面が表示されます:

falco-plugin-nginxインストール起動時の画面
テスト環境のセットアップ
SETUP_TEST_CONTENT=yesオプションでインストールした場合、攻撃テスト用のサンプルサイトが自動構築されます:

セキュリティテスト専用サイト - 各種攻撃パターンのテストエンドポイントを提供
インストール完了とテスト準備
インストールが完了すると、次のステップとしてテスト方法が案内されます:

インストール完了後のテスト方法案内 - 各種攻撃パターンのテストコマンドとFalcoログ監視方法を表示
💡 テスト環境の特徴
- 専用テストページ: 各攻撃パターン専用のエンドポイント
- URL エンコーディング対応: 実際の攻撃と同様の形式でテスト
- 検知確認機能: リアルタイムでFalcoアラートを確認可能
- 安全な環境: 隔離されたテスト専用環境
6. 攻撃パターンの実践検証
リアルタイム監視の開始
まず、別のターミナルでFalcoのログをリアルタイム監視します:
sudo journalctl -u falco-modern-bpf -f -o cat
攻撃テストの実行

実際の攻撃テスト実行とリアルタイム検知の様子
1. 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攻撃
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
実際の検知条件と出力を定義
カスタムルールの作成例
管理画面への不正アクセス検知
# 管理系パスのリスト
- 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の検知を実証
✅ ルール理解
検知ロジックとカスタマイズ方法を習得
セキュリティ向上の効果
- 可視性の向上: 従来見えなかった攻撃パターンをリアルタイム検知
- 迅速な対応: 攻撃発生から検知までのタイムラグを最小化
- コスト効率: オープンソースで高機能なセキュリティ監視を実現
- 統合性: 既存のモニタリング・アラート基盤との連携が容易