ログファイルからボットを検索するスクリプト

ログファイルからボットを検索するスクリプト

小さなログファイルがあり、そこにボットが見つかるはずです。

ファイル:

Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user logged in| -
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user changed password| -
Mon, 22 Aug 2016 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |user logged off| -
Mon, 22 Aug 2016 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |user logged in| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user changed password| -
Mon, 22 Aug 2016 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |user logged off| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged in| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user changed password| -
Mon, 22 Aug 2016 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |user logged off| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user logged in| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user changed password| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user changed profile| -
Mon, 22 Aug 2016 13:17:50 +0200|178.57.66.205|abcbbabab| - |user logged off| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |user logged in| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |user changed password| -
Mon, 22 Aug 2016 13:19:19 +0200|178.56.66.225|fxsciulmla| - |user logged off| -
Mon, 22 Aug 2016 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |user logged in| -

このファイルには、たくさんの IP、ログイン、ユーザー名があります。まず、IP のユニーク数とカウントについて考えました。では、何をすべきでしょうか。イベントのみを使用する必要があります: ユーザーがログイン、ユーザーがオフに変更、ユーザーがログオフ。次に、同時にログインしたユーザーを表示する必要があります。最初の 3 行は、ユーザーがログイン、パスワードを変更、ログオフしたことを示しています。この時間は 13:15:39 です。また、IP 178.57.66.225 のユーザー fxsciaqulmlk は、イベントの操作が同時に行われたため、ボットです。私のスクリプト:

log_file=/root/log
log_after=/root/after_log
temp_file=/root/temp
temp_file2=/root/temp2
uniq_file=/root/uniq
uniq_file2=/root/uniq2
result_uniq=/root/result_uniq
result_file=/root/result

cat /dev/null > $log_after
cat /dev/null > $temp_file
cat /dev/null > $temp_file2
cat /dev/null > $uniq_file
cat /dev/null > $uniq_file2
cat /dev/null > $result_file

grep "changed password\|logged in\|logged off" $log_file > $log_after
cat $log_after | awk '{print $6}' | awk -F "|" '{print $2,$3}' | tail -n 20 > $temp_file
cat $log_after | awk '{print $5}' | tail -n 20 > $temp_file2
uniq -c $temp_file | awk '{print $1}' > $uniq_file
uniq -c $temp_file2 | awk '{print $1}' > $uniq_file2

awk 'FNR==NR{a[$1]++;next}!a[$1]' $uniq_file  $uniq_file2  > $result_uniq

if [ -s $result_uniq ] && [ -f $result_uniq ]; then
 echo "File is not  empty"
 echo "Differences:"
 cat $result_uniq
 echo "Need to think"
 exit 0
else
 echo "File is empty"
 echo "We can use one file from uniq"
fi

for i in `uniq -c $temp_file | awk '{print $1}'`; do
if [ $i -gt 2 ]; then
s=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $3}'`
ss=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $2}'`
echo "Tho boot is user $s with ip $ss"
fi
done

この質問は次の質問と全く同じです:

Script to search bots from log file 1 answer

このメッセージは以前にも書きました。これでタスクは完了しましたが、出力が少し正しくありません。それでは、始めます。ログ ファイルがあります:

2016 年 8 月 22 日月曜日 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |ユーザーがパスワードを変更しました| - 2016 年 8 月 22 日月曜日 13:15:39 +0200|178.57.66.225|fxsciaqulmlk| - |ユーザーがログオフしました| - 2016 年 8 月 22 日月曜日 13:15:42 +0200|178.57.66.225|faaaaaa11111| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |ユーザーがパスワードを変更しました| - 2016 年 8 月 22 日月曜日 13:15:49 +0200|178.57.66.215|terdsfsdfsdf| - |ユーザーがログオフしました| - 2016 年 8 月 22 日月曜日 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |ユーザーがパスワードを変更しました| - 2016 年 8 月 22 日月曜日 13:15:59 +0200|178.57.66.205|erdsfsdfsdf| - |ユーザーがログオフしました| - 2016 年 8 月 22 日月曜日 13:17:50 +0200|178.57.66.205|abcbbabab| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:17:50 +0200|178.57.66.205|abcbbabab| - |ユーザーがパスワードを変更しました| - 2016 年 8 月 22 日月曜日 13:17:50 +0200|178.57.66.205|abcbbabab| - |ユーザーがプロフィールを変更しました| - 2016 年 8 月 22 日月曜日 13:17:50 +0200|178.57.66.205|abcbbabab| - |ユーザーがログオフしました| - 2016 年 8 月 22 日月曜日 13:19:19 +0200|178.56.66.225|fxsciulmla| - |ユーザーがログインしました| - 2016 年 8 月 22 日月曜日 13:19:19 +0200|178.56.66.225|fxsciulmla| - |ユーザーがパスワードを変更しました| - 2016 年 8 月 22 日月曜日 13:19:19 +0200|178.56.66.225|fxsciulmla| - |ユーザーがログオフしました| - 2016 年 8 月 22 日月曜日 13:20:42 +0200|178.57.67.225|faaaa0a1111| - |ユーザーがログインしました| -

では、何をすべきでしょうか。イベントのみを使用する必要があります: ユーザーがログイン、ユーザーがオフに変更、ユーザーがログオフ。次に、同時にログインしたユーザーを表示する必要があります。最初の 3 行は、ユーザーがログイン、パスワードを変更、ログオフしたことを示しています。この時間は 13:15:39 です。また、IP 178.57.66.225 のユーザー fxsciaqulmlk は、イベントの操作が同時に行われたため、ボットです。私のスクリプト:

#!/bin/bash
# you should add it script in crontab, like this
#*/2 * * * *      /name_of_this_script.sh
# you should change variable way in $log_file to your own way

log_file=/root/log
log_after=/root/after_log
temp_file=/root/temp
temp_file2=/root/temp2
uniq_file=/root/uniq
uniq_file2=/root/uniq2
result_uniq=/root/result_uniq
result_file=/root/result

cat /dev/null > $log_after
cat /dev/null > $temp_file
cat /dev/null > $temp_file2
cat /dev/null > $uniq_file
cat /dev/null > $uniq_file2
cat /dev/null > $result_file

grep "changed password\|logged in\|logged off" $log_file > $log_after
cat $log_after | awk '{print $6}' | awk -F "|" '{print $2,$3}' | tail -n 20 > $temp_file
cat $log_after | awk '{print $5}' | tail -n 20 > $temp_file2
uniq -c $temp_file | awk '{print $1}' > $uniq_file
uniq -c $temp_file2 | awk '{print $1}' > $uniq_file2

awk 'FNR==NR{a[$1]++;next}!a[$1]' $uniq_file  $uniq_file2  > $result_uniq

if [ -s $result_uniq ] && [ -f $result_uniq ]; then
 echo "File is not  empty"
 echo "Differences:"
 cat $result_uniq
 echo "Need to think"
 exit 0
else
 echo "File is empty"
 echo "We can use one file from uniq"
fi

for i in `uniq -c $temp_file | awk '{print $1}'`; do
if [ $i -gt 2 ]; then
s=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $3}'`
ss=`uniq -c $temp_file | awk '$1 == '$i | awk '{print $2}'`
echo "Tho boot is user $s with ip $ss"
fi
done

すべて問題ありません。しかし、悪い結果が出ました:

Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225
Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225
Tho boot is user erdsfsdfsdf with ip 178.57.66.205
Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225
Tho boot is user fxsciaqulmlk
terdsfsdfsdf
abcbbabab
fxsciulmla with ip 178.57.66.225
178.57.66.215
178.57.66.205
178.56.66.225

どこに間違いがありますか? 理解できません。コードのどこに間違いがありますか? 質問を繰り返して申し訳ありませんが、このスクリプトは作成済みです。少し助けが必要です。

答え1

言語の壁があるため、何を求めているのかがわかりにくいです。ログ ファイル内のすべてのエントリをループする方法を求めているのか、ユーザーが特定のイベントを何回トリガーしたかを判断しようとしているのか、はっきりしません。いずれの場合でも、ログ ファイルのすべての行を調べて、さまざまなフィールドを分割する方法が必要になるようです。

これにはさまざまな方法があります。単純なアプローチは次のようになります。

#!/bin/bash
log="/root/auth.log"
result="/root/bots.result"

# we probably don't need the intermediate file 
# temp=/root/log.temp

# a simple redirect can clear the output file
> $result

# read every line of the log file
while read line; do
   # split fields with 'cut' using whitespace as a delimiter
   date=`echo "$line" | cut -d' ' -f1-5`

   # split using pipe as a delimiter
   ip=`echo "$line" | cut -d'|' -f2`
   user=`echo "$line" | cut -d'|' -f3`
   event=`echo "$line" | cut -d'|' -f5`

   # report results
   echo "date:$date user:$user from ip:$ip $event" >> "$results"
done < "$log"

関連情報