特定のUser-AgnetをApacheでアクセスブロック

linux

先日からあるサーバで監視アラートが鳴り出した。確認したところ不正BOTのクロールによるサーバ高負荷(apacheやphp-fpmで詰まってる感じ)。いろいろチューニングは行ったが、解決しなかったのでApacheで特定のUA時にアクセスを拒否することにした。

不正BOT(google)の見分け方

ApacheのアクセスログからBOTのアクセスを確認

  1. 不正な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
  1. 正常な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は公開されてなかったが今は公開されている)

上記照合はめんどくさいので逆引きで確認すればいい。以下サンプル

■不正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を有効にした状態で、以下のような設定をする。この設定では、特定のネットワーク内からだと認証無し、それ以外からはSh...

コメント