WordPressサイトを運営していると、海外からのスパムアクセスや悪質なBot攻撃によるサーバー負荷に悩まされることがあります。

「アクセスが増えたー!」って思ってたら中国からのBotだったときの虚無感ね。

そういうのを排除するため、完全無料で利用できるCloudflareを使って悪意のあるアクセスを狙い撃ちで認証画面へ誘導していきます。

ぼくはムームードメインを使っているのでムームードメインの設定をやっていますが、お名前.comとかでもやり方は基本的に同じですよー!

本題に入る前に

ちょっと本題に入る前に、そもそもですけどCloudflareを使ったから完璧にウェブサイトが守られるわけじゃありません。

Cloudflareもプロですが、悪意がある攻撃をする相手もプロです。ゼロデイ攻撃やアプリケーションの脆弱性、オリジンサーバーの直接攻撃などがあって、全ての攻撃を完璧に防げるわけではないことに留意しておいてください。

セキュリティの世界では「攻撃側が圧倒的に有利」なのは大前提です。

また、いまいち分かりにくい記事になってるので、よく出てくる言葉を適当に解説しておきます。

マネージドチャレンジ

マネージドチャレンジは、「あなたは人間ですか?」みたいな表示が出る認証画面のことです。こんなんでBotを防げるんか…?って毎回思いますが、防げるみたいですね。

オリジンサーバー

ウェブサイトが実際に置いてあるサーバーです。「ウェブサーバー」とか単に「サーバー」とか言います。みんなが言う「サーバー」の99%がオリジンサーバーのことで、居酒屋の店員さんが言う「サーバー」の99%はビールサーバーのことですね。

エッジサーバー

オリジンサーバーにアクセスする前に接続されるサーバーです。通常はサイトにアクセス → オリジンサーバーに接続されるのを、サイトにアクセス → エッジサーバー → オリジンサーバーって順序の接続にすることで、オリジンサーバーにアクセスされる前にエッジサーバーで対応します。

Cloudflareとは

そもそもCloudflare<クラウドフレア>とは何なのかって話なんですけど、Cloudflareはウェブサイトと訪問者の間に挟まることで通信の高速化やセキュリティ向上を提供するCDNサービスです。

通常のウェブサイトはアクセスすると直接オリジンサーバーに接続されますが、Cloudflareを導入すると、世界中に配置されたエッジサーバーがアクセスを最初に受けてから「正常なやつ」だけを判断してオリジンサーバーに繋げるんですね。

エッジサーバーを例えるなら「建物の警備員」のようなイメージ。ピエロの格好でナイフを持って「うっひょー!」って叫びながら建物の中に入ろうと思っても警備員に制止されますよね。

建物がオリジンサーバー、警備員がエッジサーバー、ピエロが頭おかしいヤツ攻撃者です。

無料プランでも強力なWAFや帯域無制限のCDN機能が利用できるので、個人サイトから大規模サイトまで幅広く活用されています。

Cloudflareの設定とドメインの設定

では、実際にやっていきましょう。

正直、すっごい手間で面倒くさいです。

Cloudflareの設定

まずはCloudflareのアカウントを作成しましょう。

Cloudflareのダッシュボードに入って、ドメイン → 概要に進んで「ドメインを追加」をクリック。

自分のドメイン名を入力して、設定は何も触らずに続行して「無料プラン」を選択します。

DNSレコードの確認画面に進むと、Cloudflare専用のネームサーバーが2つ指定されます。このアドレスをメモしておきましょう。

xxxx.ns.cloudflare.com
yyyy.ns.cloudflare.com

ネームサーバーの設定

ぼくはムームードメインでドメインを取得しているのでムームードメインの説明になりますが、お名前.comとかでもやることは同じです。

コントロールパネルにログインしてドメイン管理 → ネームサーバー設定変更を開きます。

「GMOペパボ以外のネームサーバーを使用する」を選択して、ネームサーバー1と2にCloudflareから指定されたアドレスを入力して保存します。

設定反映には数分から数時間程度かかります。

DNSの浸透が完了すると、Cloudflareのダッシュボードで「ドメインは Cloudflare によって保護されています」という表示に変わります。

WAFカスタムルールの設定

ドメインとCloudflareが接続できたら、本題であるWAFのカスタムルールを作成します。

Cloudflareの無料プランではWAFのカスタムルールを最大5個まで作成可能です。今回はそのうちの1個を使って検索エンジンを除外した悪質なBot対策を設定します。

カスタムルールの作成手順

Cloudflareのダッシュボードでドメインを選択してセキュリティ → セキュリティルール → ルールを作成 → カスタムルールをクリックします。

ルール名は任意なので「Bot Managed Challenge」とか好きな名前にして、「式を編集」をクリックしてテキストエリアを開きます。

テキストエリアに下記の式をそのまま貼り付けます。

(cf.threat_score gt 10 and not cf.client.bot)

海外からのスパムアクセスが多い場合は、以下のように日本以外のアクセスかつ脅威スコアが高いものを対象にする条件を追加するのも効果的です。

(cf.threat_score gt 10 and ip.geoip.country ne "JP" and not cf.client.bot)

ルールの条件にマッチした場合にどのように対応するかの「アクション」では、人間をBot判定してもクリアできるように「マネージドチャレンジ」を選択しておきましょう。

更新すれば完了です。

設定しているルールの条件

設定した式には、非常に重要な役割が含まれています。

cf.threat_score gt 10は、Cloudflareが独自に判定している脅威スコアが10を超えるアクセスを対象にしています。

And not cf.client.botを組み合わせることで、GooglebotやBingbotといった「健全なクローラー」を自動的に除外しています。これでSEOへの影響を避けつつ悪質なBotだけを認証画面へ誘導することが可能になります。

例えばこのカスタムルールをうまく組み合わせることで特定の国からのアクセスだけ拒否する…とかもできるんですけど、IPアドレスとか判定条件を間違えるとGoogleとかBingとかの検索エンジンまで拒否することになってしまいます。

これは慎重に行ってくださいね。

動作確認

設定が完了したら正常にCloudflareのエッジサーバーが経由されてるか確認してみましょう!

DNSレコードのプロキシ状態確認

Cloudflareのダッシュボード → DNS → レコードを開いて、該当ドメインのAレコードのプロキシステータスが「プロキシ済み」になっているか確認します。

「DNSのみ」になっていると、CloudflareのWAFを経由せずにサーバーへ直アクセスされているということです。ネームサーバーの設定が合ってるかを確認してみてください。

ちなみにMXレコードはメール送受信用なので「DNSのみ」のままで問題ありません。

「nslookup」コマンドでの疎通確認

WindowsのPowerShellとかMacのターミナルを開いて、以下のコマンドを実行します。

nslookup example.com  8.8.8.8

「example.com」には自分のドメインを入れてくださいね。

応答結果の「Addresses」に、104.x.x.x や 172.x.x.x といったCloudflare側のIPアドレスが表示されていれば、無事にCloudflareのエッジサーバー経由で通信が行われています。

名前:
	iroirodesignlab.com

Addresses:
	2xxx:4xxx:3xxx::axxx:8xxx
	2xxx:4xxx:3xxx::6xxx:4xxx
	172.xx.xxx.xxx  ← これと
	104.xx.xx.xxx ← これがあればOK

ブラウザのデベロッパーツールでレスポンスヘッダーを確認したときに、「Server」欄に「Apache」とか「Nginx」 のサーバー情報が表示されることがありますが、nslookupでCloudflareのIPが返ってきていればWAF機能はしっかりと動作しているので安心してください。

さいごに

Cloudflareの無料プランを活用することで、サーバー費用をかけることなくWordPressなどウェブサイトのセキュリティ向上と負荷軽減を同時に実現できます。

サーバーなどの知見がないと難しそうだと感じるかもしれませんが、式エディタへのコピペだけで簡単に構築できるので、海外スパムやBotのアクセスにお悩みの方はぜひ試してみてくださいねー!