夜中に決済が止まった
ある会社のオンライン決済が、夜中に止まりました。何も変更していません。朝食のときに、社長から電話が来ます。
当て推量はしません。ログを開きます。ログには、マシンが何を、いつしたかが書いてあります。
このレッスンのゴール
メモ
ログから、何がうまくいかなかったかを見つけることができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| ログ | プログラムが、したことを書き残すファイル | |
| ログの行 | 1件の記録。時刻、出どころ、メッセージ | |
| タイムスタンプ | ログの行に書かれた日付と時刻 | |
| フィルタ | 気になる行だけを残すこと | grep |
| タイムライン | 複数のログの出来事を、時間順に並べたもの | |
| 証拠 | 自分の主張を裏づけるログの行 |
学生が入力するセルは、このプレビューでは空白です。
ログの行には部品がある
マシンは、決まった型でログを書きます。だからツールで読めます。型を一度覚えれば、どの行も読みやすくなります。
ログインのログの行には、日付と時刻、マシン名、プログラム名、メッセージが並びます。メッセージに、事実が入っています。誰が、どこから試し、成功したかどうかです。
このラボの証拠
ls caseここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ログインのログは何行か
wc -l case/var/log/auth.logここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Webログの最初の2行
head -n 2 case/var/log/nginx/access.logここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Webログの最後の3行
tail -n 3 case/var/log/nginx/access.logここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: Webログの1行
| 部品 | 例 | 意味 |
|---|---|---|
| アドレス | 192.0.2.77 | 誰が要求したか |
| 時刻 | [14/Oct/2026:00:01:49 +0000] | いつ |
| リクエスト | "GET /login HTTP/1.1" | 何を求めたか |
| 状態 | 200 | 返事。200は成功、404は見つからない、403は拒否 |
| 大きさ | 2557 | 返したバイト数 |
学生が入力するセルは、このプレビューでは空白です。
先に絞ってから数える
grep は、ある言葉を含む行だけを残します。grep -c は、行を出さずに数を数えます。
列ごとに数えるには、awk で列を切り出し、並べ替え、uniq -c で同じものの連なりを数えます。最後に sort -rn を付けると、多い順になります。
失敗したパスワードを数える
grep -c "Failed password" case/var/log/auth.logここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
成功したログインを数える
grep -c "Accepted" case/var/log/auth.logここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
Webログを状態コードごとに数える
awk '{print $9}' case/var/log/nginx/access.log | sort | uniq -cここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
読んでみる小さな抜粋
Oct 14 02:11:03 web01 sshd[2211]: Invalid user admin from 198.51.100.7 port 4410
Oct 14 02:11:03 web01 sshd[2211]: Failed password for invalid user admin from 198.51.100.7 port 4410 ssh2
Oct 14 02:11:09 web01 sshd[2214]: Failed password for root from 198.51.100.7 port 4418 ssh2
Oct 14 02:14:40 web01 sshd[2230]: Accepted password for alice from 192.0.2.10 port 5120 ssh2
例: アドレスごとに数える
| 手順 | すること | 抜粋での結果 |
|---|---|---|
| 1 | Failed password の行を残す | 2行 |
| 2 | 「from」の次のアドレスを切り出す | 198.51.100.7が2回 |
| 3 | アドレスごとに数える | 198.51.100.7: 2 |
| 4 | そこからの Accepted の行を探す | なし。つまり入れていない |
学生が入力するセルは、このプレビューでは空白です。
よくある間違い
注意
「失敗がいちばん多いアドレスが、侵入に成功した」と考える人が多くいます。失敗と成功は、別の行です。1000回失敗しても、一度も成功していないアドレスはあります。必ず成功の行を探し、疑うアドレスからのものか確かめましょう。
タイムラインでログをつなぐ
ログ1つで、全体の話が分かることはまれです。複数のログの出来事を、時間順に並べます。そして、最初に起きたことを探します。
最初の出来事がいちばん大事です。そのあとのことは、その結果かもしれません。
例: タイムライン
| 時刻 | 出どころ | 出来事 |
|---|---|---|
| 02:11 | ログインのログ | 1つのアドレスから、パスワードの失敗が続く |
| 02:14 | ログインのログ | 別のアドレスから alice のログインが成功 |
| 02:16 | Webログ | 管理ページへの要求に200で答えた |
| 02:30 | cronのログ | 新しいジョブが初めて動いた |
学生が入力するセルは、このプレビューでは空白です。
ログを追いかけ、長いログを読む
tail -f とログの名前を打つと、新しい行が届くのを見られます。止めるには Ctrl+C を押します。RunはCtrl+Cを押せないので、これは自分で打ってください。
less とログの名前を打つと、長いファイルをページごとに読めます。/ と言葉で検索し、q で出ます。
もっと先へ
状態が404だった行だけを残し、求められたページ(7列目)ごとに数えましょう。多い順に並べ、上の3つだけを出します。
awk、sort、uniq -c、sort -rn、head を1本のパイプにつなぎます。出てきたページ名から、何を探していた要求かを考えましょう。