Apache-2.0 Rust · Pingora セルフホスト

Cloudflare クラスの防御を 自分のインフラに

PingWAF は分散型で集中管理される Web アプリケーションファイアウォールです。サイト・ルール・ポリシーをコントロールプレーンで一度定義すれば、各エッジエージェントが数秒で適用します。リロードもダウンタイムも不要です。

正規化 → シグネチャ → 式 → スコア
4 フェーズ 正規化 → シグネチャ → 式 → スコア
コントロールプレーンの gRPC プロトコル
7 RPC コントロールプレーンの gRPC プロトコル
DNS-01 ACME 連携
5 プロバイダ DNS-01 ACME 連携
SQLi · XSS · RCE · パストラバーサル
localhost:9080/dashboard
PingWAF のダッシュボード。リクエスト分析、攻撃傾向、エージェント状態を表示
ルールは数秒で反映
Apache-2.0
エンドツーエンドでオープンソース
リクエスト課金もホスト型サービスへの依存もありません。
Rust
メモリ安全なデータプレーン
Pingora と tokio を 1 つの自己完結バイナリに。
PostgreSQL
コントロールプレーンの状態
サイト、ルール、設定スナップショット、監査履歴。
gRPC
ルールのホット同期
双方向ストリーム。プロセスの再起動は不要。

アーキテクチャ

1 つのコントロールプレーン、多数のエッジエージェント

コントロールプレーンが設定の唯一の正解です。エージェントはトラフィックとポリシー適用だけを担うため、状態に触れずにデータプレーンを拡張できます。

状態はコントロールプレーンが保持

サイト、ルール、証明書、設定バージョンは PostgreSQL に保存され、Axum の REST API、tonic の gRPC、組み込みコンソールから操作します。

エージェントがエッジで適用

各エージェントはディスク上のルールキャッシュを保持し、コントロールプレーンに到達できなくても最後に同期したポリシーで提供を続けます。

リロードなしで変更が届く

SyncRules が既存の双方向ストリームで新しい設定を送信し、エージェントはリクエストを流したままメモリ上で差し替えます。

コントロールプレーンの仕組み

機能

多層防御を、既定ではすべて無効で

すべての防御は無効な状態で提供され、サイト単位で有効化します。有効にするまでトラフィックの挙動は変わりません。

意味解析 WAF エンジン

SQL インジェクション、XSS、RCE、パストラバーサル、コマンドインジェクションをシグネチャとヒューリスティックで検知します。

  • libinjection と Aho-Corasick の併用
  • Cloudflare 風の式ルール
  • Pass / Monitor / Block / Challenge の判定
WAF エンジン

CC・ボット対策

段階的なチャレンジで急増するリクエストを吸収し、実際のブラウザとスクリプトを切り分けます。

  • JavaScript 5 秒シールドと Proof of Work
  • HMAC 署名付きクリアランス Cookie
  • サイト単位の検証済みボット許可リスト
CC・ボット対策

アクセス制御

アドレス、地域、リクエストの観点でオリジンへ到達できる相手を決めます。

  • CIDR と CSV インポートに対応した IP ルール
  • 国と ASN による地域制限
  • IP・ホスト・パス・ヘッダー単位のレート制限
アクセス制御

トラフィックとキャッシュ

コンソールから離れずにルーティング、負荷分散、キャッシュを設定できます。

  • 5 種類の負荷分散を備えたオリジンプール
  • プレフィックス・完全一致・正規表現のルート
  • クォータと SWR を備えたエッジキャッシュ
トラフィックとキャッシュ

TLS と証明書

証明書はエッジで発行され、状態は 1 か所で確認できます。

  • ACME HTTP-01 / DNS-01 と自動更新
  • ハートビートによるサイト別証明書状態
  • mTLS の発行と即時失効
TLS と証明書

可観測性とコンソール

すべてのリクエストを監査でき、すべての設定変更を元に戻せます。

  • WAL バッファ付きで Elasticsearch へログ出力
  • 再現可能なリクエスト/レスポンスの生データ保存
  • 差分とロールバックを備えた設定バージョン
可観測性

すべての機能

コンソールの中身

別のスタックなしで運用

コンソールはバイナリに埋め込まれているため、画面に見えているものがそのままコントロールプレーンの事実です。

localhost:9080/sites/example.com/security/protection
WAF ルールのタブとチャレンジ設定を表示するサイト保護ページ
WAF ルールと CC チャレンジはサイト単位で設定します。
localhost:9080/logs
判定と一致ルールを表示するリクエストログ一覧
リクエストログには判定・スコア・一致ルールが残ります。
localhost:9080/sites/example.com/ssl
証明書状態と ACME イベントを表示するサイト TLS ページ
サイトごとの証明書状態と ACME イベント。

クイックスタート

ゼロから保護されたサイトまで

同梱の compose ファイルがコントロールプレーン、エージェント、PostgreSQL をまとめて起動します。ログインしてサイトを追加すれば、エッジが適用を開始します。

  1. スタックを起動

    docker compose up -d で公開イメージと PostgreSQL を起動します。

  2. ログイン

    https://localhost:9080 を開き、初期管理者アカウントでログインします。

  3. サイトを追加

    ドメインをエージェントに向け、サイト単位で防御を有効にします。

bash — pingwaf
$ git clone https://github.com/shuaiZend/PingWAF.git
$ cd PingWAF && docker compose up -d
コントロールプレーン https://localhost:9080
エージェント :80 / :443
postgres :5432

読み、監査し、所有できる WAF

ルールも判定もログも、すべて自分のインフラに残ります。ライセンスはそのすべてを変更することを許します。