(ロ)ボットの行動確認

と、ある友人から、shellscriptの ifについて質問を受けた。ifの後ろに書く [ 鍵カッコの後ろには空白が必要なのは何故?

そりゃ、鍵カッコはtestってコマンドのエイリアスだから、鍵カッコの後ろは、testコマンドの パラメータになるよね。だから、shellの約束で、スペース区切りが必要なのよ。と、某本の受け売り。

こっそり、確認しとくか。

ob64$ ls -l /bin/[ /bin/test
-r-xr-xr-x  2 root  bin  98960 Oct 12 04:33 /bin/[*
-r-xr-xr-x  2 root  bin  98960 Oct 12 04:33 /bin/test*

ほら、リンク数が2になってるでしょ。それからサイズも等しいでしょ。ってのは、中坊の証明です。年期の入ったおじさんは、それに加えて、inodeも等しいでしょ。

ob64$ ls -il /bin/[ /bin/test
545665 -r-xr-xr-x  2 root  bin  98960 Oct 12 04:33 /bin/[*
545665 -r-xr-xr-x  2 root  bin  98960 Oct 12 04:33 /bin/test*

これで、ファイルの実体は等しいと証明された。更に完璧を期すなら

ob64$ cmp /bin/[ /bin/test
ob64$

ファイルの内容を比較。文句を言ってこない所を見ると、等しいですよって事だ。 ここまでは知ってる事を証明しただけ。開き鍵カッコに対応して、閉じ鍵カッコとセミコロンを 付けるのは何故って疑問が密かに出てきた。質問された時に、オロオロしないように事前準備しておくか。

ob64$ touch foo
ob64$ [ -s foo ]; echo $?
1
ob64$ [ ! -s foo ]; echo $?
0

空ファイルを作って、それのサイズをテスト。結果の終了ステータスを表示。こういうのがすらすら出て来るのは、過去に失敗の経験があったからこそ。ここまでは良い。

ob64$ [ -s foo ; echo $?
ksh: [: missing ]
2

伊達の閉じ鍵カッコを省略してみた。なお、セミコロンは、1行に複数のコマンドを書く場合、コマンドの切れ目として機能する。

ob64$ [ -s foo ] echo $?
ksh: [: missing ]
ob64$ echo $?
2

kshって、カッコのバランスをチェックしてんのね。lispもこんな風にバランスをちゃんとチェックしてくれてたら、大事故を未然に防げるのに!

ob64$ test -s foo ; echo $?
1
ob64$ test -s foo  echo $?
ksh: test: echo: unexpected operator/operand
ob64$ test -s foo ]; echo $?
ksh: test: ]: unexpected operator/operand
2

鍵カッコを使わないtestコマンドなら、閉じ鍵カッコなんて不要。でも、コマンドを区切るセミコロンは必要。無理に閉じ鍵カッコを付けると、kshの監視に引っかかる。

と言う事で、testコマンドのエイリアスとして、開き鍵カッコを導入したものだから、閉じカッコの監査が必要になったって事だね。そしてその監査をshellが担っているんだな。冗長回路って事だな。

lispはそういう監査を放棄してる。悪く言えば放任主義。あまりガチガチに縛ると不自由な場面も出て来る(可能性がある)だろうから、ユーザーに責任を転嫁しますよ。上手く動かないのは、あんたの責任だからね。

if 文と test コマンドも、参考に。

押収

以前、オイラーのサイトに、(ロ)ボットが押し寄せて来てる事を知った。何を泥棒してってるの? 挙動を把握しておきたいな。

それには、nginxが出す生アクセスログが必要だ。取り寄せて鑑識してみるか。警察用語で言うと、証拠の押収って事になるんだな。以前、巨大掲示板にヤバい予告が出て、書き込みした連中を特定したいってんで、悶着があったな。

今なら、そんな苦労をしなくても、コンビニエンス何とか倶楽部みたいに、ホイホイと提供する事も平気で行われるようになった。

正式にはサツ(捜査令状)を取って、行わなければならない。動く人は泣く子も黙る桜田門。そこからさくらが実働部隊になって、物件を押収。さくらって、オイラーの所では、本当にsakuraだからね。

alias sakura='lftp -u foobar ftp://hamesspam.sakura.ne.jp'

ログは、 access_log_20190301.gz こんな風に1日毎に圧縮梱包されてる。

$ for f in *.gz
> do
> gzip -d $f
> done
$ cat access_log_20190* >ALL.txt

こんなコマンドを叩いて、圧縮を解き、まとめて一本糞にする。こうしておくと、後々の取り回しが楽になる。

log format

分析するには、中身の掌握が必要。典型的なログを下記に載せる。

hamesspam.sakura.ne.jp xxx.xxx.xxx.xxx - - [24/Feb/2019:17:31:20 +0900] "GET /hes2019/index.html HTTP/1.1" 200 799 "https://hamesspam.sakura.ne.jp/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"

分かり易いように分解
hamesspam.sakura.ne.jp              ;; Server 間違ってこんなのも hamesspam.tank.jp
xxx.xxx.xxx.xxx                     ;; user IP
- -                                 ;; ??
[24/Feb/2019:17:31:20 +0900]        ;; JST date
"GET /hes2019/index.html HTTP/1.1"  ;; req
200                                 ;; status
799                                 ;; xfer size
"https://hamesspam.sakura.ne.jp/"   ;; referrer
"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"

最後の長ったらしい文字列は、アクセスしてきた犯人の人着。これも警察語。にんちゃくって言う、犯人の人相、着衣を言うそうな。

基本的には、各項目をスペースで区切ってる。文字列は、ダブルクォートでくくってる。何で、日時の所にスペースを入れてるのやら? 見易さへの配慮って弁解は勘弁ね。

その他、サーバー名は不変、途中の2つのダッシュも不要ってんで、俺様フォーマットをでっち上げる。使う道具は、cut,sedあたりかな。これらの使い方の良い例になるぞ。

例えば、最初のサーバー名を省くなら

$ cut -d ' ' -f2- ALL.txt >z

スペースを区切り文字として、2番目以降のフィールドを出力。標準出力に出てくるので、適当にリダイレクトすれば良い。

$ cat z | sed -e 's/ - -//' -e 's/ +0900//' >y

今度は、2つのダッシュを削除、されからJSTマークも削除。結果を、zとかyなんてファイルに残しているんで、もし失敗してもやり直せる。ってか、結果を画面に出して、問題無かったら、ファイルにリダイレクトすれば良い。

ログの加工をしてる時、アプルのsafariって、まずapple-touch-icon-precomposed.pngこんな絵を要求するのを発見。それが無ければ諦めて、apple-touch-icon.pngはどうだと問い合わせ。 それも無いとなると、世間一般のfavicon.icoを要求してくる。あぷる、ウザイ。

オイラーのfavicon.icoは、赤いダエモン君。日本では、赤鬼とか言うのかな。BSDだからね。

bot のあぶり出し

ログには、一般市民とロボットの足跡が混在してる。この中から、botだけを抽出したい。 そう、渋谷でのハロウィンで、馬鹿騒ぎをした連中をあぶり出すようにね。

前回の捜査では、IPアドレスを逆引きして身元を確認するのが手堅い方法みたいだ。 今回もそれを周到する。

$ cat z | cut -d' ' -f1 | sort | uniq -c | sort -n | wc
     219     438    4204

ちょっと興味が有って、パイプが長くなっちゃったけど、このパイプを途中でぶった切って、drillに渡せばよい。219のユニークIPのうち、幾つがbotだろう?

このパイプ、shellの機能と思っている人が多いだろうけど、現代風に言うとメソッドチェーンだからね。昔からあるのに、Javaだと8になってようやく搭載されたよ。どれだけ遅れているんだろう。

$ cat z | cut -d' ' -f1 | sort | uniq | while read ip
> do
>     pi=`drill -x $ip | awk '/^[0-9].*PTR/{ print($5); }'`
>     printf "%s\t%s\n" $ip  $pi
>     sleep 1
> done | tee pair.txt

tee を使って逆引きの結果を見つつ、pair.txt へログを取ってる。ああ、ログって書いたけど、/etc/hostに加えても良い形式だぞ。長ったらしいホスト名と思ったら、追加であだ名をつけてもいい。

$ grep bot pair.txt | sort +1 | wc
      44      88    2163

生のやつを例示すると、あちこちから批判を浴びそうなので、wcしちゃったけど、sort +1 で、ホスト名で並べ替えしたんだ。そしたら、アプルからは、1台のロボットが来てた。ぐぐるのロボットは、19台。残りは、M$マーク入りだったよ。

ぐぐるのbotに注目すると、クラスCのIPと思われる。4基地からの出撃のようだ。 M$は、3基地からの出撃だった。

基地の判定は、IPアドレスを上の桁から見ていって、どこまでが同じかによる。

111.222.33.44   ;; site A
111.222.33.88   ;; site A
222.33.123.3    ;; site B
222.33.123.67   ;; site B

こんな具合ね。これで勘弁してね。 これで、面と本名が一致したな。

次は、何時活動してる? とか、何を本社に報告してるとかの、行動確認。察語で、何と言ったかな。

なお、名無しの権兵衛さんは、19人になってた。前回はどうだったかな。時間の経過と共に増大するんだろうね。統計期間は、嘘偽りなく、開所公開から30日分です。

アプルをやっつけろ

まずは1台のロボットしかやって来ていない、アプルさんから。1台と言う事は、担当が固定してるって事だな。

例によってIPは伏字です。それからログファイルには、オイラーの所からのアクセスも大量に含まれていたので、それを除外してNOME.txtって名前にしています。

$ grep xx.xx.xx.xx NOME.txt | cut -d' ' -f2- | cut -d'"' -f-2
[16/Feb/2019:17:39:46] "GET /robots.txt HTTP/1.1
[16/Feb/2019:17:39:46] "GET /hes2019/190216.html HTTP/1.1
[21/Feb/2019:10:59:00] "GET /robots.txt HTTP/1.1
[21/Feb/2019:10:59:01] "GET / HTTP/1.1
[03/Mar/2019:08:16:56] "GET /robots.txt HTTP/1.1
[03/Mar/2019:08:16:56] "GET / HTTP/1.1
[04/Mar/2019:10:07:20] "GET /robots.txt HTTP/1.1
[04/Mar/2019:10:07:20] "GET /hes2019/190301.html HTTP/1.1

アクセスに先立って、robots.txtってファイルが無いか確認してますな。このファイルは、一応ロボット除けの看板と言うかステッカーみたいな物。ちゃんと仁義きってるな。

それから、ピンポイントでファイルをDLしてるなあ。こんなファイルが置いてある事を誰に教わった? アプルの社長にネチネチと問いただしたいぞ。

アクセス日時のパターンは、今の所推測出来ず。もう少し泳がせておこうかな。

下記は、リファラーとロボットの人着。

"-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/600.2.5 (KHTML, like Gecko) Version/8.0.2 Safari/600.2.5 (Applebot/0.1; +http://www.apple.com/go/applebot)"

リファラーの記録が無いのが特徴だな。ロボットの姿は一応Mozillaって汎用品って事になってるけど、その後ろに広告が出てる。

Applebot についてなんてのを見ると、ちゃんと業界のルールを守るよと、ヨイ子の宣言がなされていました。

siriとかの知識の源に利用してるとな。なるほど。

ぐぐるの偵察部隊

どんなになってるのかな? 奴らの飯の種だからね。アプルと同じように、適当にロボットを一台追跡してみる。

$ grep xxx.xxx.xxx.xxx NOME.txt | cut -d' ' -f2- | cut -d'"' -f-2
[02/Mar/2019:04:42:33] "GET / HTTP/1.1
[02/Mar/2019:17:56:51] "GET /favicon.ico HTTP/1.1

仁義切ってないな。アイコン収集家か? 得意の HTTP/2.0 は、どうした?

"-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
"-" "Googlebot-Image/1.0"

アイコンだけじゃなくて、写真を専門に集めるロボットも抱えているのな。

Googlebotを公開して、免罪符にしようとしてるんだな。

適当に一台調べたけど、ぐぐる軍団のロボットをまとめて調べるにはどうやる? grepをmanしたら、素敵なオプション -f を発見。検索語をファイルに指定しておけば、複数語で検索出来るとな。

上で作った /etc/host と同等品から、ぐぐるのIPだけを抜き出した。それを使う。

$ grep -f gogle.txt   NOME.txt | cut -d' ' -f2- | cut -d'"' -f-2
[20/Feb/2019:06:31:44] "GET /robots.txt HTTP/1.1
[20/Feb/2019:06:31:45] "GET / HTTP/1.1
[20/Feb/2019:08:35:17] "GET / HTTP/1.1
[20/Feb/2019:16:50:00] "GET / HTTP/1.1
 :
[05/Mar/2019:07:56:18] "GET /robots.txt HTTP/1.1
[05/Mar/2019:07:56:18] "GET /hes2019/190301.html HTTP/1.1
[05/Mar/2019:07:56:23] "GET /hes2019/piki.css HTTP/1.1

初めて来たのは、2/20。新HPを公開したのは、2/10 だったから、10日で匂いを嗅ぎつけてわけだな。TOPページばかり見てるよ。それから、1件だけ、深入りしてる。

M$ の偵察部隊

上と同じ要領で

$ grep -f msn.txt   NOME.txt | cut -d' ' -f2- | cut -d'"' -f-2
[19/Feb/2019:15:35:14] "GET /robots.txt HTTP/1.1
[19/Feb/2019:15:35:19] "GET / HTTP/1.1

やっぱり深入りしてない。

"-" "Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)"

Bing webmaster help & how-to 翻訳機能が付いていて、ご協力をお願いしますって、低姿勢だな。

簡易鑑定

どうも、ロボットはリファラーを立てていない。これを逆手に取って

$ fgrep "-" NOME.txt | wc
     481    7824   79294

これで訪問回数が分かるな。ああ、実質はこの半分ぐらいか。仁義切るのに、robots.txtを確認してるからね。

思えばこんな所を始めたのは、不純な動機だった。

生IPが有るなら、それを逆引きすれば、みなさんどんなプロバイダーを使ってるか分かるだろうと言う出来心だった。

余計なと言うか不審な語句(bot)を含む、ホスト名が目に入ったばかりに、ロボットの行動監視に駆り出された。よもや、botが群がってきてるなんて、思いもしなかったぞ。まあ、そのおかげで知見が拡がったからいいんだけどもね。

netprint

長年使ってるプリンターのインクが切れそう。補充を探したけど、古すぎて手に入らないっぽい。

プリンターを買い替える? 終活モードに入りつつあるんで、買うのはよそう。最近ネットプリントなるものが、セブンイレブンでやってるそう。

netprint

家のパソコンからファイルをUPして、予約番号を持って行けば済みそう。試しにやってみるか。

まて、機微に触れるようなファイルを人様に委ねて大丈夫か? 自分でメディアにコピーして持ってけ。その方が安心だし安いぞ。