Computer >> 컴퓨터 >  >> 시스템 >> Windows Server

Windows Server에서 DNS 쿼리 로깅 활성화 및 로그 파일 분석 완벽 가이드

Windows Server DNS 쿼리 로깅이 필요한 이유

이 글에서는 Windows Server에서 운영 중인 DNS 서버의 모든 사용자 쿼리에 대한 DNS 로깅을 활성화하고, 수집된 DNS 로그를 구문 분석하여 분석하는 방법을 소개합니다. 이 작업을 진행하게 된 계기는 지사의 오래된 Active Directory 도메인 컨트롤러(DC)를 폐기해야 하는데, 어떤 장치들이 아직 해당 DNS 서버를 사용 중인지 파악할 필요가 있었기 때문입니다. DNS 로그를 활성화하고 분석한 결과, 해당 장치들을 찾아 다른 DNS 서버를 사용하도록 재구성할 수 있었습니다.

또한 이 방법은 Active Directory 네트워크에서 의심스러운 활동을 보이는 호스트(악성 URL 접근, 봇넷 감염 호스트 등)를 찾는 데에도 매우 유용하게 활용할 수 있습니다.

물론 Wireshark, Microsoft Network Monitor 또는 pktmon을 DNS 호스트에 설치하여 53번 포트의 트래픽을 캡처하는 방법도 있지만, Windows Server에 내장된 DNS 쿼리 로깅 기능을 사용하는 것이 훨씬 간편합니다.

DNS 디버그 로깅 활성화 방법

기본적으로 Windows Server에서는 DNS 로깅이 비활성화되어 있습니다. 활성화하려면 다음 단계를 따르세요.

  1. DNS 관리자 스냅인(dnsmgmt.msc)을 열고 대상 DNS 서버에 연결합니다.
  2. 서버 속성을 연 후 디버그 로깅(Debug Logging) 탭으로 이동합니다.
  3. 디버깅용 패킷 기록(Log packets for debugging) 옵션을 활성화합니다.
  4. 로깅 옵션을 구성합니다. DNS 패킷 방향, 프로토콜(UDP 및/또는 TCP), 패킷 유형(단순 DNS 쿼리, 업데이트, 알림)을 선택할 수 있습니다.
  5. IP 주소로 패킷 필터링(Filter packets by IP address) 옵션을 사용하면 수신 또는 발신 패킷을 기록할 특정 IP 주소를 지정할 수 있으며, 이를 통해 로그 크기를 크게 줄일 수 있습니다.
  6. 로그 파일 경로 및 이름(Log file path and name) 입력란에 모든 이벤트를 기록할 텍스트 파일의 경로와 이름을 지정합니다. 기본적으로 DNS 로그 크기는 500MB로 제한되며, 한도에 도달하면 오래된 DNS 조회 이벤트부터 새 이벤트로 덮어써집니다.

PowerShell을 사용해서도 DNS 쿼리 로깅을 활성화하거나 현재 설정을 확인할 수 있습니다.

Get-DnsServerDiagnostics

주의할 점은, 부하가 높은 Windows DNS 호스트에서 DNS 쿼리 로깅을 활성화하면 CPU, RAM, 스토리지에 추가 부하가 발생할 수 있다는 것입니다. 따라서 디스크 성능이 충분한지 반드시 확인해야 합니다.

DNS 쿼리 테스트하기

이제 임의의 클라이언트 컴퓨터에서 DNS 서버로 쿼리를 실행해 봅니다. 예를 들어 Windows Server DNS 호스트의 IP 주소가 192.168.13.10이라면 다음과 같이 실행합니다.

nslookup woshub.com 192.168.13.10

또는 PowerShell을 사용하여 DNS 이름을 확인할 수도 있습니다.

Resolve-DnsName -Name woshub.com -Server 192.168.13.10

DNS 조회 쿼리는 요청된 호스트의 클라이언트 IP 주소를 반환합니다.

DNS 서버 로그에서 쿼리 확인하기

테스트 쿼리가 DNS 서버 로그에 정상적으로 기록되었는지 확인해 보겠습니다. 클라이언트 IP 주소(192.168.13.130)로 텍스트 로그 파일을 검색하면 됩니다. 로그 파일은 메모장으로 열어도 되고, PowerShell로 검색할 수도 있습니다.

get-content "C:\Logs\dc01dns.log" | Out-String -Stream | Select-String "192.168.13.130"

다음은 실제 이벤트 예시입니다.

11/17/2021 6:00:00 AM 0D0C PACKET 00000272D98DD0B0 UDP Rcv 192.168.13.130 0002 Q [0001 D NOERROR] A (8)woshub(2)com(0)

위 로그를 해석하면, (8)woshub(2)com(0) 이름 확인을 위한 DNS 쿼리가 클라이언트 192.168.13.130으로부터 UDP를 통해 수신(Rcv)되었고, 이후 DNS 서버가 성공적으로(NOERROR) 응답(Snd)했다는 의미입니다.

각 필드의 의미는 로그 파일 시작 부분에 설명되어 있습니다.

Field # Information Values
------- ----------- ------
1 Date
2 Time
3 Thread ID
4 Context
5 Internal packet identifier
6 UDP/TCP indicator
7 Send/Receive indicator
8 Remote IP
9 Xid (hex)
10 Query/Response R = Response
blank = Query
11 Opcode Q = Standard Query
N = Notify
U = Update
? = Unknown
12 Flags (hex)
13 Flags (char codes) A = Authoritative Answer
T = Truncated Response
D = Recursion Desired
R = Recursion Available
14 ResponseCode
15 Question Type
16 Question Name

Get-DNSDebugLog.ps1 스크립트로 로그 변환하기

DNS 로그 파일은 고유한 형식으로 기록되기 때문에 수동으로 구문 분석하고 분석하기가 어렵습니다. 따라서 Get-DNSDebugLog.ps1 스크립트를 사용하여 DNS 쿼리 로그를 더 편리한 형식으로 변환하는 것이 좋습니다.

이 PowerShell 스크립트는 원 저작자가 만든 것이지만, 현재 TechNet Scriptcenter에서 더 이상 제공되지 않아 GitHub 저장소에 보관되어 있습니다. https://github.com/maxbakhub/winposh/blob/main/Get-DNSDebugLog.ps1 에서 다운로드할 수 있습니다.

파일을 디스크에 다운로드한 후, 현재 콘솔 세션에서 PowerShell 스크립트 실행을 허용합니다.

Set-ExecutionPolicy -Scope Process Unrestricted

Get-DNSDebugLog.ps1의 함수를 현재 세션으로 가져옵니다.

. C:\ps\Get-DNSDebugLog.ps1

그런 다음 DNS 로그를 보기 편한 형식으로 변환합니다.

Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | format-table

또는 결과를 CSV 파일로 내보내 Excel에서 추가 분석을 수행할 수도 있습니다. 물론 PowerShell에서 Excel 파일에 직접 접근하여 원하는 DNS 쿼리 데이터를 작성하는 방법도 가능합니다.

Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | Export-Csv C:\log\ProperlyFormatedDNSLog.csv –NoTypeInformation

CSV 파일을 Excel로 내보내면 호스트 IP 주소와 해당 호스트가 DNS 서버에 요청한 DNS 이름 목록을 바탕으로 체계적인 분석이 가능합니다.

Log Parser 2.2를 활용한 로그 분석

Log Parser 2.2를 사용해서도 DNS 로그 파일을 구문 분석하고 분석할 수 있습니다. 예를 들어 아래 명령은 IP 주소별 DNS 쿼리 수를 집계하여 표시합니다.

LogParser.exe -i:TSV -nskiplines:30 -headerRow:off -iSeparator:space -nSep:1 -fixedSep:off -rtp:-1 "SELECT field9 AS IP, REVERSEDNS(IP) AS Name, count(IP) as QueryCount FROM "C:\Logs\dc01dns.log" WHERE field11 = 'Q' GROUP BY IP ORDER BY QueryCount DESC"

대규모 환경에서의 로그 수집 방안

위 예제에서는 텍스트 파일을 사용하여 DNS 로그를 수집했습니다. Windows Server 2012 이상 버전에서는 DNS 쿼리를 이벤트 뷰어(Microsoft-Windows-DNS-Server/Audit)에 직접 기록할 수도 있습니다. 하지만 필자의 경험상 텍스트 형태의 DNS 로그가 분석하기 훨씬 수월합니다.

여러 서버에서 DNS 쿼리를 기록해야 하는 환경이라면, Splunk, ELK(Elasticsearch, Logstash, Kibana), Graylog 또는 Azure Log Analytics처럼 로그를 수집·저장·처리하는 전문 솔루션을 사용하는 것이 바람직합니다.

마무리

DNS 쿼리 로그를 활성화하고 분석한 결과, 여전히 해당 DNS 서버를 사용 중이던 장치들의 IP 주소를 모두 찾아낼 수 있었고, 이를 다른 DNS 서버를 사용하도록 재구성했습니다. 참고로 기존 DC에 FSMO 역할이 없다면 안전하게 제거할 수 있습니다(AD 사용자 로그온 이벤트는 이 작업과 무관합니다).