CaddyでWAFしてみる
2026-02-25 22:04:31 Caddy内容が古くなっている可能性があるのでご注意ください。
Windows に Caddy+Coraza+CoreRuleSet で WAF を入れます。
図
準備するもの
- Go コンパイラー
- xcaddy
- CoreRuleSet (Windows の場合)
Caddy+Coraza+CoreRuleSetまでの手順
上の「準備するもの」のインストールについても記載しています。
Go コンパイラー
インストール後に go コマンドにパスを通しておきます。
xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
インストール後に xcaddy コマンドにパスを通しておきます。
Coraza WAF Caddy Module (を組み込んだ caddy のビルド)
xcaddy コマンドを実行して coraza-caddy を組み込んだ caddy を作成します。
xcaddy build --with github.com/corazawaf/coraza-caddy/v2 --with github.com/caddyserver/replace-response
他に組み込みたいモジュールがあれば、上記のコマンドに --with を追記します。
Caddy のモジュールとしては coraza-caddy があれば WAF は実現できます。 ですがここでは replace-response も組み込んでいます。 これは、Webアプリの書き方によって露出することがあるオリジナルの URL を置き換えるためです。
ちょっとだけ解説
xcaddy コマンドは、指定されたオプションを使って、caddy のソースコードをフェッチして、それをビルドするツール。
--with オプションで指定されたパッケージはモジュールと呼ばれるもので、パッケージの初期化関数 (init() のこと) で自身の機能や設定ファイルの読み込み処理を caddy に登録している。
coraza-caddy のソースコードを見るとイメージしやすいかもしれません。
https://github.com/corazawaf/coraza-caddy/blob/main/caddy/main.go ☐↗
// Copyright 2023 The OWASP Coraza contributors
// SPDX-License-Identifier: Apache-2.0
package main
import (
caddycmd "github.com/caddyserver/caddy/v2/cmd"
_ "github.com/caddyserver/caddy/v2/modules/standard"
_ "github.com/corazawaf/coraza-caddy/v2" // ←★xcaddy はこの行を埋め込んだソースコードを生成してビルドする。
)
func main() { // ←★main() はデバッグや単体組み込のためにあるので無視してよい。
caddycmd.Main()
}
https://github.com/corazawaf/coraza-caddy/blob/main/coraza.go ☐↗
func init() {
caddy.RegisterModule(corazaModule{})
httpcaddyfile.RegisterHandlerDirective("coraza_waf", parseCaddyfile)
}
CoreRuleSet
https://github.com/coreruleset/coreruleset/releases ☐↗
最新版の minimal 付きのものをダウンロードして、上でビルドした caddy のある場所に展開します。
caddy.exe
coreruleset-4.23.0/
crs-setup.conf.example 等
あとで少しファイルのリネームを行います。
動作確認と設定
IIS のバインドを変更する
ふつうは HTTP は 80、HTTP は 443 ですが、そちらは caddy がバインドするので、IIS ではそれぞれ 1080, 1443 にバインドしておきます。
サイトの設定から変更しておきます。
Caddyfile
以下の内容の Caddyfile を caddy.exe と同じ場所に置きます。
{
order coraza_waf first
}
(waf) {
coraza_waf {
load_owasp_crs
directives `
Include @coraza.conf-recommended
Include @crs-setup.conf.example
#Windows ではパス区切り文字の関係か、rules/xxx.conf が読めない旨のエラーが出る。
#Include @owasp_crs/*.conf
Include ./coreruleset-4.23.0/rules/*.conf
SecDefaultAction "phase:3,log,auditlog,pass"
SecDefaultAction "phase:4,log,auditlog,pass"
SecDefaultAction "phase:5,log,auditlog,pass"
SecRuleEngine On
#適当なファイルに出力する。
#SecDebugLog /home/coraza/logs/debug.log
SecDebugLog ./debug.log
SecDebugLogLevel 9
SecRule REQUEST_URI "@streq /admin" "id:101,phase:1,t:lowercase,deny,status:403"
SecRule REQUEST_BODY "@rx maliciouspayload" "id:102,phase:2,t:lowercase,deny,status:403"
SecRule RESPONSE_STATUS "@rx 406" "id:103,phase:3,t:lowercase,deny,status:403"
SecResponseBodyAccess On
SecResponseBodyMimeType application/json
SecRule RESPONSE_BODY "@contains responsebodycode" "id:104,phase:4,t:lowercase,deny,status:403"
SecAuditEngine On
#適当なファイルに出力する。
#SecAuditLog /home/coraza/logs/audit.log
SecAuditLog ./audit.log
SecAuditLogFormat json
`
}
# handle_errors 403 {
# header X-Blocked "true"
# root * /etc/caddy/custom-pages
# rewrite * /{err.status_code}.html
# file_server
# templates
# }
}
https://mysite.example.com {
tls internal
import waf
reverse_proxy http://localhost:1080 {
# HTTPS で自己署名証明書の場合は下の行を有効にする。
# transport http {
# tls_insecure_skip_verify
# }
}
replace localhost:1080 mysite.example.com
}
(WAF の部分の記述内容は https://github.com/corazawaf/coraza-caddy/blob/main/example/Caddyfile ☐↗ から持ってきています)
Coraza WAF Caddy Module (coraza-caddy) には CRS の定義が含まれている どうやら Windows ではロードした内容が含まれるパスをたどることができないようで、結果としてファイル読み込みができない旨のエラーが出ます。
そういうわけで、上の Caddyfile ではローカルの CRS (前の手順でダウンロードしていたもの) を読み込むようにしています。
#Include @owasp_crs/*.conf
Include ./coreruleset-4.23.0/rules/*.conf
- 📄 Hugo テーマ 9. Pagefind でサイト内検索機能を付ける2026-06-15 00:11:30静的なインデックスを使った検索 UI を提供する Pagefind を組み込みます。
- 📄 Hugo テーマ 8. Shortcodes と Render hooks2026-06-15 00:11:30Markdown で記述したコンテンツ (テーマの利用側) に対して Hugo が用意した HTML 変換の仕組みを解説します。
- 📄 Hugo テーマ 7. layouts/baseof.html をいじる2026-06-15 00:11:30サイト全体に共通する、ページのレイアウト定義を編集します。
- 📄 Hugo テーマ 6. layouts/home.html をいじる2026-06-15 00:11:30トップページのレイアウト定義を編集します。
- 📄 Hugo テーマ 5. layouts/section.html をいじる2026-06-15 00:11:30content 内のディレクトリーに対応するレイアウト定義を編集します。
- 📄 Hugo テーマ 4. layouts/page.html をいじる2026-06-15 00:11:30コンテンツに対応するページのレイアウトを編集します。
- 📄 Hugo テーマ 3. 作られたファイル2026-06-15 00:11:30前回作ったテーマを構成するファイルを解説します。
- 📄 Hugo テーマ 2. まずは作ってみる2026-06-15 00:11:30テーマを作りプロジェクトに適用するところまでを解説します。
- 📄 Hugo テーマ 1. はじめに2026-06-15 00:11:30連載「Hugo テーマ」を行う背景とその方針を説明します。
- 📄 vvin2026-05-30 16:58:07Windows のウィンドウサイズを操作する CLI アプリ