ログファイル
About 25% of the activity is 200-OKAbout 25% of the activity is 200-OKAbout 25% of the activity is 200-OKAbout 25% of the activity is 200-OKアクティビティの約 25% は 200-OK です
Web サーバーに 1 年間保存されているログ ファイルと、1 か月保存されているログ ファイルがあることがわかりました。 私は、サーバーへの訪問者に関する情報を含む 3 種類のログ ファイルを調査しました (あまり興味のないファイルは他にもあります)。 典型的な例をいくつか示します。
の認証ログ(IPは変更されました)
Oct 23 06:02:24 server1 sshd[20172]: Failed password for invalid user admin from 192.168.1.1 port 64721 ssh2
Oct 23 06:09:01 server1 CRON[20181]: pam_unix(cron:session): session opened for user root by (uid=0)
Oct 23 06:09:01 server1 CRON[20181]: pam_unix(cron:session): session closed for user root
Oct 23 06:10:35 server1 sshd[20195]: Did not receive identification string from 192.168.1.1
Oct 23 06:10:40 server1 sshd[20196]: Invalid user admin from 192.168.1.1
Oct 23 06:10:40 server1 sshd[20196]: input_userauth_request: invalid user admin [preauth]
Oct 23 06:10:41 server1 sshd[20196]: pam_unix(sshd:auth): check pass; user unknown
Web サーバー上の認証試行は、私、私のサーバーに属するソフトウェア (上記の CRON)、または別の人またはコンピューター (上記の admin というユーザー ID を試行している人) によるログイン試行を表します。 管理者は「悪い人」カテゴリに分類されます。
のアクセスログ(Apacheサーバー) (IPが変更されました)
192.168.2.2 - - [30/Aug/2016:08:30:29 -0400] "GET / HTTP/1.1" 200 1714 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
192.168.1.1 - - [30/Aug/2016:08:51:52 -0400] "GET /hndUnblock.cgi HTTP/1.0" 404 496 "-" "Wget(linux)"
192.168.1.1 - - [30/Aug/2016:08:51:52 -0400] "GET /tmUnblock.cgi HTTP/1.0" 404 495 "-" "Wget(linux)"
192.168.1.1 - - [30/Aug/2016:08:51:52 -0400] "GET /cgi/common.cgi HTTP/1.0" 404 496 "-" "Wget(linux)"
192.168.1.1 - - [30/Aug/2016:08:51:53 -0400] "GET /stssys.htm HTTP/1.0" 404 492 "-" "Wget(linux)"
192.168.1.1 - - [30/Aug/2016:08:51:53 -0400] "GET / HTTP/1.0" 200 1714 "-" "Wget(linux)"
192.168.1.1 - - [30/Aug/2016:08:51:54 -0400] "POST /command.php HTTP/1.0" 404 493 "-" "Wget(linux)"
192.168.3.3 - - [30/Aug/2016:09:09:01 -0400] "GET /?feed=rss2 HTTP/1.1" 200 794 "-" "Feedly/1.0 (+http://www.feedly.com/fetcher.html; like FeedFetcher-Google)"
アクセス ログ エントリは、サーバーから Web ページを取得しようとする試みを表します。 上の最初の行は、Web クローラーによる有効なリクエストを表しています (百度、中国の検索エンジン)。 get リクエストはメイン ページである / に対するものでした。 200 は、ページが正常に提供されたことを意味します。 次の 6 行はすべて 404 (見つからない) という結果になります。 これは、設定が間違っている Web サーバーを見つけようとしているハッカーです。 何度か試みた後、監視ソフトウェア (Fail2Ban) が何が起こっているかに気づき、彼を締め出しました。 以前は Fail2Ban が非常に重要だと考えていました (今でも重要です!) が、UFW、Uncomplicated Fire Wall、そしてさらに大きな脅威について知りました。
こちらがUFW.log :
Oct 9 04:35:21 server1 kernel: [5110701.311961] [UFW BLOCK] IN=venet0 OUT= MAC= src=175.9.9.9 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=40 ID=53848 DF PROTO=TCP SPT=10651 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0
Oct 9 04:35:24 server1 kernel: [5110704.311558] [UFW BLOCK] IN=venet0 OUT= MAC= src=175.8.8.8 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=40 ID=53849 DF PROTO=TCP SPT=10651 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0
Oct 9 04:35:36 server1 kernel: [5110715.912365] [UFW BLOCK] IN=venet0 OUT= MAC= src=112.7.7.7 DST=192.168.1.1 LEN=40 TOS=0x00 PREC=0x00 TTL=39 ID=32234 PROTO=TCP SPT=60061 DPT=23 WINDOW=16244 RES=0x00 SYN URGP=0
Oct 9 04:35:46 server1 kernel: [5110726.213736] [UFW BLOCK] IN=venet0 OUT= MAC= src=67.6.6.6 DST=192.168.1.1 LEN=44 TOS=0x00 PREC=0x40 TTL=239 ID=7084 PROTO=TCP SPT=57510 DPT=23 WINDOW=14600 RES=0x00 SYN URGP=0
Oct 9 04:37:02 server1 kernel: [5110802.146865] [UFW BLOCK] IN=venet0 OUT= MAC= src=139.5.5.5 DST=192.168.1.1 LEN=40 TOS=0x00 PREC=0x00 TTL=39 ID=33753 PROTO=TCP SPT=6885 DPT=23 WINDOW=9693 RES=0x00 SYN URGP=0
Oct 9 04:37:53 server1 kernel: [5110853.056320] [UFW BLOCK] IN=venet0 OUT= MAC= src=87.4.4.4 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=61204 DF PROTO=TCP SPT=47013 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0
Oct 9 04:37:56 server1 kernel: [5110856.056659] [UFW BLOCK] IN=venet0 OUT= MAC= src=87.3.3.3 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=61205 DF PROTO=TCP SPT=47013 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0
Oct 9 04:38:02 server1 kernel: [5110862.056195] [UFW BLOCK] IN=venet0 OUT= MAC= src=87.2.2.2 DST=192.168.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=61206 DF PROTO=TCP SPT=47013 DPT=23 WINDOW=5808 RES=0x00 SYN URGP=0
Oct 9 04:39:04 server1 kernel: [5110924.610656] [UFW BLOCK] IN=venet0 OUT= MAC= src=175.1.1.1 DST=192.168.1.1 LEN=40 TOS=0x00 PREC=0x00 TTL=43 ID=16953 PROTO=TCP SPT=35941 DPT=23 WINDOW=41293 RES=0x00 SYN URGP=0
UFW BLOCK 行の各行は、サーバーに対する別の種類の攻撃、つまり誤って設定されたポートを探すことを表しています。 これらの行はすべて DPT=23 をテストしています。テルネット、古代のプロトコル。 これが少なくとも 1 分に 1 回発生していることに注意してください。 一日中。 毎日。
データをデータテーブルにロードします
各ファイルの形式は異なり、日付には現在の年が含まれていない場合があり、フィールドには名前 = 値が設定されているか、単に位置が指定されている場合があります。 すべてのファイルを Linux サーバーから Windows マシンに移動し、FilesInDirectory を使用して JSL 内のファイル名のリストを取得しました。 次に、3 種類のファイルを効率的に解析するための一連のパターンを作成しました。 データ テーブルの列は、各ファイルからキャプチャしたいデータを表すために選択されました。
Columns in tableColumns in tableColumns in tableColumns in tableテーブル内の列
ipaddr32 は、1.2.3.4 をグラフの連続軸の 1<<24 + 2<<16 + 3<<8 + 4 に変換する数式列です。 ipname は後で調べられます。 kind2 は、さまざまなユーザー ID をすべて「ログイン」だけに集約する式です。
path = "f:/logs/";
list = Files In Directory( path, "recursive" );
global:dt = New Table( "logData",
New Column( "datetime", Numeric, "Continuous", Format( "ddMonyyyy:h:m:s", 18, 0 ), Input Format( "ddMonyyyy:h:m:s", 0 )),
New Column( "ipaddr", Character, "Nominal" ),
New Column( "kind", Character, "Nominal" ),
New Column( "detail1", Character, "Nominal" ),
New Column( "detail2", Character, "Nominal" )
);
効率的な解析
大きなファイルの処理速度を最大限に高めるには、JSL 解析を 1 回の PatMatch 関数呼び出しで実行する必要があります。 PatMatch への各呼び出しにはある程度のオーバーヘッドがあり、複数の呼び出しを行っている場合は、おそらく入力文字列も途中で切り刻まれ、さらにオーバーヘッドが追加されます。 そこで、ログ ファイルごとに 1 つの PatMatch を使用して実行してみましょう。 キーは、PatRepeat と PatTest という 2 つのパターン マッチング関数です。 PatRepeat を使用すると、ファイル内の各行でパターンを繰り返すことができます。 PatTest は、一致中にパターンに JSL を実行させます (名目上は条件をテストするためですが、テスト結果は常に「true」になります)。 いくつかのヘルパー パターン、そして良いものへ...
ipPattern = patRegex("(\d{1,3}[-.]\d{1,3}[-.]\d{1,3}[-.]\d{1,3})|([a-fA-F0-9:]+)"); // approximation
ipMonth=patRegex("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec");
datePattern1 = "[" + patregex("\d{2}")>>day + "/" + ipMonth>>month + "/" + patregex("\d{4}")>>year + ":" + patregex("\d\d:\d\d:\d\d")>>time + patregex(" [-+]\d{4}") +"]"; // [18/Sep/2016:06:14:25 -0400]
datePattern2 = ipMonth>>month + patspan(" ") + patregex("\d{1,2}")>>day + " " + patregex("\d\d:\d\d:\d\d")>>time + pattest(year="2016";1); //vs Oct 16 04:54:31 the unknown year is 2016 for these logs
quote = "\!"";
quotepattern = quote + patrepeat(patbreak(quote||"\") +(("\"+(quote|""))|"")) + quote; // allows \" escaped embedded quotation marks
2 つの日付パターンは 2 つの日付形式と一致します。 >> 演算子は、左側の一致したテキストを右側の変数に入れます。 PatTest(year="2016";1) は、年に 2016 を割り当てた後、常に true を返します。これは、明示的な年が指定されていないログ ファイル用です。 パターンと正規表現を組み合わせて使用して、ますます大きなパターンを構築します。 Apacheのaccess.logパターンは次のとおりです。
apachePat = ipPattern>>ip+" "+patbreak(" ")+" "+patbreak(" ")+" "
+datePattern1+" "
+quotePattern>>request+" "
+patbreak(" ")>>code+" "
+patbreak(" ")>>length+" "+patbreak(" ")+" "
+(quotePattern|patbreak("\!n\!r"))>>browser
+pattest(
dt1<<ADDROWS></ADDROWS>
これが何をするのかを access.log の行と比較してください。
192.168.1.1 - - [30/Aug/2016:08:51:52 -0400] "GET /tmUnblock.cgi HTTP/1.0" 404 495 "-" "Wget(linux)"
最後に pattest(...) があることに注目してください。テーブル dt1 に行を追加し、解析されたばかりの値を列に追加します。
UFW および認証パターンもあります。 ファイルを解析する関数は次のとおりです。
global:skipPattern = (patbreak("\!n\!r") + patlen(1))>> unknown + pattest(show(filename,unknown);stop();1);
global:whitespace = patregex("\s*");
parser = Function( {filename, pattern, dt1}, {Default Local},
txt = Load Text File( filename );
rc = Pat Match( //
txt, //
Pat Pos( 0 ) //
+ Pat Repeat( ((global:whitespace + pattern + global:whitespace) | global:skipPattern) + Pat Fence() ) //
+ Pat R Pos( 0 ) //
); //
);
この関数は、filename からログをロードし、パターン パラメーターを使用してログを解析し、結果を dt1 に保存します。 PatMatch 関数は、認識されない行をスキップできる代替パターンを構築します。 PatFence() は、大きなファイルに対するもう 1 つの最適化です。これは、「ここまでできたら、バックアップして別のことを試す意味はありません」を意味し、一致を高速化し、必要なメモリを削減することができます。 最後に、関数のドライバーは次のとおりです。
While( N Items( file = Remove From( list, 1 ) ) == 1, //
file = file[1];//
If(//
!Is Missing( Regex( file, "ssl_access.log" ) ), //
parser( path || file, apachePat, global:dt );//
, // else
!Is Missing( Regex( file, "other_vhosts_access.log" ) ), //
0//parser( path || file, apachePat, global:dt );//
, // else
!Is Missing( Regex( file, "access.log" ) ), //
parser( path || file, apachePat, global:dt );//
, // else
!Is Missing( Regex( file, "ufw.log" ) ),
parser( path || file, ufwPat, global:dt );//
, // else
!Is Missing( Regex( file, "auth.log" ) ), //
parser( path || file, authPat, global:dt );//
);//
);//
興味がある点
Raspberry PI コンピュータは、ユーザー名 PI を使用した多くの攻撃を引き付けているようです。 PHP スクリプトはかなりの頻度で誤って設定されているはずです。特定の PHP "admin" ファイルには多くのチェックが行われます。 そして、弱点のある開いているポートを見つけることは非常に価値があるに違いありません。攻撃の大部分はポートのテストです。 Web サーバーを管理していて、fail2ban とファイアウォール ルール (UFW など) を使用していない場合は、それらのインストールと構成を検討する必要があります。 1 秒あたり複数回の試行を許可するのではなく、1 日に数回の試行を許可することで、ブルート フォース攻撃の速度を下げることができます。
Dashboard view of web trafficDashboard view of web trafficDashboard view of web trafficDashboard view of web trafficWeb トラフィックのダッシュボード ビュー