先日からあるサーバで監視アラートが鳴り出した。確認したところ不正BOTのクロールによるサーバ高負荷(apacheやphp-fpmで詰まってる感じ)。いろいろチューニングは行ったが、解決しなかったのでApacheで特定のUA時にアクセスを拒否することにした。
不正BOT(google)の見分け方
ApacheのアクセスログからBOTのアクセスを確認
- 不正なBOTのアクセスログ(googleだよって偽装している)
154.21.216.233 - - [04/Mar/2022:10:15:23 +0900] "GET /hoge HTTP/1.1" 200 4250 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 3223808
- 正常なBOTのアクセスログ
66.249.79.44 - - [04/Mar/2022:05:09:48 +0900] "GET /hoge HTTP/1.1" 200 4894 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 426566
ぱっと見ただけでは判定できないので、IPアドレスからgoogleかどうかを確認する。(※以前はgooglebotのIPは公開されてなかったが今は公開されている)
- googlebotのIPリスト
上記照合はめんどくさいので逆引きで確認すればいい。以下サンプル
## 不正BOT
$ host 154.21.216.233
Host 233.216.21.154.in-addr.arpa. not found: 3(NXDOMAIN)
## 正常BOT
$ host 66.249.79.44
44.79.249.66.in-addr.arpa domain name pointer crawl-66-249-79-44.googlebot.com.
robot.txtによるクロール禁止
本件のサーバはサーチエンジンに反映される必要の無いサーバだったため、robot.txtを用意して全クロールを拒否しても良いとのことだったので配置(設定値は全UAに対して全パスアクセス禁止)
- robot.txt
User-agent: *
Disallow: /
配置したが、不正BOTがrobot.txtを見てくれるハズも無く解決には至らない。以下は正常BOTがちゃんとrobot.txtを見てくれたアクセスログ
66.249.79.44 - - [04/Mar/2022:07:06:12 +0900] "GET /robots.txt HTTP/1.1" 200 26 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" 2547
Apache(2.4.x)でのUAによるアクセス制限設定
手っ取り早くUser-AgentがBOTだった場合(正常、不正問わず)にapacheで拒否することにした。
設定例1
<Directory "/var/www/html">
Allowoverride All
Options followsymlinks execcgi
## GoogleBOTを拒否(正常bot不正bot両方拒否)
<RequireAll>
Require all granted
Require not expr %{HTTP_USER_AGENT} =~ /(Googlebot)/
</RequireAll>
</Directory>
設定例2
<Directory "/var/www/html">
Allowoverride All
Options followsymlinks execcgi
## GoogleBOTを拒否(正常bot不正bot両方拒否)
SetEnvIfNoCase User-Agent "Googlebot" bot
<RequireAll>
Require all granted
Require not env bot
</RequireAll>
</Directory>
## 補足:NoCaseは大文字小文字チェックしない。botの種類を増やしたければ、SetEnvIfを増やせばOK
動作確認
・作業前は全て200:OK
## UA指定無し
$ curl -I https://www.piteki.com/
HTTP/1.1 200 OK
## bot判定のUA指定
$ curl -A "Googlebot" -I https://www.piteki.com/
HTTP/1.1 403 Forbidden
## 判定されないUA指定
$ curl -A "poteto" -I https://www.piteki.com/
HTTP/1.1 200 OK
補足:.htaccessによるSatisfy Any の落とし穴
上記のような設定をしても上手く動作しないケースがありました。
コンテンツ側で.htaccessを利用していてSatsfy Anyが記載されていると制御動作しませんでした。詳細は下記の別の方のブログで丁寧に説明されています。Apache2.2の互換記述形式から2.4の標準記述形式に変更すると動作するみたいです。(未確認)
Apache httpdでsatisfy anyを使うと一部ファイルへのアクセス制限が外れる仕様がある - Qiita
確認方法Apache 2.4の環境において、AllowOverride FileInfoなどで.htaccessを有効にした状態で、以下のような設定をする。この設定では、特定のネットワーク内からだ…
コメント