bokumin.org

Github

Cloudflareで「私はロボットではありません」を表示する方法

How to Show the I’m Not a Robot Verification on Cloudflare

 

はじめに

 

今まで、iptables やpf、Fail2banなどを使った自作Firewallの構築方法や、WAFを自前で組んで不正アクセスを防ぐ方法などを紹介してきました。

 

ただ、正直そこまで本格的にやりたくない・もっと簡単に対策がしたいという方もおられるんじゃないかということで、Cloudflareを使った「私はロボットではありません」を表示する簡単なBotブロックのやり方を紹介できればと思います。

 

事前に必要なもの

 

CloudFlareのアカウント
CloudFlareに追加済みのドメイン

 

サーバ側の設定変更やプログラムの実装は不要です。

 

作成手順

 

まず、セキュリティ→WAF→カスタムルールへ移動します。

 

 

ルールを作成をクリック→ルール名、フィールド、値などを設定していきます。

 

フィールドについて

 

URIドメインより後ろの「パス」と「?以降の文字列」を合わせたものです。
例:https://bokumin.org/archives/123?s=test の場合、/archives/123?s=test がURIになります。
完全URIhttps:// から始まる全ての文字列です。
例:https://bokumin.org/archives/123
URIパスドメインより後ろ、かつ「?」より前の部分。
例:https://bokumin.org/archives/123?s=test なら、/archives/123 がパスになります。
URIクエリ文字列URLの末尾にある「?」以降の部分です。検索キーワードやパラメータに使われます。
例:s=testid=50 など。ここへの攻撃(SQLインジェクション等)を防ぐ際に使います。
AS Numインターネットプロバイダ(ISP)や企業の管理番号のことです。「AWS」や「Google Cloud」などのデータセンターには固有の番号があります。
※「一般人は家のプロバイダを使うが、ボットはデータセンターを使う」という違いを利用してブロックする項目です。
Cookieブラウザに保存されている「ユーザー識別情報」です。ログイン状態や追跡IDなどが含まれます。
例:「ログイン済みのユーザー(特定のCookieを持つ人)はスキャンしない」といった高度な設定に使えます。
アクセス元の国です。
例:Japan と指定すれば、日本からのアクセスだけを対象にできます。
大陸国よりも広い「地域」の区分です。
例:Asia(アジア)、Europe(ヨーロッパ)など。「北米からのアクセスを一括で制限したい」といった大まかな指定に使います。

 

アクションについて

 

マネージドチャレンジCloudflareのAIが状況に応じて「最適な壁」を自動で選ぶモードです。
明らかにボットならブロック、怪しければパズル、人間ならスルーします。誤検知が少なく、最もバランスが良いです。
ブロック問答無用でアクセスを遮断します。
相手には「403 Forbidden(アクセス禁止)」のエラー画面が表示されます。
JS チャレンジ「ブラウザを確認しています…」という読み込み画面を表示します。
JavaScriptを実行できない単純なボットはこれで止まりますが、人間には待機時間のストレスを与えます。
Interactive チャレンジ「人間であることを確認します」というチェックボックス(Turnstile)を表示します。
ユーザーがクリックしないと先に進めないため、高度なボットも強力にブロックできます。
スキップWAFの検査を「免除」して通します(ホワイトリスト)。
特定のIPアドレス(自分)や、特定のボットを無条件で許可したい場合に使います。

 

オペレータに関して

 

演算子(日本語)解説・使いどころ入力例
次と等しい
次と等しくない
完全に一致するかどうか。
一文字でも違うと反応しません。「国」や「メソッド」など、決まった値を指定する時に使います。
Japan
(完全に一致するもの)
次を含む
次を含まない
【基本】文字列の一部に含まれているか。
前後に何がついていてもヒットするため、最も汎用性が高いです。
/archives/
(URLのどこかにあればOK)
次で始まる
次で始まらない
先頭が一致するか。
特定のディレクトリ以下の全ページを指定したい時に便利です。
/wp-admin
(/wp-admin/xxxx も対象になる)
次で終わる
次で終わらない
末尾が一致するか。
ファイルの拡張子(.php, .jpgなど)を指定するのによく使います。
.xml
(sitemap.xml などが対象になる)
ワイルドカード
厳密なワイルドカード
記号を使って曖昧な検索ができます。
* (何文字でもOK) や ? (任意の1文字) を使えます。
※無料プランでもURIパスなどで利用可能です。
/wp-content/uploads/*.php
(uploads以下の全phpファイルを指定)
正規表現と一致する
正規表現と一致しない
高度なパターンマッチングです。
数字の繰り返しなど複雑な条件を書けます。
^/archives/[0-9]{3}$
(/archives/の後に数字3桁が続く場合のみ)

 

作成例

 

例えば、特定のURLにアクセスする場合にボットかどうかのチェックをさせたいという場合は以下のようにします。
(当サイトの/amedas-dashboard/の場合)

 

フィールド:URI
オペレーター:ワイルドカード
値:/amedas-dashboard/*
アクション:マネージドチャレンジ
場所:最初

 

 

実際にWAFが機能しているか手動で確認をしていきます。
プライベートモードなどで、設定したURLにアクセスをして挙動を確認します。

 

 

以上のように表示されていれば完成です。

 

まとめ

 

今回は、CloudflareのWAFだけで簡単に「私はロボットではありません」という認証画面を表示させる方法をご紹介しました。
特にマネージドチャレンジが優秀で、CloudFlare側で「人間かボットか」を判断してくれるため、一般読者の利便性を損なわずにセキュリティを高められます。
WPのログイン画面や、Webアプリなどで悪さされそうな場所に設置してみてもいいかもしれないです。
無料プランでもここまで強力な機能が使えますので、セキュリティ対策はしておきたいという方は、ぜひCloudflareのWAFを活用してみてください。

 

 

おわり