検知ルールとは何か
検知ルールとは、ログの行を調べて、攻撃らしい動きを見つける決まりです。「この形の行が、この回数、この時間内に出たらアラートを出す」と書いておけば、人が見張らなくても機械が知らせてくれます。
良いルールは、攻撃を見つけ、ふつうの利用を巻き込みません。
このレッスンのゴール
メモ
ログから攻撃を見つける検知ルールを、一致、回数、時間枠の3つの部品で書くことができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 検知ルール | ログから攻撃らしい動きを見つける決まり | |
| 一致 | 行が、決めた形に合うこと | Failed password |
| しきい値 | アラートを出す回数の境目 | |
| 時間枠 | 数える時間の長さ | |
| 総当たり攻撃 | パスワードを何度も試す攻撃 | |
| 例外 | ルールから外す、正しい利用 |
学生が入力するセルは、このプレビューでは空白です。
一致は行の形を決める
ルールの最初の部品は、一致です。ログの行が、決めた形に合うかを調べます。いちばん簡単なのは、ある言葉を含む行を探すことです。
grep が、その道具です。-c を付けると、合った行の数が出ます。-E を付けると、| で「どちらか」と書けます。
一致した行を数える
printf 'Failed password for root from 192.0.2.7\nAccepted password for tanaka from 192.0.2.8\nFailed password for admin from 192.0.2.7\n' | grep -c "Failed password"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
どちらかに一致する行
printf 'Failed password for root from 192.0.2.7\nInvalid user admin from 192.0.2.7\nAccepted password for tanaka from 192.0.2.8\n' | grep -Ec "Failed|Invalid"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 一致で見つけるもの
| 一致させる言葉 | 見つけるもの |
|---|---|
| Failed password | パスワードの失敗 |
| Invalid user | 存在しない利用者名での試し |
| COMMAND= | sudo で実行された命令 |
| Accepted | ログインの成功 |
学生が入力するセルは、このプレビューでは空白です。
しきい値は回数の境目
1回のパスワード失敗は、ふつうの打ち間違いです。ところが20回なら、機械が試している可能性が高くなります。
そこで、2つ目の部品を足します。同じアドレスからの失敗が、何回以上でアラートを出すか、というしきい値です。
アドレスごとに3回以上
printf '192.0.2.7\n192.0.2.7\n192.0.2.9\n192.0.2.7\n' | awk '{n[$1]++} END {for (a in n) print a, n[a]}' | awk '$2 >= 3'ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
例: 回数と判断
| 同じアドレスの失敗 | しきい値が3回なら | しきい値が10回なら |
|---|---|---|
| 1回 | アラートなし | アラートなし |
| 4回 | アラートが出る | アラートなし |
| 25回 | アラートが出る | アラートが出る |
学生が入力するセルは、このプレビューでは空白です。
時間枠を決めて数える
1か月に10回の失敗は、打ち間違いかもしれません。同じ10回が10秒間に起きたら、機械の仕業です。そこで、3つ目の部品を足します。何秒の間に数えるか、という時間枠です。
失敗の時刻を順に並べ、「最初の失敗から、しきい値の回数目までの差」を調べます。差が時間枠以下なら、アラートです。
例: 10秒に4回のルール
| 数え始め | 4回目の時刻 | 差 | 判断 |
|---|---|---|---|
| 0秒の失敗から | 8秒 | 8秒 | 10秒以下なのでアラート |
| 2秒の失敗から | 70秒 | 68秒 | 10秒より長いのでアラートなし |
| 5秒の失敗から | 130秒 | 125秒 | 10秒より長いのでアラートなし |
学生が入力するセルは、このプレビューでは空白です。
時間枠のルールを動かす
times = [0, 2, 5, 8, 70, 130] # 失敗の時刻(秒)
limit = 4 # しきい値
window = 10 # 時間枠(秒)
alert = False
for i in range(len(times) - limit + 1):
# i番目から、limit回目までの差を調べる
if times[i + limit - 1] - times[i] <= window:
alert = True
print("アラート:", alert)
# 変えてみる: window を 5 にして、もう一度 Run しましょう。
ルールは過去のログで試す
書いたルールは、すぐ本番に出しません。過去のログに当てて、何件アラートが出るかを見ます。
多すぎたら、しきい値を上げるか、正しい利用を例外にします。たとえば、社内の管理者のアドレスです。少なすぎたら、見逃しが心配です。
よくある間違い
注意
「しきい値は低いほど安全だ」と考える人が多くいます。低すぎると、打ち間違いにまでアラートが出ます。誤報が増えると、本物が見落とされます。過去のログで、数を確かめて決めましょう。