microcms の webhook で Next.js の Route Handler をたたいてもログが出ない件
You cannot bypass or skip Bot Fight Mode using the Skip action in WAF custom rules or using Page Rules. Skip, Bypass, and Allow actions apply to rules or rulesets running on the Ruleset Engine.
どうやら BotFlightMode には 2 種類あるみたいで、SuperBotFightMode なら WAF による skip が行えるらしい.....
This is why you can skip Super Bot Fight Mode, but not Bot Fight Mode. If you need to skip Bot Fight Mode, consider using Super Bot Fight Mode.
SuperBotFightMode では skip できるが pro プランからのみ使えるぽく、free プランなのであきらめて Bots を disabled にすることで対応
使用しているもの
- microcms
- Next.js AppRouter
- Cloudflare
Cloudflare は A レコード DNS Proxied で Vercel を見ている
起きていること
- microcms の custom webhook で Next.js AppRouter の Route Handler で作成した endpoint をたたいているが Vercel のログにも出ない
今のところわかっていること
- dev hook を経由するとログに現れる
- 自前の端末で curl をたたいても動く
わけわからんので GPT4 にきいてみたら Cloudflare WAF が原因なのでは?と言われた
`具体的に問題が起きた domain 名` は cloudflare DNS を proxied で vercel に A レコードで接続されています。
github actions の curl の response status が 403 になっているのですが、考えられることは何ですか?
これが response header の全文です
\`\`\`
HTTP/2 403
date: Fri, 01 Mar 2024 13:19:27 GMT
content-type: text/html; charset=UTF-8
accept-ch: Sec-CH-UA-Bitness, Sec-CH-UA-Arch, Sec-CH-UA-Full-Version, Sec-CH-UA-Mobile, Sec-CH-UA-Model, Sec-CH-UA-Platform-Version, Sec-CH-UA-Full-Version-List, Sec-CH-UA-Platform, Sec-CH-UA, UA-Bitness, UA-Arch, UA-Full-Version, UA-Mobile, UA-Model, UA-Platform-Version, UA-Platform, UA
cross-origin-embedder-policy: require-corp
cross-origin-opener-policy: same-origin
cross-origin-resource-policy: same-origin
origin-agent-cluster: ?1
permissions-policy: accelerometer=(),autoplay=(),browsing-topics=(),camera=(),clipboard-read=(),clipboard-write=(),geolocation=(),gyroscope=(),hid=(),interest-cohort=(),magnetometer=(),microphone=(),payment=(),publickey-credentials-get=(),screen-wake-lock=(),serial=(),sync-xhr=(),usb=()
referrer-policy: same-origin
x-frame-options: SAMEORIGIN
cf-mitigated: challenge
cf-chl-out: 1g27eKwFiShhFKforceiWOZ1ctLtVQVi8vHfFCm3JhnWVXU/pUuWjmTpDm1PH4MbjGP7hj0fqe9UUAXX+QjykLFKi6Ln/vUILBxDbjlUVb/LXludQa7YT7q7Fm1V9xEF$QG7KEZfQOqA/+tf7+9HG0Q==
cache-control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
expires: Thu, 01 Jan 1970 00:00:01 GMT
report-to: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=nyj5aMc%2FIDds890e1l7nz8EF75AQfLmUmU%2BKisOHS%2FlYvBA1yb0fwWfegLrAtDnUooTnbcCAqkGx8Miy5ZsM38FQE44DhwafMKjUpaG5tAhniyuUXDwc3jLwlmf%2FXgBe%2FMmQDQ%3D%3D"}],"group":"cf-nel","max_age":604800}
nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
server: cloudflare
cf-ray: 85d970565b06e91a-DFW
alt-svc: h3=":443"; ma=86400
\`\`\`
ChatGPT からの返答
Cloudflareが403 Forbiddenエラーを返す場合、いくつかの一般的な原因が考えられます。このエラーは、Cloudflareがリクエストをブロックしたことを示しています。GitHub Actionsからの`curl`リクエストが403エラーで失敗する原因としては、以下のような理由があります。
### 1. Cloudflareのセキュリティ設定
Cloudflareは、DDoS攻撃や不正なトラフィックを防ぐために、設定に基づいてリクエストをフィルタリングします。GitHub Actionsからのリクエストがこれらのセキュリティルールに一致する場合、Cloudflareはリクエストをブロックし、403エラーを返す可能性があります。
### 2. Web Application Firewall (WAF) のルール
CloudflareのWAFは、SQLインジェクションやクロスサイトスクリプティング(XSS)などの一般的な脅威からウェブサイトを保護するルールを提供します。GitHub Actionsからのリクエストがこれらのルールのいずれかに違反していると判断された場合、リクエストはブロックされます。
### 3. ボット管理
Cloudflareは、不審なボットトラフィックを識別して制限する機能も提供します。自動化されたスクリプトやボットからのリクエストと見なされると、リクエストはブロックされる可能性があります。
### 4. IPアドレスの評判
GitHub Actionsの実行環境からのIPアドレスが、以前に不正な活動に関与しているとCloudflareによってマークされている場合、リクエストはブロックされます。
### 解決策
- **Cloudflareのセキュリティレベルの調整**: Cloudflareダッシュボードでセキュリティレベルを調整し、GitHub Actionsからのリクエストが許可されるようにします。
- **WAFルールの確認と調整**: GitHub Actionsからのリクエストがブロックされる原因となっている特定のWAFルールを特定し、必要に応じて無効化します。
- **IPアクセスルールの設定**: GitHub Actionsの実行環境からのIPアドレスをCloudflareのアクセスルールに追加し、許可リストに入れることでリクエストがブロックされるのを防ぎます。
- **Cloudflareサポートに連絡**: 上記の手順で問題が解決しない場合、Cloudflareのサポートチームに連絡して、403エラーの原因を特定してもらうことをお勧めします。
最終的に、Cloudflareのセキュリティ設定やWAFルールがGitHub Actionsからのリクエストをブロックしている可能性が高いため、これらの設定を慎重にレビューし、適切に調整する必要があります。
それらしきログを発見。Bot リクエストとみなされてブロックされている
上の docs を参考にWAF を書いても skip されている様子がない.....
WAF よりも Bots のほうが先にあるから動かないのでは?
vercel にログが出てきており、更新も確認できた。
まとめ
BotFlightMode を disabled にしたことによる問題が発生するかもしれない。
これらのどちらか、またはその両方をやるのがよさそう。
- Cloudflare Pro Plan の契約
- MicroCMS Team Plan 以上の契約 + AppRouter での FullSSR
個人の感想
Cloudflare お世話になってるので Pro になっておきたいがドメインごとに料金が発生するためにこのドメインも契約するのは難しいな....となっている
MicroCMS も api が 3 つだときつすぎて、Team になりたいが収益が発生しないサイトを運営しているのとぼくの資金が有り余っているわけではないのであげられそうにない.....
余談
Next.js の FullSSR しているときと revalidate しているときで MicroCMS の転送量の変化