> プログラムのダウンロード(LogFile2のページです)
プログラムのダウンロード(LogFile2のページです)
ダウンロードする前に、とても大事な2つの事を確認してください。 (ダウロード) 2013年9月17日、バグは必ずあります。一番下のバグ報告も目を通してください。
1.まず、このプログラムは、64ビットWindows版です。アパッチのログと言うとても大きなデータをパソコン上のメモリで処理します。その為、大きなメモリ空間を必要とした為、64ビットでのプログラムになりました。32ビットのWindowsでは、動作しません。
2.アパッチのログは、ディフォルトの構成を想定してプログラムは、組まれています。具体的には、一つのレコードが、
66.249.74.190 - - [01/Aug/2013:00:02:52 +0900] "GET /gazoup/index.php?1375282434 HTTP/1.1" 200 32215 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
この様な物になります。自分のログが合致するのかは、エラー無く、読み込めれば、大丈夫でしょう。エラーが出る場合は、形式が違う可能性が有ります。諦めましょう。

次に少し大事な事
1.このプログラムは、Visual Baisc 2010 Express で書きました。その為、プログラムは、Windows .NET Framework上で動作します。ダウンロードファイルを解凍すると幾つかのファイルが出来ます。プログラムに必要な構成は、下記の通りです。
CountryListAll.def IPの国別リスト
logfile2.exe プログラム本体
myping.exe Pingを実行するプログラム(32ビット)
sample.def ファイルオペレーション用のサンプル
この他に、必要なプログラムとして、Whois用のプログラムをCodeZineからダウンロードしてください。ダウンロードされた2つの(WhoisClient.exe、whois.conf)を同じ場所に配置してください。
2.インストールなどの手続きは必要ありません。レジストリーも汚しません。単純に条件に従ってファイルを操作します。但し、自分のWan側アドレスを検出するために、http://ohayou.jp/ipv4.phpを起動時にアクセスします。また、pingコマンド実行時には、pingを外部に出します。Spam_Checkでは、「Plustar」さんのページにある禁止アドレスを取りに行きます。そんな所です。
3.プログラムは、全部のコードを確認していません。バグが残っていると思います。特にバッチオペレーションでの処理につては、これから確認です。バグが見つかれば、順次直して行く積りでいます。気が付いた方は、logfile2@ohayou.jp にメールで教えて頂ければ、有りがたく思います。但し、メールの返事は、期待しないでください。

<バグ報告>
2013/9/9 Local Lanのアドレスに間違いが有りました(CountryListAll.def)。範囲を大きく取りすぎました。現在は、訂正版に変わっています。
2013/9/13 攻撃者がLogFile2を利用できない様に、起動を止めるルーチンを追加
2013/9/14 Req_header でリストした内容をすぐにブラウザーで確認できるように、Helpメニューにドメインの入力を追加(テキストボックスの内容を保持)、次にリストを右クリックして、ブラウザを起動できる様に機能を追加。
2013/9/15 iLogScannerを模して、Web Attackと言うメニューを追加しました。それと、Helpには、本家のホームページへのリックを追加しました。
2013/9/17 iLogScannerの結果をhtmlページに反映するための小道具を追加
 
> 画面の説明
画面の説明
画面は、至って簡単。
 
> Spamのアドレスを調べる(使い方の練習)
Spamのアドレスを調べる(使い方の練習)
自分が運営するブログにスパム書き込みが有ったとします。その書き込みIPアドレスを禁止するためにIPアドレスを特定しましょう。

その時間を調べます。

5月29日6時45分ですね。
手順は、
@Select、Date、Monthをクリック。
AHits Month(All)を選択、Excludeボタンをクリック。
B05(May)を選択、Includeボタンをクリック。
CSelect、Date、Dayをクリック。
D同様に、Hits Day(All)を選択して、Excludeボタンをクリック。
E29を選択、Includeボタンをクリック。
F同様に、時間と分を繰り返す。
G今度は、Select、With_Selectをクリック。メニューのタイトルが変わる。
HWith_Select、IP_Adressをクリック。リストに出て来たIPアドレスが、スパム候補です。ここに複数出て来た場合は、より明確にするために、With_Select、Request、Request_Commandから、書き込みのPOSTだけをIncludeしましょう。
結果が出たら、そのIPアドレスをブログ側で書き込み禁止にします。

もう少し、このIPアドレスに関して、調べましょう。
@リスのIPアドレスをクリックします。そうすると、テキストボックスにコピーされます。
ASelect、Reset_Selectで一端選択を解除します。
BGraph、Day(Hits)をクリック。過去の履歴が参照できます。
CSelect、Clear_Listでリストを空にします。まだ、テキストボックスにIPアドレスが残っています。
DTool、Country_Checkをクリックします。そのアドレスの国が、下のメッセージ欄に表示されます。
ETool、Ping(TextBox)をクリックして、生きているIPか、偽装の可能性があるIPか確認しましょう。
FTool、IP's Foot_Printで、そのIPが辿ったページなどを時系列で調べましょう。
などなどが、簡単にできる事です。

更に詳しい使い方、例えば、バッチでの操作などに関しては、順次説明を追加して行きます。ご期待ください。
 
> File メニューの説明
File メニューの説明
メニューの File の解説
Load: Apache のログファイルを読み込みます。
Save: Selectメニューで条件を設定した内容に合致するレコードをログファイル形式で出力します。想定した使い方は、月ごとにログファイルを小分けするなどです。
Save_List: これは、表示されているリストの内容をファイルに保存する。ファイル名は、List.txtになります。もっとも、リストは、BigList.txtと言う名前で、自動的に保存されるので、いらないかも知れない。ある日、このプログラムから突然無くなるかも知れません。
Save_Req_HeaderとSave_URL_List: は、Listでは項目が多くなるので、表示を省略しています。そこで、省略のない形でこれを作っておきました。実際は、使う事は無いですね。現実には、無用でした。
ついでにSave_Req_HeaderとSave_URL_Listを説明すると、Save_Req_Headerは、リクエストされたページですね。そこに含まれる画像なども入ります。Save_URL_Listは、訪問者が、ここに来る前のページが、Save_URL_Listとなります。

プログラムの中身について:
ファイルの読み込みは、
            fileno = FreeFile()
FileOpen(fileno, filename, OpenMode.Input)
i = 0
Do Until EOF(fileno)
recbuff = LineInput(fileno)
i = i + 1
        *****
Loop
FileClose(fileno)
てな感じです。その為、2度読みしています。時間配分は、読み込むだけで、1回目に25%、次に配列に格納と2回目の読み込みで75%ですね。配列変数を定義して、そのこにADDすると早いのですが、その後のSORTで効率が悪いので、こうなりました。

 ちなみに、時間計測でタイマーを多用しました。TextBoxとメニューの間の1mm位の横棒を、SHIFT+右クリックするとタイマーの名残が出ます。

 余談ですが、VB.netのタイマー割り込みは、忙しいと止まりますね。それに割り込みの幅も結構粗い。ちゃんと計測していませんが、多分、最小単位が10数ms位でないかと思います。そこで、単に時計を使いました。従って、マザーボードが違うと表示桁数が変わるかも知れません。私のは、秒以下、7ケタ表示されます。
 
> Select メニューの説明
Select メニューの説明
Select メニュー
IP_Adress: IPアドレスです。クリックすると、ログ内のIPアドレスがリストされます。特定のアドレスの動向を知るために選択するには、@まず、リストの一番上、Allをクリックします。それを、Excludeボタンで除外します。次に、目的のIPアドレスをリストでクリックして、Includeボタンをクリックします。

 他の項目も同じ要領で選択したり除外したりして、使用するデータを絞ります。このアイデアがこのソフトの特徴ですね。データは、完全一致が必要です。例外として注意が必要なのは、Req_HeaderとURLです。こちらは、部分一致です。しかも、半角スペースで複数の条件を入れられます。その条件は、ANDになります。何々と、かつ何々が含まれる物と言う事です。

To_Momory: は、リストの内容をメモリに保存します。目的は、次のMatching_with_Mem.を使うための準備です。メモリの内容と、リストの内容が、いくつ合致したかをレポートします。こんな物を設けた理由は、会員制為のホームページを開設しているとします。そこで疑問は、いったい何人の会員が見てくれたのか。これって難しい質問ですよね。会員の為のパスワードが必要なページが有るとします。そのIPアドレスをある期間貯めて、合致すれば、今日何人くらいの会員が見てくれたのではないかと推察できると考えたからです。

Clear_List: は、単にリストをクリア(消去)するだけです。

Reset_Select: は、Selectを使ってした操作をリセットします。

By_File: は、こうした操作をファイルの内容に従い実行します。バッチ処理ができるようにと思い、コマンドも追加しました。ただし、今の時点では、まったく動作を確認していません。バグが有るでしょう。マニュアルを書く段階になったら、バグ取りを徐々に始めようかと思います。もっとも、バッチ処理は、そもそも必要ないかも知れませんね。

With_Select: は、Selectメニューと入れ替わりに切り替わります。リストに表示される項目が、Includeされた物だけか、全てかの違いが有ります。

Country: 始めは、表示されません。もともとApcheのログにはこの項目が無いからです。IP_Adress表示を行った後に、ToolのCountry_Checkを実行するとメニューに追加されます。IP_Adressの表示は、全てのIPアドレスが表示されている状態でCountry_Checkをした方が良いでしょう。さもないと、表示されているアドレスだけの国がデータベースに加わり、それ以外は追加されません。後からでも可能ですけど。
これは、計算時間を短縮するために、そうしました。

Web Attack: iLogScannerを模して追加しました(2013/9/15)。SQL_Injectionは、どうも検出が難しく、本家より少なくなってしまいました。まだ、研究の余地ありです。OS_Injectionは、同じ項目、同じ数だけ上がるので、良さそうです。Dir_Traversalも同じ物が同じ数だけ上がるので、良さそうです。それと、本家には無いのですが、500文字を超えるReq_headerが有ります。まだ、名前が付いてなくても、何かを企てるための攻撃者からの送信です。それを付け加えました。該当した場合、出力は、IPアドレスにしました。処理スピードは、比べれば、一目瞭然ですが、速いです。

プログラムの中身:
 特徴は、Selectですね。200万レコードとか、あるいはそれ以上の処理をスムーズにこなすために、考えました。プログラム上は、簡単ですが、ビットを立てます。Excludeだとこんな感じですかね。
                For i = 1 To dt_ttl
If LCase(x1) = "all" Then
dt_select(i) = dt_select(i) Or 1
Else
If x1 = dt_ip(i) Then
dt_select(i) = dt_select(i) Or 1
j = j + 1
End If
End If
Next
この中の数字の1が、IPアドレス、2がYear、4だとMonthとかね。Includeは、逆に1が、 And &HFFFFE となる訳ですね。
 
> Graph メニューの説明
Graph メニューの説明
Graphメニュー
実際にクリックしてみれば、少々処理に時間は掛かるものの、分かると思います。要は、時系列でデータをリストに表示します。ここで、時間が掛かると感じたら、思い出してください、Saveメニューで月ごとにログファイルを分割すると良い事を。

次のDraw_Graphで、データをグラフにする。グラフは、何も時系列だけでなく、Selectメニューのデータもグラフにします。リストには、左側に数字データ、タブを挟んで、左側に項目です。グラフは、単にその数字をグラフにしただけです。データー項目の上から描くか、下から描くかで、Draw_Graphは、2つに分かれています。

グラフの棒をクリックすると、リスト内の該当するデータが選択されます。

Visitor: は、時間のスパンですね。再訪問の時間間隔の定義は、いろいろあるようで、結果、適当にいろいろ作りました。デフォルトは、24時間です。おそらく他の分析ソフトで訪問者数をカウントするとこの数より多くなります。時間を短くすると、今度は逆にこちらが多くなります。と言う事で、比較するときは、いろいろ試してください。

IP's(Hits): おまけで作ったとでも言いましょうか、いろいろ試してください。

Back: は、リストを一つ前のリストと今と単に入れ替えるだけの話です。メモするのが面倒だったので、作った。でもそれから、使ってないね。そんな感じです。

プログラムに関して:
グラフのプログラムも、独自の工夫は有りません。他の方が作られた例題をアレンジした程度です。むしろ、サンプルで作る方の技量が高いので、理解するのに苦労しました。

と言う事で、ここでは、リストを作るプログラムを紹介します。こんな風にしました。まず、データーをソートします。ソートは、VBにくっ付いているソートが遅いので、サブルーチンで作ります。ソートしたデータは、重複を消すために、下記のルーチンで処理します。
        ListBox1.Items.Clear()
ListBox1.Items.Add("Hits" & Chr(9) & "Date")
For i = m To 1 Step -1
For j = i To 0 Step -1
If dt_work(i) <> dt_work(j) Then
i = j + 1
Exit For
Else
l = l + 1
End If
Next
ListBox1.Items.Add(l.ToString & Chr(9) & dt_work(i))
l = 0
Next
 
> Tool メニューについて
Tool メニューについて
Tool メニュー
Command: は、コマンドプロンプトの起動です。

Whois: は、Whois.exeを入手して、配置すれば、メニューに追加されます。IPアドレスをクリックすると、クリップボードにコピーされるので、CTRL+Vで貼り付け、Whoisを調べます。入手は、プログラムのダウンロードのページで言及させて頂きました。

IP's:は、IPアドレスを主体に、その活動具合を調べる目的で作りました。たまたま、今日の話なのか、継続的に活動しているIPなのか、簡単に調べるのが目的です。

NotePad: は、処理結果として書き込んだファイルを見るための物です。普段使われているEditorだと良いのでしょうが、それを可能にするには、設定ファイルなどを作らなくてはならないかなとも思い、NotePadで割り切りました。

Spam_Check: は、やはり、プログラムのダウンロードのペイジで言及しました。そこのリストをクリックのたびにダウロードさせて頂いています。

Country_Check: は、IPアドレスの割り当て国リストを読み込んで、該当する国を出します。リストは、付属のCountryListAll.defファイルです。Editorで開けば、中身が見れますので、追加情報が有れば、追加すれば良いと思います。先頭にローカルIPアドレスを入れました。ただし、その範囲を192.168.0.0/23として、欲張りませんでした。事実上これで問題は無いと思います。
 使い方は、TextBoxにIPアドレスが有れば、まずそれを調べます。結果は、下のメッセージリストとファイルに書き出されます。リストにIPアドレスが有れば、それを続いて調べます。一つだけ調べたいときは、リストをクリアするなりして、時間が掛からないようにするのが良いでしょう。
 注意すべきことは、事前にSelect、IPを実行する事です。しかも、何も条件が設定されてない状態で。別の言い方をすれば、すべてのIPアドレスがリストされている時に実行するのが良いでしょう。そうしないと、表示IPアドレスだけが、データベースに追加され、他は、空っぽのままです。
 こんな処理にした訳は、ログの200万レコードを超える量と、国リストの13万4千レコードの突合せ処理です。真面目に突き合わせると数時間の処理となり、ソートを入れて処理をしても、数分の時間になります。それを1秒か2秒ですべてをこなす為の工夫と考えてください。

IP's Foot_Print: は、特定のIPが時系列でどのページを訪ねたか。スパムは、目的を持って行動します。それを探るには、その行動を知る事です。

Ping: は、TextBoxのアドレスと、リストの2つに分けました。Pingのリスト処理は、プログラム本体と分けました。1000とかの数になると、時間が掛かるので、勝手にやっておいてくださいしきです。Pingは、通じれば早いのですが、偽装IPが横行しているのでしょうか、通じないため、ソフトがリトライを繰り返すため、時間が掛かります。

Hits View: は、Req_HeaderやURLの表示で、長くなるのを防ぐ目的で「?」以下を切り捨てる表示と画像などを切り捨てる表示に分けました。

急ぎ、マニュアルならぬ説明を書きました。今後も暇が有れば、説明の内容を丁寧に書き直します。時々見てください。
また、バグも有ると思います。すべてのコードとその結果を確認していません。書きっぱなしと言うやつです。気が付いたら、やさしい口調で教えて頂けるとありがたいと思います。
 
> Apacheからのログの取り出し
Apacheからのログの取り出し
 サーバーが、手に届く所に有れば、面倒は無いんですが、離れている場所と言うのが、相場だと思います。そんな時、ログファイルをFTPで受け取る必要が有ります。こんなツールを手にすると、その頻度は増えるかと思います。このページは、それを簡単にするための説明をします。

 方法は、FTPで見れるホルダーを新設して、そこにBasic認証を掛けて、そこにログファイルをコピーしましょうと言う事です。

1.まず、Basic認証などのパスワードと.htaccessなどのファイルを作ります。作り方は、ネットで調べると、懇切丁寧に書かれていますので、そちらを参照してください。

2.次に、ホルダーを新規作成しましょう。この中に、上記1で作った.htaccessなどを入れる訳ですね。

3.そこに、コピー用のプログラムも入れます。そのプログラム名をlog.phpとでもしましょうか。(サンプル

4.log.phpにアクセスすると、IDとパスワードを求められます。正しく入力するとコピーが開始されます。それをFTPで取り出す段取りとなります。

5.コピーと言う方法を取った為でしょうか、いろいろ試しましたが、結構大きなファイルでも、支障は感じませんでした。
 
> その他
その他
右端の駒: 画像はイメージリストボックスに入れました。始め、タイマーを使ってそれをプログラムのアイコンに入れ替えるプログラムにしました。カッコよく左上のアイコンが動きカッコ良かったのですが、しばらくすると、止まってしまうトラブルに遭遇しました。
 次に、PuctureBoxにイメージリストボックスから画像をタイマーで入れ込みました。場所は、仕方なく、左上となりましたが、今度は止まる事無く動きました。ところが、タスクマネージャで観察すると、このソフトが使うメモリが、だんだんと増える事に気が付きました。いわゆるゴミですね。何時かは、ガバレージコレクションされるのでしょうが、これでは使いたくないと思いました。結局、今は、画像をタイマーで入れ替えるのではなくて、入れた画像をタイマーで、VisibleをTrueに順番に切り替える事で対応しました。メモリのゴミも増えずにめでたしめでたしです。

 
NiconicoPHP