LogParser ที่แนะนำสำหรับการตรวจสอบ IIS หรือไม่


86

เมื่อ Stack Overflow เติบโตขึ้นเราจะเริ่มดูบันทึก IIS ของเราอย่างใกล้ชิดเพื่อระบุปัญหาไคลเอนต์ HTTP - สิ่งต่าง ๆ เช่นแมงมุมเว็บสไปเดอร์ผู้ใช้ที่มีหน้าเว็บขนาดใหญ่ตั้งค่าให้รีเฟรชทุกวินาที ผู้ใช้ที่พยายามเพิ่มหน้าเว็บนับเป็นพันล้านครั้งเป็นต้น

ฉันได้คำค้นหาLogParserสองสามข้อที่ช่วยให้เราระบุความผิดปกติและความผิดปกติส่วนใหญ่เมื่อชี้ไปที่ไฟล์บันทึก IIS

การใช้แบนด์วิดท์สูงสุดตาม URL

SELECT top 50 DISTINCT 
SUBSTR(TO_LOWERCASE(cs-uri-stem), 0, 55) AS Url, 
Count(*) AS Hits, 
AVG(sc-bytes) AS AvgBytes, 
SUM(sc-bytes) as ServedBytes 
FROM {filename} 
GROUP BY Url 
HAVING Hits >= 20 
ORDER BY ServedBytes DESC
เสิร์ฟ URL avgbyte
------------------------------------------------- - ---- ------- -------
/favicon.ico 16774 522 8756028
/content/img/search.png 15342 446 6842532

ความนิยมสูงสุดตาม URL

SELECT TOP 100 
cs-uri-stem as Url, 
COUNT(cs-uri-stem) AS Hits 
FROM {filename} 
GROUP BY cs-uri-stem 
ORDER BY COUNT(cs-uri-stem) DESC
URL ยอดนิยม
------------------------------------------------- - ----
/content/img/sf/vote-arrow-down.png 14076
/content/img/sf/vote-arrow-up.png 14018

แบนด์วิดท์ยอดนิยมและความนิยมโดย IP / ตัวแทนผู้ใช้

SELECT TOP 30
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
Sum(sc-bytes) AS TotalBytes, 
Count(*) as Hits 
FROM {filename} 
group by c-ip, cs(User-Agent) 
ORDER BY TotalBytes desc
โทเค็นผู้ใช้ - เอเจนต์ไคลเอ็นต์ totbytes
------------- ------------------------------------- -------- --------- -----
66.249.68.47 Mozilla / 5.0 + (ใช้งานร่วมกันได้; + Googlebot / 2.1; 135131089 16640
194.90.190.41 omgilibot / 0.3 ++ omgili.com 133805857 6447

แบนด์วิดท์สูงสุดต่อชั่วโมงโดย IP / User-Agent

SELECT TOP 30
TO_STRING(time, 'h') as Hour, 
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
Sum(sc-bytes) AS TotalBytes, 
count(*) as Hits 
FROM {filename} 
group by c-ip, cs(User-Agent), hour 
ORDER BY sum(sc-bytes) desc
โทเค็นของผู้ใช้ - เอเจนต์ totbytes ของไคลเอ็นต์ชั่วโมง
- ------------- ----------------------------------- ------ -------- ----
9 194.90.190.41 omgilibot / 0.3 ++ omgili.com 30634860 ​​1549
10 194.90.190.41 omgilibot / 0.3 ++ omgili.com 29070370 1503

ความนิยมสูงสุดต่อชั่วโมงโดย IP / User-Agent

SELECT TOP 30
TO_STRING(time, 'h') as Hour, 
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
count(*) as Hits, 
Sum(sc-bytes) AS TotalBytes 
FROM {filename} 
group by c-ip, cs(User-Agent), hour 
ORDER BY Hits desc
ผู้ใช้ - เอเจนต์ hr ของผู้ใช้ยอดฮิตของผู้ใช้โทบี้
- ------------- ----------------------------------- ------ ---- --------
10 194.90.190.41 omgilibot / 0.3 ++ omgili.com 1503 29070370
12 66.249.68.47 Mozilla / 5.0 + (ใช้งานร่วมกันได้; + Googlebot / 2.1 1363 13186302

แน่นอน {filename} จะเป็นพา ธ ไปยังไฟล์บันทึก IIS เช่น

c:\working\sologs\u_ex090708.log

ฉันทำการค้นหาเว็บเป็นจำนวนมากเพื่อค้นหาข้อความค้นหา IIS LogParser ที่ดีและพบว่ามีค่าเล็กน้อย 5 สิ่งเหล่านี้ได้ช่วยเราอย่างมากในการระบุลูกค้าที่มีปัญหาร้ายแรง แต่ฉันสงสัยว่า - เราขาดอะไรไป

มีวิธีอื่นใดอีกในการแบ่งและหั่นบันทึก IIS (โดยเฉพาะอย่างยิ่งกับแบบสอบถาม LogParser ) เพื่อขุดหาความผิดปกติทางสถิติ คุณมีการสืบค้น IIS LogParser ที่ดีที่คุณรันบนเซิร์ฟเวอร์ของคุณหรือไม่?


5
อ้างอิงโดยblog.stackoverflow.com/2009/07/podcast-63
Brad Gilbert

ในแบบสอบถามการใช้งานแบนด์วิดธ์สูงสุดมีคำหลักที่แตกต่างกัน มันดีสำหรับอะไร?
Jakub Šturc

คำตอบ:


19

ตัวบ่งชี้ที่ดีสำหรับการแฮ็คกิจกรรมหรือการโจมตีอื่น ๆ คือจำนวนข้อผิดพลาดต่อชั่วโมง สคริปต์ต่อไปนี้จะคืนวันที่และเวลาที่ส่งคืนรหัสข้อผิดพลาดมากกว่า 25รายการ ปรับค่าตามปริมาณการรับส่งข้อมูลในเว็บไซต์ (และคุณภาพของแอปพลิเคชันบนเว็บของคุณ ;-))

SELECT date as Date, QUANTIZE(time, 3600) AS Hour, 
       sc-status as Status, count(*) AS ErrorCount
FROM   {filename} 
WHERE  sc-status >= 400 
GROUP BY date, hour, sc-status 
HAVING ErrorCount > 25
ORDER BY ErrorCount DESC

ผลลัพธ์อาจเป็นดังนี้:

วันที่สถานะชั่วโมง ErrorCount
---------- -------- ------ ------
2009-07-24 18:00:00 404 187
2009-07-17 13:00:00 500 99
2009-07-21 21:00:00 404 80
2009-07-03 04:00:00 404 45
...

ข้อความค้นหาถัดไปจะตรวจพบจำนวนการเข้าชมสูงผิดปกติใน URL เดียวจากที่อยู่ IPเดียว ในตัวอย่างนี้ฉันเลือก 500 แต่คุณอาจต้องเปลี่ยนการค้นหาสำหรับกรณีขอบ (ยกเว้นที่อยู่ IP ของ Google London เป็นตัวอย่าง ;-).)

SELECT DISTINCT date AS Date, cs-uri-stem AS URL,
      c-ip AS IPAddress, Count(*) AS Hits
FROM  {filename}
GROUP BY date, c-ip, cs-uri-stem
HAVING Hits > 500
ORDER BY Hits Desc
วันที่ URL ที่อยู่ IP ที่อยู่ฮิต
---------- ----------------------------------- ----- ---------- ----
2009-07-24 /Login.aspx 111.222.111.222 1889
2009-07-12 /AccountUpdate.aspx 11.22.33.44 973
2009-07-19 /Login.aspx 123.231.132.123 821
2009-07-21 /Admin.aspx 44.55.66.77 571
...

แบบสอบถามที่สองที่เราทำแล้ว - บันทึกการจัดกลุ่มในแบบสอบถามหลายแห่ง โดย IP และตัวแทนผู้ใช้นี่คือสิ่งที่ดีที่สุดของทั้งสองโลกเนื่องจากหากตัวแทนผู้ใช้เป็นโมฆะมันก็เหมือนกับ IP และหากไม่ใช่นั่นคือข้อมูลเพิ่มเติม
เจฟฟ์แอด

ตกลง Jeff การเพิ่ม user-agent เข้าท่า ขออภัยชุดค่าผสมของหน่วยความจำระยะเวลาสั้นและความผิดปกติของ Attention :-)
splattne

แทนที่havingด้วยLimit nอาจทำให้เป็นวิธีที่ดีในการปรับแต่งแบบสอบถามแรก
BCS

6

สิ่งหนึ่งที่คุณอาจจะพิจารณาการกรองจราจรที่ถูกต้อง (และขยายขอบเขตของคุณ) ที่จะช่วยให้cs(Cookie)ในบันทึก IIS ของคุณเพิ่มบิตของรหัสที่ตั้งค่าคุกกี้ขนาดเล็กโดยใช้ javascript WHERE cs(Cookie)=''และเพิ่ม

เนื่องจากโค้ดเล็ก ๆ น้อย ๆ ของคุณผู้ใช้ทุกคนควรมีคุกกี้เว้นแต่ว่าพวกเขาจะปิดการใช้งานคุกกี้ด้วยตนเอง (ซึ่งคนส่วนน้อยอาจทำ) หรือเว้นแต่ผู้ใช้นั้นเป็นบอทที่ไม่รองรับ Javascript (เช่น wget, httpclient) ฯลฯ ไม่สนับสนุน Javascript)

ฉันสงสัยว่าถ้าผู้ใช้มีกิจกรรมจำนวนมาก แต่พวกเขายอมรับคุกกี้และเปิดใช้งานจาวาสคริปต์พวกเขามีแนวโน้มที่จะเป็นผู้ใช้ที่ถูกกฎหมายในขณะที่ถ้าคุณพบผู้ใช้ที่มีกิจกรรมจำนวนมาก แต่ไม่มีการสนับสนุนคุกกี้ / จาวาสคริปต์ พวกเขามีแนวโน้มที่จะเป็น ธ ปท.


6

ขออภัยไม่สามารถแสดงความคิดเห็นดังนั้นฉันถูกบังคับให้ตอบ

มีข้อผิดพลาดเล็กน้อยกับข้อความค้นหา 'การใช้แบนด์วิดท์สูงสุดตาม URL' ในขณะที่เวลาส่วนใหญ่คุณจะสามารถรับคำขอของคุณสำหรับหน้าเว็บและคูณด้วยขนาดไฟล์ในกรณีนี้เนื่องจากคุณไม่ได้สนใจพารามิเตอร์การค้นหาใด ๆ คุณจะต้องทำงานเล็กน้อย - ตัวเลขที่ไม่ถูกต้องมาก

สำหรับค่าที่ถูกต้องมากขึ้นเพียงทำSUM (ไบต์ sc)แทนของมัล (ฮิต AvgBytes) เป็น ServedBytes


6


4

คุณอาจต้องการค้นหาคำขอที่ยาวที่สุดของคุณ (ลำต้นและ / หรือคิวรี) และคำขอที่ไบต์ส่วนใหญ่ได้รับจากเซิร์ฟเวอร์ ฉันยังลองใช้กลุ่มที่ไบต์ได้รับและ IP เพื่อให้คุณสามารถดูว่ารูปแบบคำขอเฉพาะที่น่าจะเกิดขึ้นซ้ำโดย IP เดียวหรือไม่

SELECT TOP 30
cs-uri-stem,
cs-uri-query,
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
cs-bytes,
c-ip,
FROM {filename} 
WHERE cs-uri-stem != '/search'
ORDER BY LEN(cs-uri-query) desc

SELECT TOP 30
COUNT(*) AS Hits
cs-uri-stem,
cs-uri-query,
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
cs-bytes,
c-ip,
FROM {filename} 
GROUP BY c-ip, cs(User-Agent), cs-bytes 
ORDER BY Hits desc

ฉันจะนับจำนวนการเข้าชมของทั้งกลุ่มที่ขอ IP เป็นเวลาหนึ่งชั่วโมงและนาทีของวันหรือจัดกลุ่ม IP ที่ขอด้วยนาทีในชั่วโมงเพื่อดูว่ามีการเข้าชมที่เกิดขึ้นเป็นประจำซึ่งอาจเป็นสคริปต์หรือไม่ นี่จะเป็นการปรับเปลี่ยนเล็กน้อยในสคริปต์ยอดนิยมทุกชั่วโมง

ในเว็บไซต์ใด ๆ ที่ไม่ใช่การเขียนโปรแกรม, การค้นหาบันทึกของคุณสำหรับคำหลัก SQL ยังเป็นความคิดที่ดีสิ่งที่ชอบSELECT, UPDATE, DROP, DELETEและแปลกประหลาดอื่น ๆ เช่นFROM sys.tables, Oring ที่ร่วมกันและการนับโดย IP จะดูเหมือนมีประโยชน์ สำหรับไซต์ส่วนใหญ่รวมถึงสิ่งเหล่านี้คำต่างๆแทบจะไม่เคยปรากฏในส่วนการสืบค้นของ URI แต่ที่นี่พวกเขาอาจปรากฏขึ้นอย่างถูกต้องในต้นกำเนิด URI และส่วนข้อมูล ฉันชอบที่จะย้อนกลับ IP ของการเข้าชมใด ๆ เพียงเพื่อดูว่าใครกำลังเรียกใช้สคริปต์ที่สร้างไว้ล่วงหน้า ฉันมักจะเห็น.ru, .br, และ.cz .cnฉันไม่ได้ตั้งใจจะตัดสิน แต่ฉันมักจะบล็อกพวกเขาต่อจากนี้ไป ในการป้องกันของพวกเขาเหล่านั้นจะถูกประเทศที่มีประชากรส่วนใหญ่โดยทั่วไป แต่ฉันป่านนี้ฉันไม่เห็นมากของการพูด.in, .fr, .usหรือ.auทำแบบเดียวกัน

SELECT TOP 30
c-ip as Client, 
SUBSTR(cs(User-Agent), 0, 70) as Agent, 
cs-uri-stem,
LOWER(cs-uri-query) AS q,
count(*) as Hits,
SUM(sc-bytes) AS BytesSent,
SUM(cs-bytes) AS BytesRecv
FROM {filename} 
WHERE q like '%select%' OR q like '%sys.tables%' OR etc... 
GROUP BY c-ip, cs(User-Agent) 
ORDER BY Hits desc

ป.ล. ฉันไม่สามารถตรวจสอบได้ว่าแบบสอบถามเหล่านี้จะทำงานอย่างถูกต้องจริงหรือไม่ โปรดแก้ไขได้อย่างอิสระหากต้องการแก้ไข


3

สิ่งเหล่านี้ล้วนอยู่ที่นี่ (ซึ่งเป็นแนวทางที่ยอดเยี่ยมสำหรับการแยกวิเคราะห์ IIS logfiles ของคุณ btw):

20 ไฟล์ใหม่ล่าสุดบนเว็บไซต์ของคุณ

logparser -i: FS "เลือก 20 อันดับแรกของพา ธ CreationTime จาก c: \ inetpub \ wwwroot *. * เรียงตาม CreationTime DESC" -rtp: -1

Path                                                        CreationTime
----------------------------------------------------------- ------------------
c:\inetpub\wwwroot\Default.asp                              6/22/2003 6:00:01
c:\inetpub\wwwroot\About.asp                                6/22/2003 6:00:00
c:\inetpub\wwwroot\global.asa                               6/22/2003 6:00:00
c:\inetpub\wwwroot\Products.asp                             6/22/2003 6:00:00

20 ไฟล์ที่แก้ไขล่าสุด

logparser -i: FS "เลือก 20 อันดับแรกของพา ธ , LastWriteTime จาก c: \ inetpub \ wwwroot *. * เรียงตาม LastWriteTime DESC" -rtp: -1

Path                                                        LastWriteTime
----------------------------------------------------------- ------------------
c:\inetpub\wwwroot\Default.asp                              6/22/2003 14:00:01
c:\inetpub\wwwroot\About.asp                                6/22/2003 14:00:00
c:\inetpub\wwwroot\global.asa                               6/22/2003 6:00:00
c:\inetpub\wwwroot\Products.asp                             6/22/2003 6:00:00

ไฟล์ที่ส่งผลให้มีรหัสสถานะ 200 รหัส (ในกรณีที่โทรจันถูกลบ)

logparser "เลือก DISTINCT TO_LOWERCASE ที่เลือก (cs-uri-stem) AS URL, Count ( ) ตามที่พบจากอดีต . log WHERE sc-status = 200 กลุ่มตาม URL เรียงตาม URL" -rtp: -1

URL                                      Hits
---------------------------------------- -----
/About.asp                               122
/Default.asp                             9823
/downloads/setup.exe                     701
/files.zip                               1
/Products.asp                            8341
/robots.txt                              2830

แสดงที่อยู่ IP ใด ๆ ที่เข้าชมหน้าเดียวกันมากกว่า 50 ครั้งในหนึ่งวัน

logparser "เลือก DISTINCT วันที่, cs-uri-stem, c-ip, Count ( ) ตามที่พบจากกลุ่มอดีต . log GROUP ตามวันที่, c-ip, cs-uri-stem HAVING ฮิต> 50 ORDER BY Hits Desc" -rtp: -1

date       cs-uri-stem                         c-ip            Hits
---------- ----------------------------------- --------------- ----
2003-05-19 /Products.asp                       203.195.18.24   281
2003-06-22 /Products.asp                       210.230.200.54  98
2003-06-05 /Products.asp                       203.195.18.24   91
2003-05-07 /Default.asp                        198.132.116.174 74

ฉันดูสิ่งเหล่านั้นแล้วและไม่พบว่ามีประโยชน์เป็นพิเศษ พวกเขาส่วนใหญ่ "หาการประนีประนอม" และไม่ได้จริงๆเป้าหมายของเรา (เรายังไม่ได้รับการโจมตี)
เจฟฟ์แอด

0

ฉันไม่รู้ว่าจะทำอย่างไรกับ LogParser แต่มองหาสตริงของคำขอสำหรับสิ่งต่าง ๆ เช่น "phpMyAdmin" (หรือ vunerablities ทั่วไปอื่น ๆ ) ที่ได้รับ 404 อาจเป็นวิธีที่ดีในการระบุการโจมตีแบบสคริปต์


เป้าหมายไม่ใช่เพื่อค้นหาการโจมตีแบบสคริปต์ของลูกค้า แต่ไม่รับผิดชอบ / มีปัญหาเกี่ยวกับแบนด์วิดท์และปริมาณการใช้งาน
เจฟฟ์แอด

2
ฉันจะบอกลูกค้าที่พยายามจะทำร้ายฉันเป็นลูกค้าที่มีปัญหาและฉันไม่อยากให้ลูกค้าใช้แบนด์วิดท์ของฉัน
BCS
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.