ログから犯人を特定せよ
初段 / 目安 20分
商店街のサイトが、昨日の夕方から重くなりました。事務局の電話も鳴りっぱなしです。鴫原さんはアクセスログを開いたまま、腕を組んでいます。
「誰かが機械みたいな速さで叩いとる。人間の客じゃない。ログには全部残っとるんだが、8000行ある。目で追うのは無理だ」
ログは /var/log/shotengai/access.log にあります。1行が1アクセスで、先頭にアクセス元のIPアドレスが入っています。8000行の中で、ある1つのIPアドレスだけが桁違いに多いはずです。それを見つけて、遮断リストに載せるのが今日の仕事です。
数えるという仕事
ログ調査でやることは、突きつめると「絞る」と「数える」の2つです。この2つを別々の道具でやり、パイプ | で繋ぐのが Unix のやり方です。
grep は絞る道具です。渡した文字を含む行だけを通します。
ターミナル
grep "POST" access.log数えるほうは、少し段取りが要ります。uniq -c は隣り合った同じ行をまとめて個数を付けますが、隣り合っていないと数えてくれません。だから先に sort で同じものを並べてから渡します。この順番はセットで覚えるものです。
ターミナル
sort ファイル | uniq -cさらに多い順に並べたいなら、もう一度 sort に通します。-n は数として比べる指定、-r は逆順です。
ターミナル
sort ファイル | uniq -c | sort -nr | head -5行まるごとではなく、先頭のIPアドレスだけを数えたいときは、列を切り出してから渡します。空白区切りの1列目を取るなら awk '{print $1}' か cut -d" " -f1 です。どちらでも通ります。
この「切り出す、並べる、数える、並べ直す」という4段の並びは、ログ調査でそのまま何度でも使えます。覚えるべきは個々のコマンドではなく、小さな道具をパイプで繋いで大きな仕事にするという考え方のほうです。1つの万能コマンドを探すより、この繋ぎ方に慣れるほうが早く着きます。
ある1つの相手の回数だけを知りたいなら、grep -c という近道もあります。-c は一致した行数を数えて返します。上位を出すのは sort と uniq の組で、確定した1つを数え直すのは grep -c で、と使い分けると読みやすい調査になります。
数字は決めつけないこと
ここで一番やってはいけないのは、ログを眺めて「たぶんこれだろう」と当たりを付けて終わることです。多いように見えるだけの2位が混じります。必ず数えて、数字で1位を確定させてください。 遮断リストに載せるということは、その相手をサイトから締め出すということです。間違えれば普通のお客さんを締め出します。
完成条件
/var/log/shotengai/access.logを調べ、アクセス数が最も多いIPアドレスを1つ特定すること- そのIPアドレスだけを
/root/hannin.txtに書くこと。1行だけ、IPアドレスだけです - そのIPアドレスからのアクセスが何回あったかを
/root/kaisuu.txtに書くこと。数字だけです
進め方
数えてから書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。
開かずに10分粘って進まないなら、①だけ開けてください。ここで身に付く「切り出して並べて数える」の型は、この先どんなログにも効きます。
課題
- /var/log/shotengai/access.log を調べること
- アクセス数が最多のIPアドレスを1つ特定すること
- そのIPアドレスだけを /root/hannin.txt に1行で書くこと
- そのIPアドレスのアクセス回数を /root/kaisuu.txt に数字で書くこと
ヒント
前のヒントを開くと次が開きます。開かずに解けると未開封クリアです