(ロ)ボットの行動確認
と、ある友人から、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
長年使ってるプリンターのインクが切れそう。補充を探したけど、古すぎて手に入らないっぽい。
プリンターを買い替える? 終活モードに入りつつあるんで、買うのはよそう。最近ネットプリントなるものが、セブンイレブンでやってるそう。
家のパソコンからファイルをUPして、予約番号を持って行けば済みそう。試しにやってみるか。
まて、機微に触れるようなファイルを人様に委ねて大丈夫か? 自分でメディアにコピーして持ってけ。その方が安心だし安いぞ。