IIS 모니터링을위한 권장 LogParser 쿼리?


86

Stack Overflow가 커짐에 따라 IIS 로그를 면밀히 검토하여 문제가있는 HTTP 클라이언트 ( 불량 웹 스파이더 , 매 초마다 새로 고침을 설정하는 큰 페이지를 가진 사용자, 잘못 작성된 일회성 웹 스크레이퍼, 트릭) 와 같은 HTTP 클라이언트를 식별하기 시작했습니다. 페이지를 늘리려 고하는 사용자는 수 천 회 등을 계산합니다.

IIS 로그 파일을 가리킬 때 대부분의 이상과 이상을 식별하는 데 도움 이되는 몇 가지 LogParser 쿼리를 생각해 냈습니다 .

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 조회수 평균 제공
-------------------------------------------------- ---- ------- -------
/favicon.ico 16774522 8756028
/content/img/search.png 15342446 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 / 사용자 에이전트 별 시간별 최고 대역폭

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
hr 클라이언트 사용자 에이전트 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 / 사용자 에이전트 별 시간별 인기 조회

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 클라이언트 사용자 에이전트가 totbytes에 도달
-------------- ----------------------------------- ------ ---- --------
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 쿼리가 있습니까?



최고 대역폭 사용 쿼리에는 DISTINCT 키워드가 있습니다. 무엇이 좋은가요?
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

결과는 다음과 같습니다.

날짜 시간 상태 오류 수
---------- -------- ------ ------
2009-07-24 18:00:00 404187
2009-07-17 13:00:00 500 99
2009-07-21 21:00:00 404 80
2009-07-03 04:00:00 404 45
...

다음 쿼리는 하나의 IP 주소에서 단일 URL에서 비정상적으로 많은 히트를 감지합니다 . 이 예에서는 500을 선택했지만 에지 사례에 대한 쿼리를 변경해야 할 수도 있습니다 (예 : Google 런던의 IP 주소 제외 ;-)).

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와 사용자 에이전트의 경우 사용자 에이전트가 null이면 IP와 동일하고 그렇지 않은 경우 더 많은 정보이므로 IP와 사용자 에이전트 모두에서 가장 좋습니다.
Jeff Atwood

제프, 사용자 에이전트를 추가하는 것이 좋습니다. 죄송합니다. 잘못된 단기 기억과 주의력 결핍 장애의 조합입니다. :-)
splattne

로 대체하면 첫 번째 검색어를 조정하는 좋은 방법 havingLimit n될 수 있습니다.
BCS

6

합법적 인 트래픽을 걸러 내고 범위를 넓히려면 고려할 수있는 한 가지는 cs(Cookie)IIS 로그에서 활성화 하고, 자바 스크립트를 사용하여 작은 쿠키를 설정하는 코드를 추가하고, 추가하는 것 WHERE cs(Cookie)=''입니다.

작은 코드로 인해 모든 사용자가 수동으로 쿠키를 비활성화하지 않거나 (소수의 사람들이 할 수있는) 쿠키를 사용하지 않거나 실제로 자바 스크립트를 지원하지 않는 봇이 아닌 경우 (예 : wget, httpclient) 등은 자바 스크립트를 지원하지 않습니다).

사용자가 많은 양의 활동을 가지고 있지만 쿠키를 허용하고 자바 스크립트를 활성화 한 경우 합법적 인 사용자가 될 가능성이 높지만 활동량이 많지만 쿠키 / 자바 스크립트를 지원하지 않는 사용자를 찾으면 봇일 가능성이 높습니다.


6

죄송합니다, 아직 댓글을 달 수 없으므로 답변을 드리겠습니다.

'URL 별 최고 대역폭 사용'쿼리에 사소한 버그가 있습니다. 대부분의 경우 페이지 요청을 받아 파일 크기를 곱해도 괜찮지 만이 경우 쿼리 매개 변수에주의를 기울이지 않기 때문에 약간의 결과가 발생할 수 있습니다. -정확하지 않은 숫자.

보다 정확한 값을 얻으 려면 MUL (Hits, AvgBytes) 대신 SUM (sc-bytes )을 ServedBytes로 수행하십시오 .




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

또한 하루 1 시간 및 분 동안 IP를 요청하는 그룹에 대한 조회수를 계산하거나 스크립트 일 수있는 정기적 인 반복 방문이 있는지 확인하기 위해 요청하는 IP를 1 분 단위로 그룹화합니다. 이것은 시간별 적중 스크립트의 작은 수정입니다.

비 프로그래밍 사이트에서 SQL 키워드에 대한 로그를 검색하는 것도 좋은 생각, 같은 것들이다 SELECT, UPDATE, DROP, DELETE등의 다른 기이 FROM sys.tablesOR 작업을 함께하고 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 로그 파일을 파싱하는 훌륭한 가이드 인 btw).

웹 사이트에있는 20 개의 최신 파일

logparser -i : FS "c : \ inetpub \ wwwroot *에서 TOP 20 경로, CreationTime 선택. * 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 "c : \ inetpub \ wwwroot *에서 TOP 20 경로, LastWriteTime을 선택하십시오. * 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 "SELECT DISTINCT TO_LOWERCASE (cs-uri-stem) AS URL, Count ( ) AS가 ex .log 에서 적중합니다. sc-status = 200 GROUP BY URL ORDER BY URL"-rtp : -1

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

하루에 같은 페이지에 50 번 이상 히트 한 IP 주소 표시

logparser "날짜를 선택하십시오. 날짜, cs-uri-stem, c-ip, Count ( ) AS 날짜 별 c.ip, cs-uri-stem을 기준으로 그룹화하십시오. -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

나는 그것들을 보았고 특히 도움이되지 않았다. 그것들은 대부분 "타협을 찾는"것이며 우리의 목표는 아닙니다 (우리는 타협하지 않았습니다)
Jeff Atwood

0

LogParser로 어떻게 처리해야할지 모르겠지만 "phpMyAdmin"(또는 다른 일반적인 vunerablities) 같은 것들에 대한 요청 문자열을 찾는 것이 스크립트 공격을 식별하는 좋은 방법 일 수 있습니다.


목표는 해당 유형의 스크립트 공격을 찾는 것이 아니라 대역폭 및 트래픽과 관련된 무책임하고 문제가있는 클라이언트를 찾는 것입니다.
Jeff Atwood

2
나는 나를 아프게하려고하는 클라이언트는 문제가있는 클라이언트라고 말하고 오히려 내 대역폭을 사용하지 않을 것입니다.
BCS
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.