スパム・サイバー攻撃対策 個人でできるWordPressセキュリティ設定

sokohakoとかいうサイト、あやしげなbotや私に利益のなさそうなクローラーたちに大好評! 絶賛アクセス加熱中!
いいかげんにしろ!!!!!!!!!!!!!!
ということで不愉快なbot・クローラー・スパマーたちのアクセス、
ブルートフォース攻撃と思しき不届きものどもへの対策として、
色々やっていることをメモしておきます。

WordPressであるならば個人サイトであっても、海外からのアクセスを一律シャットアウトしていないとか、
更新したらTwitterでおしらせするような運用をしているのであれば、
絶対にやっておいた方が良い設定ばかりだと思います。
このサイトは個人の小規模なサイト、同人サイトなどを作成している人向けの記事もアップしていますが、
そのような「目立たないサイトだからいいや」などとお考えの人はご一考ください。
あなたのサイトにもたぶん来てますよ。怪談みたいな言い方だけどガチで…

目次

経緯(なぜスパムに大好評なのか)

当ブログはリニューアルに伴いこれまで行っていた「海外IPからのアクセス禁止措置」を解除しました。

海外からのアクセス禁止措置は、こちらの記事などを参考に行いました。
.htaccessですべてのアクセスを禁止しつつ、日本国内と思しきIPのみ許可する方法です。
これにより、NURO光の人にだけ「見れません」って言われたことがありますが
(NUROの人っぽいIPやnuro.jpを許可することで対応済み)、
大体のセキュリティリスクはこれでシャットアウトできていたのですよね…。

もちろん日本国内からと思しきアクセスでも怪しいものはあったりするので要注意です

どんなサイトであってもサイバー攻撃は身近にあるのです。
どんな小規模サイトでも絶対に怪しいアクセスは来ます。

これは本当に逆SEOを頑張りまくっている同人サイトを運営していてもそうなので…。哀しすぎる…。
まっとうに活動してGoogle検索に掲載されていたり、TwitterなどにURLを記載して宣伝しているようなサイトなんて、
あっという間に攻撃の餌食です。

当ブログはコメント機能をオフにしていて、メールフォームもreCAPTHAで対策しているので、
そのあたりの被害はないですが、もしそうでなければどうなっていることか…

そのことは重々承知していたので、元々愛用していたセキュリティプラグインWordfenceの、

二段階認証などでログインセキュリティを強化し、覚悟のうえで海外からのアクセスを許可しました。

WordPressログインページを変更する・BASIC認証をかけるのは鉄板と言われていたりはいますが、
これについてはテーマやサーバーとの相性があるため無理に設定する必要はないものと思っており、
サイトによってはやったりやってなかったりします。
なにはともあれパスワードを強力なものにして突破させないことや、
ログイン試行するようなアクセスをブロックすることが大事だと思います。

被害状況

ということで海外からのアクセスを許可したらもう本当にめちゃくちゃに来る!!
覚悟はしてたけどアクセスログの大半が人外!! 人類どこ!? 滅んだ!?
直接的なログインを狙ったようなアクセス(wp-login.phpをダイレクトに狙いにくる)なんかは意外と少なかったものの、
「/?author=1」を叩いてWordPressのログインIDを探りに来るものや、
絶対誰も私のブログ記事読まんだろう国のクローラーやら、絶対私も読まんだろう謎のアドレスを載せたUAやら!

むかつくので全部弾きましょう。Wordfence(プラグイン)や.htaccess、functions.phpなどを使ってどうにかします。

対策

基本的なこと

  • WordPress本体のアップデート
  • プラグインのアップデート
  • 不要なプラグインの削除
  • ユーザー名やパスワードを他サービスの使いまわしにしない
  • ユーザー名やパスワードをブログ内容や個人情報から推測できるものにしない

最低でもこれくらいは常にやっておきたいです。
ただしWordPress本体アップデートなどは使用テーマやプラグインの対応状況をしっかり確認してからの方が良いです。

Wordfenceを使った対策

前述のセキュリティプラグインWordfenceは、インストール後にいくつか設定をしておいた方が良いのと、
ファイアウォールを学習モードに設定後1週間程度の時間が必要になるので、
サイトを準備しながらインストールしておいて初期設定を済ませておくのが良さそうです。
(管理画面で記事を作成するなどのひととおりの操作をしておくと良いっぽい?)

設定項目などはWordfenceで検索して出てくる日本語記事がいくつかあるので参考にさせていただいてます。
ただし「アップロードディレクトリのコード実行を無効化する」は私の環境だとすべての画像が500エラーになったのでやめました。

なお、前述の「/?author=1」を叩いてWordPressのログインIDを探りに来るようなアクセスは、
Wordfenceを導入していれば初期状態で対策してくれています。

「すべての設定」の中にある、このあたりです。
非常にありがたい機能なのでうっかりチェックを外さないよう気を付けましょう。

特定のURLへのアクセスを拒否する

あわせて、今回色々な有害そうなアクセスログを見ていて、
「特定のアドレスへアクセスしてくるのは攻撃者だけだ」と感じたので、

すべての設定>ファイアウォールの詳細オプション>これらの URL にアクセスする IP を即座にブロック

という設定を活用しており、これが毎日よく仕事をしています。
実際にアクセスされても404エラーが出るだけであり、害はない場合も多いですが、
アクセスを試みてくる時点で悪意がある・普通にサイトを見に来た閲覧者ではないことはほぼ確かなので…

攻撃者からと思しき変なURLへのアクセス試行について、
実際にあった自分のサイトへのアクセスログや、検索して出てくるサイトなどを参考にしつつ、
たくさんリストアップしておいたので、よかったら下記参考にしてみてください。

なお、アクセスログを確認する限り、ここでのブロックとは、503エラーを返すことのようです。

自分が弾き出されたときはこんな画面が出てきました。
管理用メールアドレスを入力してメール送信すると再ログイン・すべてのブロックを解除などの方法を選ばせてもらえます。
FTPソフトでプラグインのフォルダの名前を変えるなどしてWordfenceを無効化すれば、
この方法を取らなくてもログインすることやWordfenceを削除することはできますが、
再度有効化した瞬間に設定変更できずにブロックされちゃうので、ちゃんと生きてるメールアドレスを使おう!(当たり前)

ということで以下変なアクセスのあったURLの一例。

アクセス禁止URLの一例

当然ながら、うっかり自分や閲覧者がブロックされる可能性もあるので自己責任で。
どんなアクセスを拒否していいかは自分のサイトの構成(パーマリンクなどの設定)や
使用テーマなどにもよるので、注意の上で入力するのが良いです。

/?author=*
//?author=*
/wp-json/oembed/1.0/embed?url=自分のサイトのアドレス
/xmlrpc.php
//xmlrpc.php
/blog/xmlrpc.php
/.env
/.git/config
/?_wfsf=detectProxy
/public/_ignition/health-check/
/_ignition/health-check/
/wp-json/wp/v2/users/
/wp-json/wp/v2/users/*
/wp-class.php
/wordpress/wp-class.php
/site/wp-class.php
/wp-content/index.php
/wp-includes/wp-class.php
/wp/wp-includes/wp-class.php
/wordpress/wp-includes/wp-class.php
/wp-includes/ID3/license.txt
//wp-includes/ID3/license.txt
///wp-includes/ID3/license.txt
/blog/wp-class.php
/wp-content/plugins/wp-file-manager/readme.txt
/wp-content/plugins/mstore-api/readme.txt
/currentsetting.htm
/GponForm/diag_Form?images/
/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php
/?XDEBUG_SESSION_START=phpstorm
/.wp-config.php.swp
/.local
/.gitignore
/.production
/.meta
/.remote
/.DS_Store
/.well-known/security.txt
/.well-known/acme-challenge/index.php
/.vscode/sftp.json
/.addressbook
/.proclog
/.dockerignore
/admindede/login.php
/manage/login.php
/admin/login.php
/manager/login.php
/dede/login.php
/htadmin/login.php
admin.php
666.php
contact.php
contact
1index.php
2index.php
/wp-content/plugins/ht-mega-for-elementor/assets/css/htbbootstrap.css
/?of=1&a=1
/wp-plain.php
/cong.php
/omldfeoi.php?Fox=d3wL7
/xqrrqzjy.php?Fox=d3wL7
/.well-known/traffic-advice
/blog/wp-content/plugins/revslider/includes/external/page/index.php
/blog/wp-content/plugins/revslider/includes/external/page/shell.php
/blog/wp-content/plugins/revslider/includes/external/page/up.php
/az.php
/ss.php
/ms.php
/phpMyAdmin
/pma
/myadmin
/sql
/mysql
/mysqladmin
/db
/dev
/tmp
/database/
/adminer.php
/sql.php
/doc.php
/simple.php
/backup.php
//wp-includes/wlwmanifest.xml
/wp-includes/wlwmanifest.xml
/wp-content/hader/seothemes/index.php
/cgi-bin/admin.php
/wp-content/themes/seotheme/db.php?u
/wp-content/plugins/apikey/apikey.php?test=hello
/ALFA_DATA/alfacgiapi/perl.alfa
/alfacgiapi/perl.alfa
/plugins/content/apismtp/apismtp.php?test=hello
/wp-content/plugins/apikey/apikey.php.suspected?test=hello
/plugins/content/apismtp/apismtp.php.suspected?test=hello
/wp-content/themes/wp-kobieta/404.php
/wp-content/themes/porto/404.php
/wp-content/themes/Divi/404.php
/wp-content/themes/codtheme/404.php
/wp-content/plugins/rsvpmaker-for-toastmasters/gutenberg/src/in.php
/wp/wp-content/themes/construction-master/sections/theme.php
/wp/wp-content/plugins/rsvpmaker-for-toastmasters/gutenberg/src/in.php
/wp-content/themes/drode.php
/wp-content/themes/construction-master/sections/theme.php

 You have to specify a relative URL starting with a forward slash, and URLs are case-sensitive. Wildcards (*) can be used

https://www.wordfence.com/help/firewall/options/?utm_source=plugin&utm_medium=pluginUI&utm_campaign=docsIcon#immediately-block-urls

ということらしいのでスラッシュから始まるURL、数字の決め打ちはワイルドカード(*)で対応できるらしい…?
ので、末尾の数字を変えて複数アクセスがあったやつはワイルドカードを用いて載せています。
「1index.php」といったURLについては頭文字の通し番号でいっぱいアクセスがあるんですが、
ワイルドカードをつけて*index.phpとしてしまうと、
あらゆるディレクトリのindex.phpへのアクセスがブロックされて
WordPressの管理画面さえ開けなくなるのでやめましょう(一敗)。

以上。でも無限に増えるため随時更新。(したくねえ…)

なお、ここでの「ブロック」は、Wordfence上の「レート制限」の項目で設定したブロックの設定が引き継がれるようです。
初期設定だとあんまりブロックしてくれてなさそうなので確認しておきましょう。設定画面の下の方にあります。

とりあえず初期設定の「それを制限」を「それをブロック」に変更しました。
また、下の方の、「ルール違反時にIPアドレスがブロックされる期間」が1分になってたので贅沢に「1月」に設定しました。
IPアドレスをブロックしても他のアクセスを巻き込むだけだよ~的なことが公式ページに書いてある気もしますが、
.htaccessでアクセス禁止するときも特定のIP拒否したら基本的に二度と解除せず永遠に拒否しとくものだし、
長い期間にしちゃって問題ないと判断しました。

レート制限の設定としては、当サイトは現状大量のリクエストで困っている状態ではないので、
条件には間違っても人間が制限されないよう贅沢な数字を設定してみたところ、問題なさそうでした。
(たぶんですが、「無制限」にて「それをブロック」でも問題はないかと思われます。)

この設定により、Wordfenceがルール違反をしたIPアドレスの一覧を掲載してくれるようになります。

Wordfence上でのIPブロック

Wordfenceでアクセス禁止URLなどを設定しておくと、そこにアクセスしてきたIPをまとめておいてくれ、
そんな不届きなIPアドレスの確認ブロックの永続化が可能です。

WordPressのダッシュボードに表示されるアクティビティの「ブロックされたIPの更新」ボタン、
またはWordfenceのファイアウォール>ブロックのタブを開くと確認できます。

この画面で、不届きなIPアドレスにチェックを入れて「永続化する」という方法が取れます。
これによってどのファイルが更新されてどう作用してるのかはよくわからなかったのですが、
おそらく永続化すると、禁止していないURLであっても、アクセスした際には503エラーを返す設定になっているようです。

下記にて、有害なIPを確認してブロックする方法をいくつか紹介していますが、
アクセスログや.htaccessファイルを舐めるように見られないとき(普通はそう!)はこの方法でお手軽にブロックができそう!
また、ブロックを永続化したIPアドレスの一覧をtxtファイルでダウンロード可能なので、
.htaccessに拒否設定を書くのも容易です。やり方は下記参照。

.htaccessを使った対策

Wordfenceだけでも致命的な攻撃などは防げますが、ログインページなどではなくても、
怪しげなクローラーやらスキャナーやらがサイトにたくさんアクセスしてくるのも不愉快なものです。
頑張って作った自分のサイトの情報をなんかに転用されたり商売に使われたりしたらなんか腹立ちませんか!?
ということで.htaccessでも対策をします。

.htaccessでのスパム対策は、
あらかじめ対策しておくことと、アクセスログを確認して随時対策することの両方が大切です。

あらかじめ対策しておくこと

有名な(有害だとわかっている)クローラーなどは、
そのIPアドレスや、ユーザーエージェントことUAがまとめられている日本語サイトがいくつかあります。
参考にして、自分のサイトの性質にあわせてしっかり弾いておきます。

ありがたいサイト様方。お世話になっております…!
また、CleanTalkというプラグインを開発している同名のサイトは、攻撃的なIPアドレスの報告をまとめています。

このリンク先では最新の報告がなされたIPアドレスのリストが無料で一部見られます。
報告されたIPのすべてが見られる訳でもなく、またそのIPが私のサイトに実際にアクセスしてくるとは限らないので、
効果のほどはわかりませんが、私は定期的に確認して下記のようにして.htaccessに追加しています。
 追記:さすがに何千行と追加するのは良くなさそうなのと、効果も薄いような気もしたので、今はやめました。

IPアドレスのリストを.htaccessでアクセス拒否できるように変換する

サクラエディタ使ってます。

  1. .htaccessに載せたい行を選択
  2. 「検索>置換」を選び、「正規表現」にチェックを入れた状態で、
    置換前「^」置換後「deny from (末尾に半角スペースあり)」と入れてすべて置換
  3. 「deny from 各行」の状態になるのでそれを.htaccessにペーストして最終確認日をメモ

Wordfenceから出力した禁止アドレスにアクセスしてきたIPアドレスのリストも
この方法で変換すると.htaccessにコピペするだけで拒否ができます。
ちなみにサクラエディタ上では、並び替えたい場合はお好みに応じて行を選択→Alt+aで並び替えが可能。見やすくなります。

アクセスログを確認して対策すること

他にも実際のサイトのアクセスログを確認すると、
世界各国の多種多様で個性的なUAをかかげたクローラーたちがやって来ているような
まあ大変グローバルな環境になっていることがわかりますので、どんどん追加してます。
ここにまとめようかと思ったけど、今後も増えるだろうし現時点でもあまりにも長いので、とりあえず今回は省略…。

あわせて、AMAZON AWSgoogleusercontent.com(Google提供の仮想マシン)を用いたアクセスは、
あまりにも多いのと、まずもってブログ読者のものではないだろうということで、

deny from amazonaws.com(Amazonアソシエイトやってる場合は要注意)
deny from bc.googleusercontent.com

私はこうやってホスト名で弾いてしまってました。が!!

追記&注意書き

たぶんこのせいで私はAmazonアソシエイト(審査中)不合格になりました。わははは!!
一律弾いてしまうのが楽ですが、AWSの中にも悪さをするものとしないものがあるので、
できるだけアクセスログを見て必要な措置だけ取るのが良いですね…。
アフィリエイトとか広告とか一切やらないブログなら全部弾けばいいと思いますが、それ以外は要注意ということで…。

さらに追記

どうやらgoogleusercontent.comをホスト名ごと拒否しているとDiscordのクローラーを弾いてしまうようで、
Discord上にリンクを貼ったときにOGP設定がまったく効かなくなってしまう気がします。
リンクが開けなくなるという訳ではないので、気にしなくていい人はしなくていいですが、
私はDiscordをSNSとかブログ更新告知などを書く場所として使っており、不便なので、ホスト名拒否をやめました。

なお、AWSは明らかに有害なアクセスと確認したらブロックするようにしてます。
アソシエイト落ちたりしてないので多分大丈夫。
googleusercontentも同じように対処していきたいと思います。

他にも、ホスト名が残らないアクセスをしてくることもあるので、検索して出てきたIPリストを色々入れたり、
見つけ次第追加して弾いたり…。面倒ですが、やっぱり気持ち悪いのでやってます。

アクセスログは見慣れてくると大体botか人間かどうかわかりますが、
勘違いでbotを通してしまっても悔しいので、少しでも怪しいアクセスのIPアドレスは、
前出のCleanTalkというサイトで随時検索して確認します。

この作業を手作業でやるのは本当に本当にめんどくさい…!
そして、本当に効果的かどうかもわからない…
.htaccessを重くしているだけかもしれない…あと、この情報が100%正しいとは限らない…
どのくらいサイトをクリーンに保ちたいかという自分の考えと、かかる労力のバランスを取って行うのが良いと思います。

なお.htaccessを使ったアクセス制御は、
今は「Require」の書き方の方が良い…という知識を読んだのももはや大分前のような気がしますが、
依然として「deny」とか「allow」の書き方で問題ない感じです。問題になったら頑張って書き換えようと思います。

また、中には、IPアドレス問わず、「このリファラURLでアクセスしてくる輩は大体うんち」みたいなこともわかってきますので、

SetEnvIf Referer "^http://simplesite\.com" unchi
SetEnvIf Referer "^https://simplesite\.com" unchi
deny from env=unchi

みたいな書き方も覚えておくと良いです!

ログインページでの対策

WordPress、wp-loginとかwp-adminとかのアドレスでログインページ表示できちゃう有名問題。

しかしあくまで私の観測範囲の話にはなりますが、アクセスログを舐めるように見ていても、
「wp-login.php」を直接叩きに来るようなアクセスはあまり多くありません
昔はともかく今はログインページを変更するとかbasic認証をかけるとかって
あんまりセキュリティ対策にならないのかも…? とは思いつつ
やっておくに越したことがないサイトもあると思う&やってることもあるので載せておきます。

ログインページの変更

Wordfenceにはその機能はないのですが、セキュリティプラグインの種類によってはプラグインの設定画面で設定できたり、
ログインページ変更専用のプラグインもあったりするようです。
セキュリティプラグインはあまり混在させない方が望ましいようなので私はプラグインなしで設定することにしました。

アドレス変更してもWordfenceで有効化したreCapthaもちゃんと効いてる模様。
変更後のアドレスも、login.phpとかまんまの名前じゃなく狙われにくい名前にしておくと良いですね。

Basic認証

ログインページにbasic認証かけるやつ。検索すればいくらでも出てくるやつ。
この設定に限った話ではないんですが、こうしたアクセス禁止措置を取ると、
サーバーによってはSSL証明書が自動更新されなくなったりするので、そこは要注意だったりします。

いったんのまとめ

ということで地味に色々とやっています…。様子を見ながら随時変更していこうと思います。

なお別途運営している逆SEO頑張り同人サイトについては、
海外IPからのアクセス禁止設定を行っているのと、リンク禁止のお願いをしているため、
現在のところとんでもない被害は出ていません。
そのような逆SEOサイトでやっている設定や、さくらのレンタルサーバでのアクセスログの確認方法についても、
いずれ別の記事を執筆しようと思います。

最後の砦としてパスワードをめちゃくちゃ強固にしておくのはもちろん大事でしょうが、
こう不審かつ存在しないURLへの狙いすましたようなアクセスログの山を見ていると、
使っているWordPressのバージョンやプラグインなどの脆弱性につけこまれないような注意もかなり大事だと感じる次第です。
管理画面・ダッシュボードやニュースリリースのこまめなチェックが必要ですね。
なんで悪者のためにこんな苦心しなきゃいけないのか…と思いつつこれからも頑張りましょう…。

この記事を書いた人

めいど
同人サイトを10年くらいやっている者です。アンディー・メンテのファン。

そしてこれは広告

ヽ(*'σ`*)ノ
  • URLをコピーしました!
  • URLをコピーしました!
目次