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

無料レッスン

ログから攻撃を見つける

このレッスンのあとで: ログから侵入を見つけ、封じ込め、直し方を言える。

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

333回の失敗と、大事な1回

Web サーバーの1日のログには、失敗したログインが何百回も残っています。ほとんどは、入れないロボットです。いくつかは、持ち主のパスワードの打ち間違いです。

あるアドレスだけが違います。何度も失敗して、そのあと成功します。

今日は、そのアドレスを見つけて締め出し、使われた穴をふさぎます。

このレッスンのゴール

メモ

ログから侵入を見つけ、封じ込め、直し方を言える。

重要な言葉

ことばいみ
ログ起きたことを、1回に1行ずつ書き残すファイル
ブルートフォース当たるまで、たくさんのパスワードを試すこと
送信元アドレス接続が来たネットワークのアドレス
封じ込め原因を直す前に、被害が広がるのを止めること
ノイズ不安に見えるが、何の意味もないログの行
決め手攻撃とノイズを分ける、たった1つの事実

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

まず数え、次に誰が入ったかを問う

事例は、サーバーの SSH ログのコピーで、フォルダ case にあります。読むだけにしてあるので、証拠はそのまま残ります。

数が大きいだけでは、攻撃とは言えません。まず、アドレスごとに失敗を数えます。次に、入ったことのあるアドレスを問います。

アドレスごとに失敗したログインを数える

コマンド
grep "Failed password" case/var/log/auth.log | awk '{for (i = 1; i <= NF; i++) if ($i == "from") print $(i + 1)}' | sort | uniq -c | sort -rn | head -n 3

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

上位の3つ

Run は3行を書きました。それぞれ、回数とアドレスです。試験機では、回数は260、70、3でした。アドレスは、このラボの学生全員で同じです。

260回失敗したアドレスが、いちばん騒がしいです。騒がしいことは、危険を意味しません。ここで止まってはいけません。

誰が、どこから入ったか

コマンド
awk '$6 == "Accepted" {print $9, $11}' case/var/log/auth.log | sort | uniq -c

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

入ったアドレスを保存する

コマンド
awk '$6 == "Accepted" {print $11}' case/var/log/auth.log | sort -u > accepted.txt

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

騒がしく、しかも入ったアドレスはどれか

コマンド
awk '$6 == "Failed" {for (i = 1; i <= NF; i++) if ($i == "from") print $(i + 1)}' case/var/log/auth.log | sort | uniq -c | awk '$1 >= 20 {print $2}' | sort | comm -12 - accepted.txt | tee suspect.txt

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

最初に成功したログインを見る

コマンド
grep Accepted case/var/log/auth.log | grep -F -f suspect.txt | head -n 1

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

4つの Run が見つけたもの

最初の Run は、3つのグループを書きました。事務所のアドレスからのアカウント、打ち間違いのアドレスからのアカウント、そして疑わしいアドレスからのアカウントです。疑わしいアドレスのアカウントは、2回入っています。

決め手の Run が書いたのは、1つのアドレスです。20回以上失敗して、そのあと成功しました。最後の Run は、最初の成功の行を、時刻とアカウントつきで見せました。

まず封じ込め、次に原因を直す

わかったら、この順に進めます。封じ込めは速く、元に戻せます。原因を直すのは時間がかかり、正しくなければなりません。

まだ何も消してはいけません。証拠は、ほかに何を触られたかを知る手がかりです。

例: ログの行から直し方まで

段階やること理由
検知アドレスごとに失敗を数え、誰が入ったかを見る決め手が見つかる
封じ込めアカウントをロックし、アドレスを断る侵入者が、もう使えなくなる
原因を直すSSH は鍵だけ、ポートにルール、パスワードのログインはなし同じ推測は、もう通らない
確認残された鍵、仕事、新しいアカウントを探す2つ目の裏口を塞ぐ

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

自分のアカウントで封じ込めを練習する

事例のアカウントには触りません。使い捨てのアカウント demo7 を作り、ロックし、状態を読み、消します。

ロックしたアカウントは、パスワードではログインできませんが、何も消えません。だから、最初の段階なのです。

使い捨てのアカウントを作る

コマンド
sudo useradd -m -s /bin/bash demo7

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

パスワードをロックする

コマンド
sudo passwd -l demo7

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

状態を読む

コマンド
sudo passwd -S demo7

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

アカウントとフォルダを消す

コマンド
sudo userdel -r demo7

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

アカウントの Run が書いたもの

ロックの Run は passwd: password changed. を書きました。状態の Run は demo7 L で始まる行を書きました。L はロック中の意味です。ログインできるアカウントは P と出ます。

削除の Run は、メールのスプールについての警告を書くことがあります。このアカウントにはメールがなかったので、心配は要りません。

作った2つのファイルを消す

コマンド
rm accepted.txt suspect.txt

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

よくある間違い

注意

失敗がいちばん多いアドレスを塞いで、インシデントは終わりだと言う人が多くいます。そのアドレスは、一度も入っていません。入ったほうは目立たず、今も中にいます。いつも、誰が成功したかを問い、何を変えたかを調べましょう。

発展: そのアドレスは、ほかに何をしたか

Web サーバーのログ case/var/log/nginx/access.log を見ましょう。保存する2つの Run をもう一度実行して suspect.txt を作り直し、grep -c -F -f suspect.txt で、そのアドレスからの要求を数えます。そのあと、2つのファイルを消します。

1文を書きましょう。パスワードを当て始める1時間前、そのアドレスは何を求めていましたか。

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

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