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

無料レッスン

ログから攻撃を見つける検知ルール

このレッスンのあとで: ログから攻撃を見つける検知ルールを、一致、回数、時間枠の3つの部品で書くことができる。

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

検知ルールとは何か

検知ルールとは、ログの行を調べて、攻撃らしい動きを見つける決まりです。「この形の行が、この回数、この時間内に出たらアラートを出す」と書いておけば、人が見張らなくても機械が知らせてくれます。

良いルールは、攻撃を見つけ、ふつうの利用を巻き込みません。

このレッスンのゴール

メモ

ログから攻撃を見つける検知ルールを、一致、回数、時間枠の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秒より長いのでアラートなし

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

時間枠のルールを動かす

コード: python
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 しましょう。

ルールは過去のログで試す

書いたルールは、すぐ本番に出しません。過去のログに当てて、何件アラートが出るかを見ます。

多すぎたら、しきい値を上げるか、正しい利用を例外にします。たとえば、社内の管理者のアドレスです。少なすぎたら、見逃しが心配です。

よくある間違い

注意

「しきい値は低いほど安全だ」と考える人が多くいます。低すぎると、打ち間違いにまでアラートが出ます。誤報が増えると、本物が見落とされます。過去のログで、数を確かめて決めましょう。

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

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