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時間前、そのアドレスは何を求めていましたか。