クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

ログと監視

このレッスンのあとで: ログから、何がうまくいかなかったかを見つけることができる。

55分のレッスンコマンド7件インシデント対応とフォレンジックのラボ:侵入されたサーバーをブラウザーで調べる

夜中に決済が止まった

ある会社のオンライン決済が、夜中に止まりました。何も変更していません。朝食のときに、社長から電話が来ます。

当て推量はしません。ログを開きます。ログには、マシンが何を、いつしたかが書いてあります。

このレッスンのゴール

メモ

ログから、何がうまくいかなかったかを見つけることができる。

キーワード

ことばいみれい
ログプログラムが、したことを書き残すファイル
ログの行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

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

読んでみる小さな抜粋

コード: bash
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

例: アドレスごとに数える

手順すること抜粋での結果
1Failed 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:16Webログ管理ページへの要求に200で答えた
02:30cronのログ新しいジョブが初めて動いた

学生が入力するセルは、このプレビューでは空白です。

ログを追いかけ、長いログを読む

tail -f とログの名前を打つと、新しい行が届くのを見られます。止めるには Ctrl+C を押します。RunはCtrl+Cを押せないので、これは自分で打ってください。

less とログの名前を打つと、長いファイルをページごとに読めます。/ と言葉で検索し、q で出ます。

もっと先へ

状態が404だった行だけを残し、求められたページ(7列目)ごとに数えましょう。多い順に並べ、上の3つだけを出します。

awk、sort、uniq -c、sort -rn、head を1本のパイプにつなぎます。出てきたページ名から、何を探していた要求かを考えましょう。

このラボとソースについて: インシデント対応とフォレンジックのラボ:侵入されたサーバーをブラウザーで調べる

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。