スマートフォン・タブレットからインターネットサーバーオペレーション

APPW.jp
 
root@appw:~# mongosh logging --quiet --file weekly-review.js
bot と人を分ける ③ / 気づく

数字を信頼できて、見えたもの

見直し・確かめ・見張りと、人の動き

appw.jp · server-ops notes · PHP 8.5 / MongoDB / cron

§0数字を信頼できるということ

「止める場所を、手前へ」で入口を固め、「UA の外側で、見分ける」でページの段階の判定を整えました。その結果、ページの段階で「人」と判定した閲覧と、合図(ビーコン)で人と確かめられた閲覧が、8割以上で重なるようになりました。

これは、数字との付き合い方を変えました。以前は、人気ページの順位を見ても「これは本当に人なのか」を先に疑っていました。今は、「この数字は何を語っているか」から考えられます。

最終回は、1件ずつの判定のあとに全体を見直して気づく仕組みと、信頼できる数字から見えてきた、人の動きを書きます。

書き方の方針
これまでと同じく、見直しのルールの中身や、点数のつけ方の数字は書きません。人の動きの例は、個人が特定されないようにぼかしています。

§11件では分からない形

ページを開いたその場の判定は、速くなければいけません。読み手を待たせるわけにいかないからです。そこで、記録するときは手早く判定し、あとからまとめて見直す仕組みを、別に動かしています。

  • cron で10分ごとに動かす。
  • 直前の数分は対象にしない。合図が届くのを待つため。
  • 見直すのは、bot を見逃した記録と、人を bot にしてしまった記録の両方向。

1件ずつでは普通に見えても、並べると見える形があります。種類としては、次のようなものです。

並べると見える形1件だけ見ると
同じ秒に、同じページへ、いくつもの IP が来るそれぞれ普通の閲覧
1つの IP が、短い間に UA を何度も取り替えるそれぞれ別の人
同じ UA が、たくさんの IP から来て、どれも合図がないすぐ閉じた人が多いだけ
ある UA の記録の、ほとんどが bot と判定されている残りのわずかは人に見える

逆の方向では、いったん bot と判定した記録に、あとから人の証拠(合図など)が揃ったら、人に戻します(救済)。救済のほうは、条件を絞って慎重に足しています。戻しすぎると、②で整えた判定が無駄になるからです。

§2クローラの本物確認

検索エンジンのクローラは、止めてはいけない相手です。ところが、その名前を名乗るだけの偽物がいます。「bot は、3種類いる」で書いた逆引きの確認を、その後もう少し厳しくしました。

  1. IP から逆引きで名前を引く。
  2. その名前を正引きして、元の IP に戻るかを確かめる。逆引きの名前は相手が自由に書けますが、正引きのゾーンは書けません。
  3. 名乗った会社と、逆引きで分かった会社が一致するかを見る。

3つ目を足したのは、ある失敗からです。大手のクラウドを借りた誰かの IP は、逆引きすると、その大手のドメインで終わる名前になります。名前の末尾だけを見ていたので、クラウドを借りたスキャナが、その会社のクローラとして「本物」と判定されていました。誰でも借りられるクラウドの名前は、その会社そのものではありません。

逆引きで確かめられない相手もいます。公表されている IP の範囲がある会社は、その範囲で確かめます。範囲もない相手は、無理に決めません。

逆引き・範囲で一致
本物
止めない。bot として記録する。
確かめた結果、食い違う
偽物
止める候補に加点する。
確かめる手段がない
確かめられない
偽物とは決めない。ほかの判定に任せる。

①で書いた、LINE のプレビューを止めてしまった失敗への、仕組みの側からの答えがこの3つ目の欄です。「確かめられない」を独立した答えとして持つようにしました。

§3止める候補を、点数で並べる

ダッシュボードには、ipset に入れる候補を、点数の高い順に並べています。点数を上げるのは、次のようなものです。

  • PHP まで届いた攻撃(入口をすり抜けた分)
  • ②で書いた、細部の食い違いのうち、強いもの
  • ホスティングの IP であること
  • クローラを名乗りながら、確かめた結果が食い違うこと

候補を見直す中で、2つの失敗が見つかりました。

例外が、攻撃をかくまっていた

「人の閲覧も多い IP は、候補から外す」という例外を入れていました。会社や学校の共有の出口を止めないためです。ところが、その例外のせいで、攻撃を繰り返している IP まで候補から消えていました。人の閲覧が多いように見えたのは、bot の判定をすり抜けた分だったのです。いまは、攻撃が届いている IP や、合図のない強い bot には、この例外を使いません。

先頭だけ読んで、漏れていた

§2 の確認の結果は、IP ごとに記録しておいて、候補の画面で読み出します。その読み出しで、記録の全体から先頭の決まった件数だけを読んでいました。記録が増えると、確認済みの IP が読み込みの範囲から外れ、「未確認」として表示されていました。候補の IP を名指しで読むように直しました。

共通点
どちらも、判定の条件は正しかったのに、画面に出るまでの途中で消えていました。判定を作ることと、それが実際に画面に出ることは、別の問題です。

§4見張る形

ルールにするにはまだ早いけれど、気になる集団があります。ある回線から、ある言語で、ある形の UA で来る、といった集まりです。分析の画面に、こうした「見張る形」をいくつか登録して、日ごとの件数と、多い IP・UA を並べています。

  • ルールにする前の観察:数日見て、人が混ざらないと分かってから、判定にする。
  • ルールにしたあとの確認:止めたあと、相手が形を変えて戻ってこないか。
  • 役目を終えたら外す:ある古い形の UA を見張っていたものは、入口で止めたあとに外し、別の形に入れ替えた。

見張る形は、設定ファイルの配列で足し引きできるようにしてあります。画面を作り直さずに、見たいものを入れ替えられることが大事でした。

§5人の動きが見えた

ここからが、この連載でいちばん書きたかったところです。数字を信頼できるようになって、人がページをどう使っているかが見えてきました。

ナビと計算ページを、行き来する人

iseeit.jp には、6つの係数の計算ページと、やりたいことから係数を選ぶ「逆引きナビ」があります。ある平日の昼、1人の読み手が、20分ほどのあいだにナビを12回開き、計算ページとのあいだを行き来していました。

見ていたのは、年金現価と資本回収、年金終価と減債基金という、逆数の関係にある組でした。どちらを使えばよいかを、ナビに戻りながら確かめていたように見えます。どこで迷うかが、ここまで細かく見えたのは初めてでした。ページ同士を直接つなぐ「対になる係数」のリンクを考えるきっかけになっています(§7 で、この20分を再生します)。

ChatGPT から来る人

流入の上位に、utm_source=openai の付いた URL が並ぶようになりました。ChatGPT の回答の中のリンクから来た人です。金融と ICT の解説の記事に、続けて来ています。検索エンジンとは別の入口が、静かに育っています。

先読みで分かること

②で書いた先読みは、毎日いくつか記録されています。検索からの先読みは、そのページが検索結果の上位に出ているしるしです。先読みのあとに合図が来たかどうかで、上位に出たときに選ばれたかも分かります。アドレスバーからの先読みは、一度来た人が戻ってきたしるしです。

古いリンクから、今も来る人

②で書いた、アプリの中の一瞬の表示は、昔の http:// のリンクから来ていました。何年も前に保存されたリンクが、今も使われているということです。計算ページを、道具として手元に置いている人がいます。

PV に比べて、セッションが少ないページ

あるページは、22 PV に対してセッションが3つでした。調べると、1台のスマホが、ある夜に27分で15回、翌日の夜にも6回、同じページを読み込んでいました。ニュースアプリの中のブラウザは、アプリに戻るたびにページを読み込み直すことがあります。じっくり読む人ほど、PV が膨らみます。

bot を除いたからこそ
どの例も、bot が混ざった数字の中では埋もれていました。1人の20分、1台のスマホの2晩は、bot が数千件いる中では、ただのノイズにしか見えないからです。

§6運用のリズム

仕組みを作ったら終わり、ではありませんでした。今は、次のリズムで回しています。

いつやること
毎日ログ一覧を眺める。迷った記録は、Apache のログと並べて見分ける。
毎朝(自動)ipset の期限の延長を判断する。保留になったものだけ、人が見る。
10分ごと(自動)§1 の見直し。
毎週決まったクエリで振り返る。新しい判定の効き方、理由が1つだけの記録、見張る形の推移。
都度判定を足したり見送ったりしたら、台帳に1行。

相手は形を変えてきます。けれども、毎日眺めて、毎週数えていれば、変わり始めた時点で気づけます。この連載のタイトルの「気づく」は、その意味です。

§7デモ:ある20分を再生する

§5 の、ナビと計算ページの行き来を再生します。時刻は始まりからの経過時間に置き換えています。横の帯が、そのページにいた時間です。色は、逆数の組ごとに揃えています。

// session replay(ある平日の昼)
00:00
「再生」を押してください。

§8まとめ:bot を除くのは、下ごしらえだった

回やったこと考え方
① 止めるipset、.htaccess、410止めるのは手前で。止めすぎないために、先に人を数える。
② 見分ける細部の整合、ビーコンbot らしさと人らしさの証拠を、両方から見る。決めないものを持つ。
③ 気づく見直し、確かめ、見張り1件では分からない形を、あとから拾う。数字の先にいる人を読む。

始めたときは、bot を除くこと自体が目的だと思っていました。けれども、除き終わって見えたのは、ナビと計算ページのあいだで迷う人や、何年も前のリンクから来る人でした。bot を除くのは、人の動きを読むための下ごしらえだったのです。

下ごしらえは、これからも続きます。相手は変わり続けるからです。ただ、もう数字を疑うところから始めなくてよくなりました。

// series:bot と人を分ける
  1. 止める場所を、手前へ
    ipset・.htaccess・410
  2. UA の外側で、見分ける
    細部の整合・ビーコン・どちらでもないもの
  3. 数字を信頼できて、見えたもの(この記事)
    見直し・確かめ・見張りと、人の動き

関連記事

『数字を信頼できて、見えたもの — 見直し・確かめ・見張りと、人の動き』を公開しました。