ในบทความนี้ เราจะแสดงวิธีเปิดใช้งานการบันทึกล็อก DNS สำหรับคำขอของผู้ใช้ทั้งหมดบนเซิร์ฟเวอร์ DNS ที่รันบน Windows Server วิธีการแยกวิเคราะห์และวิเคราะห์ DNS logs ผมเผชิญกับงานนี้เมื่อต้องยกเลิกโดเมนคอนโทรลเลอร์เก่าในสำนักงานสาขา และจำเป็นต้องทราบว่าอุปกรณ์ใดยังคงใช้ DNS เซิร์ฟเวอร์อยู่ หลังจากเปิดใช้งาน DNS log และวิเคราะห์ พบอุปกรณ์เหล่านั้นและกำหนดค่าใหม่ให้ใช้ DNS เซิร์ฟเวอร์อื่น วิธีนี้ยังช่วยให้คุณพบโฮสต์ที่มีกิจกรรมน่าสงสัยในเครือข่าย Active Directory (การเข้าถึง URL อันตราย โฮสต์ botnet ฯลฯ)
แน่นอน คุณสามารถติดตั้ง Wireshark, Microsoft Network Monitor หรือ pktmon บนโฮสต์ DNS เพื่อจับแพ็กเกจบนพอร์ต 53 แต่การใช้ DNS query logging ในตัวของ Windows Server จะง่ายกว่า
โดยค่าเริ่มต้น การบันทึกล็อก DNS จะถูกปิดใช้งานบน Windows Server เพื่อเปิดใช้งาน:
- เปิดสแนปอิน DNS Manager (
dnsmgmt.msc) และเชื่อมต่อกับเซิร์ฟเวอร์ DNS ที่ต้องการ - เปิดคุณสมบัติของมัน และไปที่แท็บ Debug Logging
- เปิดใช้งานตัวเลือก Log packets for debugging
- จากนั้นคุณสามารถกำหนดค่าตัวเลือกการบันทึกล็อก: เลือกทิศทางแพ็กเกจ DNS, โปรโตคอล (UDP และ/หรือ TCP), ประเภทแพ็กเกจ (คำขอ DNS แบบง่าย, การอัปเดต หรือการแจ้งเตือน)
- โดยใช้ตัวเลือก Filter packets by IP address คุณสามารถระบุที่อยู่ IP เพื่อบันทึกแพ็กเกจเข้า/ออก (ช่วยลดขนาดล็อกได้มาก)
- ในกล่อง Log file path and name ให้ระบุชื่อไฟล์ข้อความที่ต้องการบันทึกเหตุการณ์ทั้งหมด โดยค่าเริ่มต้น ขนาดของ DNS log จะถูกจำกัดที่ 500MB เมื่อถึงขีดจำกัด เหตุการณ์ DNS lookup เก่าจะถูกเขียนทับด้วยเหตุการณ์ใหม่
นอกจากนี้ คุณสามารถเปิดใช้งาน DNS query logging หรือดูการตั้งค่าปัจจุบันด้วย PowerShell:
Get-DnsServerDiagnostics
โปรดทราบว่า บนโฮสต์ Windows DNS ที่มีภาระงานสูง การบันทึกล็อกคำขอ DNS อาจทำให้ CPU, RAM และที่เก็บข้อมูลทำงานหนักขึ้น (ประสิทธิภาพดิสก์ต้องเพียงพอ)
จากนั้นรันคำขอ DNS ต่อเซิร์ฟเวอร์ของคุณจากคอมพิวเตอร์ใดๆ ตัวอย่างเช่น หากที่อยู่ IP ของโฮสต์ DNS ที่รัน Windows Server คือ 192.168.13.10:
nslookup woshub.com 192.168.13.10
หรือลอง resolve ที่อยู่ DNS โดยใช้ PowerShell:
Resolve-DnsName -Name woshub.com -Server 192.168.13.10
คำขอ DNS lookup ส่งคืนที่อยู่ IP ของไคลเอ็นต์ที่ร้องขอโฮสต์
มาตรวจสอบว่าคำขอปรากฏในล็อกเซิร์ฟเวอร์ DNS หรือไม่
ให้ค้นหาไฟล์ล็อกข้อความโดยที่อยู่ IP ของไคลเอ็นต์ (192.168.13.130) คุณสามารถเปิดไฟล์ล็อกใน Notepad หรือ grep ด้วย 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)
ตามที่คุณเห็น คำขอ DNS เพื่อ resolve ชื่อ (8)woshub(2)com(0) ถูกรับ (rcv) จากไคลเอ็นต์ 192.168.13.130 ผ่าน UDP แล้วเซิร์ฟเวอร์ 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
เนื่องจากรูปแบบเฉพาะเจาะจง ทำให้การแยกวิเคราะห์ไฟล์ล็อก DNS แบบด้วยตนเองยาก คุณต้องแปลง DNS query log ให้เป็นรูปแบบที่สะดวกกว่า โดยใช้สคริปต์ Get-DNSDebugLog.ps1
สคริปต์ PowerShell นี้ไม่ใช่ของผม แต่ไม่พร้อมใช้งานใน TechNet Scriptcenter จึงบันทึกไว้ใน GitHub repository: 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 log ให้เป็นรูปแบบที่สะดวกกว่า:
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | format-table
หรือคุณสามารถส่งออกผลลัพธ์เป็นไฟล์ CSV เพื่อวิเคราะห์ต่อใน Excel (หรือเข้าถึงไฟล์ Excel โดยตรงจาก PowerShell และเขียนคำขอ DNS ที่คุณต้องการ)
Get-DNSDebugLog -DNSLog C:\Logs\dc01dns.log | Export-Csv C:\log\ProperlyFormatedDNSLog.csv –NoTypeInformation
คุณสามารถส่งออกไฟล์ไปยัง Excel และใช้วิเคราะห์คำขอ DNS (ไฟล์มีที่อยู่ IP ของโฮสต์และชื่อ DNS ที่พวกเขาขอจากเซิร์ฟเวอร์ DNS ของคุณ)
นอกจากนี้ คุณสามารถใช้ Log Parser 2.2 (https://docs.microsoft.com/en-us/archive/blogs/secadv/parsing-dns-server-log-to-track-active-clients) เพื่อแยกวิเคราะห์และวิเคราะห์ไฟล์ล็อก DNS ตัวอย่างเช่น คำสั่งด้านล่างจะแสดงจำนวนคำขอ DNS จากแต่ละที่อยู่ IP:
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 logs ใน Windows Server 2012 และใหม่กว่า คุณสามารถบันทึกล็อกคำขอ DNS โดยตรงไปยัง Event Viewer (Microsoft-Windows-DNS-Server/Audit) แต่ในความคิดเห็นของผม ไฟล์ล็อก DNS แบบข้อความง่ายต่อการวิเคราะห์กว่า
แน่นอน หากคุณต้องการบันทึกล็อกคำขอ DNS บนเซิร์ฟเวอร์หลายตัว 最好使用专门的解决方案来收集、存储和处理日志, 例如 Splunk, ELK, Graylog 或 Azure Log Analytics
หลังจากเปิดใช้งาน DNS query log และวิเคราะห์แล้ว ผมพบที่อยู่ IP ของอุปกรณ์ที่ยังคงใช้ DNS เซิร์ฟเวอร์ และกำหนดค่าใหม่ให้ใช้ DNS เซิร์ฟเวอร์อื่น หากโดเมนคอนโทรลเลอร์เก่าไม่มีบทบาท FSMO ใดๆ คุณสามารถลบมันได้ (เหตุการณ์ logon ของผู้ใช้ AD ไม่เกี่ยวข้องที่นี่)