critical log checklist.pdf



-> Linux Directory Structure and Important Files Paths Explained




This cheat sheet presents a checklist for reviewing critical logs when responding to a security incident. It can also be used for routine log review. It was authored by Dr. Anton Chuvakin and Lenny Zeltser. To print, use the one-sheet PDF version; you can also edit the Word version for you own needs. If you like this, take a look at my other IT cheat sheets.

General Approach

  1. Identify which log sources and automated tools you can use during the analysis.
  2. Copy log records to a single location where you will be able to review them.
  3. Minimize “noise” by removing routine, repetitive log entries from view after confirming that they are benign.
  4. Determine whether you can rely on logs’ time stamps; consider time zone differences.
  5. Focus on recent changes, failures, errors, status changes, access and administration events, and other events unusual for your environment.
  6. Go backwards in time from now to reconstruct actions after and before the incident.
  7. Correlate activities across different logs to get a comprehensive picture.
  8. Develop theories about what occurred; explore logs to confirm or disprove them.

Potential Security Log Sources

  • Server and workstation operating system logs
  • Application logs (e.g., web server, database server)
  • Security tool logs (e.g., anti-virus, change detection, intrusion detection/prevention system)
  • Outbound proxy logs and end-user application logs
  • Remember to consider other, non-log sources for security events.

Typical Log Locations

  • Linux OS and core applications: /var/log
  • Windows OS and core applications: Windows Event Log (Security, System, Application)
  • Network devices: usually logged via Syslog; some use proprietary locations and formats

What to Look for on Linux

Successful user login “Accepted password”,“Accepted publickey”,


“session opened”

Failed user login “authentication failure”,“failed password”
User log-off “session closed”
User account change or deletion “password changed”,“new user”,


“delete user”

Sudo actions “sudo: … COMMAND=…”“FAILED su”
Service failure “failed” or “failure”


What to Look for on Windows

Event IDs are listed below for Windows 2000/XP. For Vista/7 security event ID, add 4096 to the event ID.
Most of the events below are in the Security log; many are only logged on the domain controller.
User logon/logoff events Successful logon 528, 540; failed logon 529-537, 539; logoff 538, 551, etc
User account changes Created 624; enabled 626; changed 642; disabled 629; deleted 630
Password changes To self: 628; to others: 627
Service started or stopped 7035, 7036, etc.
Object access denied (if auditing enabled) 560, 567, etc

What to Look for on Network Devices

Look at both inbound and outbound activities.
Examples below show log excerpts from Cisco ASA logs; other devices have similar functionality.
Traffic allowed on firewall “Built … connection”,“access-list … permitted”
Traffic blocked on firewall “access-list … denied”,“deny inbound”,


“Deny … by”

Bytes transferred (large files?) “Teardown TCP connection … duration … bytes …”
Bandwidth and protocol usage “limit … exceeded”,“CPU utilization”
Detected attack activity “attack from”
User account changes “user added”,“user deleted”,


“User priv level changed”

Administrator access “AAA user …”,“User … locked out”,


“login failed”

What to Look for on Web Servers

Excessive access attempts to non-existent files
Code (SQL, HTML) seen as part of the URL
Access to extensions you have not implemented
Web service stopped/started/failed messages
Access to “risky” pages that accept user input
Look at logs on all servers in the load balancer pool
Error code 200 on files that are not yours
Failed user authentication Error code 401, 403
Invalid request Error code 400
Internal server error Error code 500


^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) \[(?<toolName>[^ ]*)\] \[Attack_Name=]*(?<atackName>[^\]]*)\]\, \[Time=]*(?<time2>[^\]]*)\]\, \[Hacker=]*(?<hackerIP>[^\]]*)\]\, \[Victim=]*(?<victimIP>[^\]]*)\]\, \[Protocol=]*(?<protocol>[^\/]*)\/(?<port>[^\]]*)\]\, \[Risk=]*(?<priority>[^\]]*)\]\, \[Handling=]*(?<handling>[^\]]*)\]\, \[Information=]*(?<information>[^\]]*)\]\, \[SrcPort=]*(?<srcPort>[^\]]*)\]$




^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) \[(?<toolName>[^ ]*)\] \[Attack_Name=]*(?<attackName>[^\]]*)\] \[Time=]*(?<time2>[^\]]*)\] \[Src_ip=]*(?<srcIP>[^\]]*)\] \[Dst_ip=]*(?<dstIP>[^\]]*)\] \[Protocol=]*(?<protocol>[^\/]*)\/*(?<port>[^\]]*)\] \[Filter=]*(?<filter>[^\]]*)\] \[Action=]*(?<action>[^\]]*)\] \[Src_port=]*(?<srcPort>[^\]]*)\]



^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) \[(?<toolName>[^ ]*)\] \[Attack_Name=\(\d*\)]*(?<attackName>[^\]]*)\]\, \[Time=]*(?<year>\d{4})\/(?<month>\d{1,2})\/(?<day>\d{1,2})(?<time2>[^\]]*)\]\, \[Hacker=]*(?<hackerIP>[^\]]*)\]\, \[Victim=]*(?<victimIP>[^\]]*)\]\, \[Protocol=]*(?<protocol>[^\/]*)\/(?<port>[^\]]*)\]\, \[Risk=]*(?<priority>[^\]]*)\]\, \[Handling=]*(?<handling>[^\]]*)\]\, \[Information=]*(?<information>[^\]]*)\]\, \[SrcPort=]*(?<srcPort>[^\]]*)\]$



^(?<time>[^ ]* [^ ]* [^ ]*) (?<host>[^ ]*) \[(?<toolName>[^ ]*)\] \[Attack_Name=]*(?<attackName>[^\]]*)\] \[Time=]*(?<year>\d{4})\/(?<month>\d{1,2})\/(?<day>\d{1,2})(?<time2>[^\]]*)\] \[Src_ip=]*(?<srcIP>[^\]]*)\] \[Dst_ip=]*(?<dstIP>[^\]]*)\] \[Protocol=]*(?<protocol>[^\/]*)\/*(?<port>[^\]]*)\] \[Filter=]*(?<filter>[^\]]*)\] \[Action=]*(?<action>[^\]]*)\] \[Src_port=]*(?<srcPort>[^\]]*)\]



^(?<time>[^ ]*)  \[\*\*] [^ ]* (?<messages>[^\[]*)\[\*\*] \[Classification: (?<classification>[^\]]*)\] \[Priority: (?<priority>[^\]]*)] {(?<protocol>[^ ]*)} (?<srcIP>[^:]*):(?<srcPort>[^ ]*) -> (?<dstIP>[^:]*):(?<dstPort>[^ ]*)$

- 수리카타 fast.log 정규식


[Sun Nov 15 08:34:33 2015] [error] [client] request failed: error reading the headers

^\[[^ ]* (?<time>[^\]]*)\] \[(?<level>[^\]]*)\] \[client (?<client_ip>[^\]]*)\] (?<message>.*)$

-apache2 error 정규식


Rsyslog conf 상황에 맞게 필터링 하기







위와 같은 문법을 이용하면 특정 ip를 필터링 할 수 있다.









msg에 들어 있는 값들로 필터링을 하며,


위 로그는 침해사고시 분석할만한 주요 로그들을 분류하여 보았다.







syslogtag을 확인화며 위와 같은 tag일 때 로그를 분류 함

# kill all INTF-FLAP messages...
if $msg contains 'INTF-FLAP' then /dev/null
## Cisco ACS Accounting...
if ($fromhost-ip=='') and ($programname == 'CSCOacs_TACACS_Accounting') then /var/log/tacacs_acct.log
## CiscoACS 5.4 TACACS Authentication
if ($fromhost-ip=='') and ($programname == 'CSCOacs_Passed_Authentications') then /var/log/tacacs_auth.log

# Logging for Chicago issues...
if $fromhost-ip startswith '172.17.25' then /var/log/net/chicago.log
& ~
# Logging for Dallas issues...
if $fromhost-ip startswith '172.17.27' then /var/log/net/dallas.log
& ~
# Logging for firewall...
if $fromhost-ip=='' then @
if $fromhost-ip=='' then /var/log/net/firewall.log


if $fromhost-ip == '' then {
        action(type="omfile" file="/var/log/remotefile02")


if $fromhost-ip startswith '192.0.1.' then /var/log/network1.log
& ~













// rsyslog 커스텀 하는 방법


프로그램 사용법


위 프로그램을 실행 시키고 Text에 303-456-1234를 입력한다.


Req.Expression 에 정규 표현식을 써주고 Apply 해주면된다.





정규 표현식


[0-9]        -> 0부터 9까지의 숫자를 찾아라


[01235]     -> 01235 만 찾는다.


\d            -> 숫자를 잡아줌


\D            -> 숫자 이외의 문자를 잡아줌


.               -> 아무 문자나 찾을 수 있다. (행의 끝에 오는 개행 문자는 제외)


(\d)\d\1  -> (\d)는 첫 번째 숫자를 찾은 후 그 값을 기억 예제에서는 3

                      \d는 다음 숫자를 찾고 기억해두지 않는다 예제에서는 0

                      \1은 기억해둔 숫자를 가리킨다. 예제에서는 3이다.



< 수량자 >  수량자 앞에는 무엇인가 있어야 한다. 없으면 에러남

?                -> ?는 하나 이하라는 뜻  -? 인 경우 하이픈이 한 번 나오거나 안 나온다는 말이다.

 -> 3?는 3이 한번 나오거나 안 나온다는 말

 -> [.-]? 는 .이나 - 이 한 번 이하로


+               -> +는 하나 이상이라는 뜻 -+ 인경우 하이픈이 하나 이상 나와야함

 -> 3+는 3이 한번 이상 나와야함


*               -> *는 0 이상이라는 뜻 -* 인경우

</수량자 >


\d{3}        -> 숫자가 3개 연속으로 붙어 있는거




국내 전화번호




지역 번호는 0으로 시작하고 2~6까지의 숫자로 이뤄지며, 국번은 2~9 사이 숫자로 시작하며 세 자리 혹은 네자리이다.


1. 0으로 시작

2. 2~6 사이가 1개 이상 2개 이하

3. ) 또는 -가 있거나 없거나

4. 2~9사이 1개

5. 0~9사이가 3개 이상 4개 이하

6. 0~9 사이가 4자리



이메일 주소 확인




1. ^문장의 시작부터 $ 끝까지 체크

2. 대소문자 구분 없이 a-z, 0-9, . ,-,_의 1개 이상

3. @

4. 대소문자 구분 없이 a-z, 0-9, . ,-,_의 2글자 이상 63자 이하의 글자가 오며 점(.)은 1개 이상

5. 대소문자 구분 없이 a-z의 2개 이상 4개 이상



IP 주소 체크


( ( 25[0-5] | 2[0-4][0-9] | [01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)


1. 250 ~ 251 또는 200 ~ 249 또는 0 ~ 199 \. 정확히 3번

2. 250 ~ 251 또는 200 ~ 249 또는 0 ~ 199  1번






1. ^문장의 시작부터 $ 끝까지 체크

2. http로 시작하고 s는 있거나 없거나

3. :// 체크

4. zA-Z0-9등 \w에 매칭되는 문자와 -은 1번 이상

5. 점(.)

6. 4,5번의 조합이 1번 이상

7. /이후 \w에 매칭되는 문자와 -./?&%-조합의 0번 이상이 있거나 없거나 => 우분투 ruby 설치 => GEM path 설정





mysql 로 출력을 설정하기 위한 플러그인을 설치합니다.


# td-agent-gem install fluent-plugin-mysql

# td-agent-gem list --local | grep fluent-plugin-mysql

fluent-plugin-mysql (0.0.7)




데이터 베이스와 테이블을 생성합니다. 테스트니 그냥 컬럼 하나만 만듭니다.


# mysql -uroot

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 16
Server version: 5.1.73 Source distribution

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create database application_log;

mysql> use application_log;

mysql> CREATE TABLE `access_log` (
  `text` char(100) DEFAULT NULL,
  PRIMARY KEY (`id`)



이제 td-agent 설정 파일을 생성합니다.



# emacs /etc/td-agent/td-agent.conf 



아파치 로그에서 agent 값을 생성된 컬럼에 넣도록 합니다. 한 라인 전체를 넣을 수도 있습니다. (document 페이지에 가면 입력, 처리, 출력 관련 내용이 있습니다.) 


## read apache logs continuously and tags td.apache.access
  type tail                    # tail 명령어로 소스에서 로그를 가져옴
  format apache2         # 로그 포맷은 apache2
  path /var/log/httpd/access_log  # 로그 파일 위치
  pos_file /var/log/td-agent/apache.pos
  tag apache.access    # 태그 지정

## File output
## match tag=local.** and write to file
<match apache.access>
  type mysql                  # 출력은 mysql
  host localhost             # 호스트는 로컬
  #port 3306                   # 디폴트 3306
  database application_log      # DB명
  username root             # 유저
  #password ""              
  key_names agent         # 로그 추출 필드
  sql INSERT INTO access_log (text) VALUES (?)    # 실행 SQL
  flush_interval 1s          # 실행 간격



이제 기본적인 설정이 모두 끝났습니다. 웹 서버와 fluentd 데몬을 구동합니다.



# /etc/init.d/httpd start

# /etc/init.d/td-agent start



td-agent 구동시 에러가 발생된다면 conf 파일에 잘못 쓴 부분이 있는지 확인합니다.


웹서버에 접근하면 아래와 같이 DB에 로그가 적재되게 됩니다.



이상. fluentd 시작하기 였습니다. ^^

+ Recent posts