コース一覧
Linux道場 商店街サーバー障害対応の10問
ログから犯人を特定せよ

Linux道場 商店街サーバー障害対応の10問

Linux入門で身に付けた技を、商店街事務局のサーバー当番として試す演習専用コースです。解説はありません。障害の報告と復旧条件だけを読み、原因を自分で突き止めて直します。手が止まったときのために、方針・使うコマンド・部分解の3段階のヒントを各問に用意しています。他の道場と違い、白紙から書き始めるのではなく、すでに壊れている機械の前に座るところから始まります。ブラウザの中で本物の Debian が動いていて、打ったコマンドはそのまま本物の機械に効きます。迷子のファイル探しから始まり、ログからの原因特定、権限、ディスク不足、暴走プロセス、PATH、スクリプトの起動失敗、定期実行の停止、バックアップからの復元と進み、最後は複数の障害が同時に起きたサーバーを健全な状態まで戻します。1問15分から45分、全10問で約5時間です。Linux入門を終えて「コマンドは知っているが、壊れた機械を前にすると手が止まる」と感じている方に向いています。

1
初段
01. 迷子のファイルを探し出せ15分
02. ログから犯人を特定せよ20分
03. 開けないファイルを開けろ20分
04. ディスクを空けろ25分
2
中段
01. 暴走プロセスを止めろ25分
02. コマンドが見つからない30分
03. 動かないスクリプトを直せ30分
3
師範
01. 定期実行が動かない理由を突き止めろ30分
02. バックアップから復元せよ35分
03. 総合 サーバー健全化ミッション45分

ログから犯人を特定せよ

初段 / 目安 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位を確定させてください。 遮断リストに載せるということは、その相手をサイトから締め出すということです。間違えれば普通のお客さんを締め出します。

完成条件

  1. /var/log/shotengai/access.log を調べ、アクセス数が最も多いIPアドレスを1つ特定すること
  2. そのIPアドレスだけを /root/hannin.txt に書くこと。1行だけ、IPアドレスだけです
  3. そのIPアドレスからのアクセスが何回あったかを /root/kaisuu.txt に書くこと。数字だけです

進め方

数えてから書いてください。手が止まったらヒントを開けます。ヒントは3段階で、①方針、②使うコマンド、③部分解の順に出ます。1つも開けずに通せたら、その問題は自分のものです。

開かずに10分粘って進まないなら、①だけ開けてください。ここで身に付く「切り出して並べて数える」の型は、この先どんなログにも効きます。

課題

  1. /var/log/shotengai/access.log を調べること
  2. アクセス数が最多のIPアドレスを1つ特定すること
  3. そのIPアドレスだけを /root/hannin.txt に1行で書くこと
  4. そのIPアドレスのアクセス回数を /root/kaisuu.txt に数字で書くこと

ヒント

前のヒントを開くと次が開きます。開かずに解けると未開封クリアです

①方針 ログを目で追わず、IPアドレスの列だけを取り出して、同じものをまとめて数えます。多い順に並べれば1位が先頭に来ます

ヒント 2ヒント 1 を開くと読めます
ヒント 3ヒント 2 を開くと読めます
  • 1. wc -l と head でログの大きさと形を確かめる
  • 2. IPアドレスの列だけを取り出す
  • 3. sort と uniq -c で数え、多い順に並べる
  • 4. 1位のIPアドレスを /root/hannin.txt に書く
  • 5. そのアクセス回数を /root/kaisuu.txt に書く

3 項目で採点します