DNS 로그분석(현황분석/이상징후)

현황분석

- 현재 발생하는 상황을 파악하는 작업

- 우리 망에서 이런 일이 있었구나

- 무조건 문제가 있는 것은 아님

- 우리 직원들은 어느 사이트에 많이 접속하는구나를 파악

 

이상징후

- 평균적인 상황을 파악하다가 이상징후가 포착이 되면 관리자/침해대응팀에게 알림

- 현황분석을 해서 문제가 없을 수도 있고, 그중 이상징후를 탐지할 수도 있음


DNS Log 환경구성

=> ZeekIDS는 우리망에 떠돌아다니는 네트워크 로그들을 수집하여 저장, 이것을 중앙관제에 scp를 사용하여 넘겨줌

시나리오 : Zeek을 통해 DNS Log를 압축하여 중앙관제서버에게 넘겨줍니다. 중앙관제서버 입장에서는 sample_log/dns/dns.zip을 넘겨받은 것입니다. 중앙관제서버는 Splunk에 해당 로그를 로딩합니다.(splunk에 로그 저장소에 로그 저장) 네트워크 로그는 타입이 다 다른데, 그 로그들의 필드명을 메뉴얼하게 지정합니다. (당연히 자동도 가능, 실습에서는 수동) 마지막으로 URL Toolbox를 사용!

 

URL Toolbox : 도메인명을 쉽게 잘라낼 수 있도록 도와주는 도구

www.test.co.kr에서 www는 호스트명, test는 도메인명(회사, 학교 등 이름), co는 회사의 특성/성격, kr은 국가 


0. splunk 접속 및 설정

1) splunk 접속 : http://127.0.0.1:8000 또는 http://localhost:8000

 

2) 설정-시스템-서버설정-일반설정으로 이동

=> Splunk 서버 이름 : 보통 컴퓨터 이름

=> ★설치경로 : C:\Program Files\Splunk

=> 관리포트 : splunk 웹서버 상에서 접속할 때 사용하는 포트

=> 웹포트 : 8000번 사용

=> Session timeout : 1시간으로 설정. 일정시간 동안 작업이 진행되지 않으면 자동 로그아웃

=> 인덱스 설정 : splunk에서 인덱스는 업로드 되는 로그들의 저장소

=> ★인덱스 저장소 : C:\Program Files\Splunk\var\lib\splunk

인덱스 저장소

어떤 로그를 저장시키면 이 인덱스 저장소에 저장됨. 업로드된 로그들은 업로드 될 때 정규화 시키기 때문에 텍스트 형태가 아님

 

3) 설정-데이터-인덱스로 이동

여기서는 저장소 주소들을 확인 가능함

$SPLUNK_DB = C:\Program Files\Splunk\var\lib\splunk(인덱스저장소)


1. Index 만들기

1) 인덱스 만들기 

=> 인덱스 이름 : dnslog

 

=> dnslog 폴더가 생성된 것을 확인할 수 있음

 

2) sample_logs.zip 압축해제

압축해제 후 dns폴더 내 dns.zip을 보면 3개의 파일이 있습니다.

=> zeek이 수집하여 보낸 dns 로그

=> ★데이터 추가시 dns.zip 상태로 업로드해야함

=> dns.zip 압축해제 안해도 됨(구성이 어떻게 생겼나 확인하려고 푼 것)

 

[dns_0701 파일 내에서 로그 확인]

1561939266.215684 CJhW1t4HAaCozpVxN5 172.16.138.48  60192  8.8.4.4  53 udp

21676 - teredo.ipv6.microsoft.com 1  C_INTERNET  1  A  3  NXDOMAIN  F  F  T  F  0  -  -  F

 

[로그 설명]

ts(시간,유닉스타임)

Uid(로그ID)

Id_orig_h, Id_orig_p, Id.resp_h, Id.resp_p, Protocol(송신지 IP/Port번호, 수신지 IP/Port번호,  사용 프로토콜)

=> 이 부분은 4계층 헤더 보고 확인 가능(ip, tcp, udp 헤더)

 

trans_id(질의에 대한 쿼리 번호)

rtt(응답시간) : 질의에서 응답까지 오는 시간! 응답이 안오는 경우 '-' 표시

query(도메인 질의 내용)

qclass, sclass_name(질의클래스, 이름) : 질의에 대한 분류번호

qtype, qtype_name(질의형식, 이름)

=> 이 부분은 DNS query header 보고 확인 가능

 

rcode, rcode_name(답변코드, 이름) => DNS 포스팅에 자세한 설명있음

AA, TC, RD, RA, Z, Answers, TTLs, Reject

(서버 답변여부, 응답이 잘렸는지 여부, 반복적 요청 및 가능 여부,  예약여부, 답변내역, 도메인 TTL 값, 거부판단)

=> 이 부분은 DNS response header 보고 확인 가능

 

[정상쿼리]

1561939409.236962 CY0D8z3sQ5NUH1Uh95 172.16.138.48 57679 8.8.4.4 53 udp 11391 0.038607 gms.ahnlab.com

1 C_INTERNET 1 A 0 NOERROR F  F  T  T  0  gms.wip.ahnlab.com,211.115.106.75  167.000000,24.000000  F

=> rtt : rtt가 있다는 것은 질의에 대한 응답이 왔다는 의미

=> query : 도메인 질의 내용

=> rcode, rcode_name : 응답에 대해 문제가 없음

=> Answers : DNS 서버에서 반환한 응답내용

=> TTLs : 질의 답변을 저장하는 캐시보관기간


2. Source Type 지정

1) 설정-데이터-SourceType으로 이동하여 Source Type 만들기

# 쉼표로 구분된 필드이름
ts,uid,src,spt,dst,dpt,proto,trans_id,rtt,domain,qclass,qclass_name,qtype,qtype_name,rcode,rcode_name,AA,TC,RD,RA,Z,answers,TTLs,rejected

=> zeek에서 보낸 DNS 로그들의 필드명


3. 데이터 추가

1) 설정-데이터 추가로 이동

 

2) 원본 선택

 

3) 입력 설정

=> 위에서 만든 Source typle 선택

 

4) 검토 후 제출

=> 제출과 동시에 정규화작업이 진행됨

 

5) 검색 시작

=> 왼쪽에 실제 dns 필드명이 나타남

=> 그런데 위에서 정의한 dns 필드명보다 많음. 그것들은 splunk 자체에서 자동으로 인식한 필드들!


4. URL Toolbox 설치

=> DNS 도메인명 분석시 작업을 편하게 할 수 있음

 

1) splunk 메인에서 톱니바퀴 클릭

 

2) 파일에서 앱 설치 클릭

 

3) URL Toolbox 파일 업로드

 

4) 설치 확인

 

5) 표시 여부 Yes로 변경

 

6) 메인화면에서 설치 확인


 

[참고]

Query Type
Query Class