Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

คุณสามารถใช้การตรวจสอบเหตุการณ์การเข้าถึงวัตถุระบบไฟล์ (file system object access event auditing) เพื่อระบุผู้ใช้เฉพาะที่สร้าง ลบ หรือแก้ไขไฟล์เฉพาะ ในบทความนี้ เราจะแสดงวิธีกำหนดค่าการตรวจสอบเหตุการณ์สำหรับไฟล์บนโฟลเดอร์เครือข่ายแชร์บน Windows Server 2016 หลังจากกำหนดค่าการตรวจสอบแล้ว คุณสามารถใช้ข้อมูลจาก Event Viewer เพื่อหาผู้ใช้ที่ลบไฟล์เฉพาะบนไฟล์เซิร์ฟเวอร์

เมื่อคุณลบไฟล์จากโฟลเดอร์เครือข่ายแชร์ มันจะถูกลบทันทีแทนที่จะถูกส่งไปยังถังขยะของผู้ใช้ รายการไฟล์ที่เปิดอยู่บนโฟลเดอร์แชร์สามารถรับได้ดังนี้

วิธีเปิดใช้งานนโยบายการตรวจสอบการเข้าถึงไฟล์และโฟลเดอร์บน Windows

ตามค่าเริ่มต้น การตรวจสอบการเข้าถึงวัตถุระบบไฟล์ (File System Object Access audit) ไม่ได้เปิดใช้งานบน Windows Server คุณสามารถเปิดใช้งานและกำหนดค่าการตรวจสอบโดยใช้ Group Policy หากคุณต้องการเปิดใช้งานนโยบายการตรวจสอบบนเซิร์ฟเวอร์หรือคอมพิวเตอร์หลายเครื่อง คุณสามารถใช้ Domain GPOs (可配置ได้โดยใช้คอนโซล MMC gpmc.msc) หากคุณต้องการกำหนดค่าการตรวจสอบบนเซิร์ฟเวอร์เพียงเครื่องเดียว คุณสามารถใช้ Local Group Policy Editor

  1. เปิดคอนโซล Local Group Policy Editor – gpedit.msc;
  2. ไปที่ส่วน GPO ที่มีนโยบายการตรวจสอบขั้นสูง: Windows Settings -> Security Settings -> Advanced Audit Policy Configuration -> Object Access;
  3. เปิดโพลิซี Audit File System และระบุว่าคุณต้องการบันทึกเฉพาะเหตุการณ์การเข้าถึงที่สำเร็จไปยังวัตถุระบบไฟล์ (Configure the following audit events -> Success); คุณยังสามารถเปิดใช้งานการตรวจสอบการเข้าถึงวัตถุท้องถิ่นโดยใช้โพลิซี Audit Object Access ภายใต้ Windows Settings -> Security Settings -> Local Policy -> Audit Policy อย่างไรก็ตาม การใช้โพลิซี File System Audit ถือว่าดีกว่าเพราะมันติดตามเฉพาะเหตุการณ์การเข้าถึง NTFS วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy
  4. บันทึกการเปลี่ยนแปลงและอัปเดตการตั้งค่า Local Group Policy โดยใช้คำสั่ง: gpupdate /force.

การกำหนดค่าการตรวจสอบการลบไฟล์บนโฟลเดอร์แชร์

ตอนนี้คุณต้องกำหนดค่าการตรวจสอบในคุณสมบัติของโฟลเดอร์เครือข่ายแชร์ที่คุณต้องการติดตามการเข้าถึง เปิด File Explorer และเปิดคุณสมบัติของโฟลเดอร์ ไปที่แท็บ Security คลิกปุ่ม Advanced -> ไปที่แท็บ Auditing

หากมีข้อความ "You must be an administrator or have been given the appropriate privileges to view the audit properties of this object" ปรากฏขึ้น ให้คลิกปุ่ม Continue

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

จากนั้นคลิกปุ่ม Add เพื่อระบุผู้ใช้หรือกลุ่มที่คุณต้องการบันทึกเหตุการณ์การตรวจสอบ หากคุณต้องการติดตามเหตุการณ์การเข้าถึงสำหรับผู้ใช้ทุกคน ให้ระบุกลุ่ม Everyone

จากนั้นคุณต้องระบุว่าสิทธิ์ใดที่ใช้ในการเข้าถึงวัตถุควรถูกล็อก เพื่อบันทึกเฉพาะเหตุการณ์การลบไฟล์ใน Event Log ให้คลิกปุ่ม Show advanced permissions ในรายการเหตุการณ์ ให้เหลือการตรวจสอบเฉพาะเหตุการณ์การลบโฟลเดอร์และไฟล์ – Delete และ Delete subfolders and files

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

เคล็ดลับ จำไว้ว่านโยบายการตรวจสอบสำหรับวัตถุ Windows ต้องการทรัพยากรการคำนวณเพิ่มเติม ใช้ด้วยความระมัดระวัง พยายามลดจำนวนวัตถุและเหตุการณ์การตรวจสอบที่จะบันทึกให้น้อยที่สุด

$Path = "E:\Public"
$AuditChangesRules = New-Object System.Security.AccessControl.FileSystemAuditRule('Everyone', 'Delete,DeleteSubdirectoriesAndFiles', 'none', 'none', 'Success')
$Acl = Get-Acl -Path $Path
$Acl.AddAuditRule($AuditChangesRules)
Set-Acl -Path $Path -AclObject $Acl

ตอนนี้ หากผู้ใช้ลบไฟล์หรือโฟลเดอร์ใดๆ ในโฟลเดอร์เครือข่ายแชร์ เหตุการณ์ File System -> Audit Success file delete จะปรากฏใน Security Log พร้อม Event ID 4663 จากแหล่ง Microsoft Windows security auditing

เปิดคอนโซล MMC Event Viewer (eventvwr.msc) ขยายส่วน Windows Logs -> Security เปิดใช้งานตัวกรอง Event Log โดย EventID 4663

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

เปิดเหตุการณ์ที่เหลือใน Event Viewer ใดๆ ดังที่คุณเห็น มันมีข้อมูลเกี่ยวกับชื่อไฟล์ที่ถูกลบ บัญชีของผู้ใช้ที่ลบไฟล์ และชื่อกระบวนการ

An attempt was made to access an object. Subject:Security ID: CORP\jsmith Account Name: jsmith Account Domain: CORP Logon ID: 0x32B12627 Object:Object Server: Security Object Type: File Object Name: E:\Distr\Backup.rar Handle ID: 0x7bc4 Resource Attributes: S:AI Process Information: Process ID: 0x4 Process Name: Access Request Information: Accesses: DELETE Access Mask: 0x10000

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

หลังจากเปิดใช้งานนโยบายการตรวจสอบการเข้าถึงไฟล์ คุณสามารถค้นหาใน Security Log ได้:

  • ใครลบไฟล์จากโฟลเดอร์เครือข่ายแชร์และเมื่อเกิดขึ้น;
  • แอปพลิเคชัน (กระบวนการ) ใดที่ถูกใช้เพื่อลบไฟล์;
  • วันที่ของการสำรองข้อมูลที่จะกู้คืน

วิธีเขียนเหตุการณ์การลบไฟล์ลงฐานข้อมูล SQL (MySQL/MSSQL)

อย่างไรก็ตาม แม้การตรวจสอบการลบไฟล์จะเปิดใช้งานแล้ว การค้นหาบางอย่างในล็อกอาจเป็นเรื่องยุ่งยาก ขั้นแรก การค้นหารายการเฉพาะเจาะจงระหว่างหลายพันเหตุการณ์เป็นเรื่องค่อนข้างยาก (ใน Windows ไม่มีเครื่องมือที่สะดวกสำหรับการค้นหาเหตุการณ์ด้วยตัวกรองที่ยืดหยุ่น) สอง หากไฟล์ถูกลบไปแล้วไม่กี่วัน 事件นี้อาจไม่มีในล็อก เนื่องจากถูกเขียนทับโดยเหตุการณ์ใหม่

คุณสามารถบันทึกเหตุการณ์การลบไฟล์ทั้งหมดลงในฐานข้อมูล SQL ได้ คุณสามารถใช้ฐานข้อมูล Microsoft SQL Server, Elasticsearch, หรือ MySQL/MariaDB เพื่อจัดเก็บเหตุการณ์ของคุณ

ในตัวอย่างนี้ เราจะแสดงวิธีการบันทึกเหตุการณ์การตรวจสอบลงในตารางแยกบน MySQL ผมจะใช้รูปแบบตารางดังนี้:

  • ชื่อเซิร์ฟเวอร์;
  • ชื่อไฟล์ที่ถูกลบ;
  • วันที่และเวลา;
  • ชื่อผู้ใช้ที่ลบไฟล์

คำสั่ง MySQL Query สำหรับสร้างตารางนี้มีลักษณะดังนี้:

CREATE TABLE deleted_items (id INT NOT NULL AUTO_INCREMENT, server VARCHAR(100), file_name VARCHAR(255), dt_time DATETIME, user_name VARCHAR(100), PRIMARY KEY (ID));

หมายเหตุ ตัวอย่างวิธีเข้าถึงฐานข้อมูล MySQL จาก PowerShell ได้รับการพิจารณาไว้ก่อนหน้านี้ในบทความ Querying MySQL Database with PowerShell

หากคุณต้องการใช้ฐานข้อมูล Microsoft SQL Server โปรดดูบทความ "How to run a MSSQL Server Query from PowerShell?"

เพื่อรับเหตุการณ์ที่มี EventID 4663 จาก Security Log สำหรับวันนี้ คุณสามารถใช้สคริปต์ PowerShell ต่อไปนี้:

$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
}
}

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

สคริปต์ PowerShell ถัดไปจะเขียนข้อมูลที่คุณได้รับลงในฐานข้อมูล MySQL บนเซิร์ฟเวอร์ระยะไกล (ที่มีที่อยู่ IP 10.1.1.13):

Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$sql = New-Object MySql.Data.MySqlClient.MySqlCommand
$sql.Connection = $Connection
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$File = $File.Replace('\','|')
$User = $event.Event.EventData.Data[1]."#text"
$Computer = $event.Event.System.computer
$sql.CommandText = "INSERT INTO deleted_items (server,file_name,dt_time,user_name ) VALUES ('$Computer','$File','$Time','$User')"
$sql.ExecuteNonQuery()
}
}
$Reader.Close()
$Connection.Close()

หลังจากบันทึกเหตุการณ์ลงในฐานข้อมูลภายนอก Event Log นี้สามารถล้างได้

ตอนนี้ เพื่อค้นหาว่าใครลบไฟล์ "AnnualReport.DOC" เพียงพอที่จะรันสคริปต์ต่อไปนี้ในคอนโซล PowerShell:
$DeletedFile = "%AnnualReport.DOC%"
Set-ExecutionPolicy RemoteSigned
Add-Type –Path 'C:\Program Files (x86)\MySQL\MySQL Connector Net 6.9.8\Assemblies\v4.5\MySql.Data.dll'
$Connection = [MySql.Data.MySqlClient.MySqlConnection]@{ConnectionString='server=10.1.1.13;uid=posh;pwd=P@ssw0rd;database=aduser'}
$Connection.Open()
$MYSQLCommand = New-Object MySql.Data.MySqlClient.MySqlCommand
$MYSQLDataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter
$MYSQLDataSet = New-Object System.Data.DataSet
$MYSQLCommand.Connection=$Connection
$MYSQLCommand.CommandText="SELECT user_name,dt_time from deleted_items where file_name LIKE '$DeletedFile'"
$MYSQLDataAdapter.SelectCommand=$MYSQLCommand
$NumberOfDataSets=$MYSQLDataAdapter.Fill($MYSQLDataSet, "data")
foreach($DataSet in $MYSQLDataSet.tables[0])
{
write-host "User:" $DataSet.user_name "at:" $DataSet.dt_time
}
$Connection.Close()

ตอนนี้คุณสามารถดูชื่อผู้ใช้และเวลาที่ไฟล์ถูกลบในคอนโซล PS ได้

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

หมายเหตุ เนื่องจากพบปัญหาที่สัญลักษณ์ "\" ไม่ถูกเขียนลงฐานข้อมูล เราจึงแทนที่ด้วย "|" ดังนั้น หากคุณต้องแสดงพาธเต็มไปยังไฟล์ คุณสามารถแทนที่ย้อนกลับเมื่อเลือกจากฐานข้อมูล:

$DataSet.file_name.Replace('|','\').

สคริปต์การเขียนข้อมูลจาก Event Log ลงในฐานข้อมูลสามารถรันได้ที่สิ้นวันโดยใช้ Task Scheduler หรือผูกกับ EventID การลบไฟล์ (On Event) ซึ่งใช้ทรัพยากรมากกว่า ขึ้นอยู่กับข้อกำหนดของระบบ

เคล็ดลับ ตรวจสอบให้แน่ใจว่าคุณตั้งค่าขนาดสูงสุดของไฟล์ Security Event Log ให้ใหญ่พอเพื่อบันทึกเหตุการณ์ทั้งหมดในวัน มิฉะนั้น คุณจะต้องรันงานส่งออกข้อมูลไปยังฐานข้อมูลบ่อยกว่าวันละครั้ง หรือแม้แต่บนทริกเกอร์ โดยทั่วไป Maximum Log Size บนเวิร์กสเตชันต้องมีขนาดอย่างน้อย 64 MB และ 262 MB บน Windows File Servers ตัวเลือกการเขียนทับเหตุการณ์เก่าควรทิ้งไว้เปิดใช้งาน (Overwrite events as needed)

หากจำเป็น คุณสามารถสร้างหน้าเว็บ PHP เรียบง่ายเพื่อรับข้อมูลเกี่ยวกับผู้ใช้ที่ลบไฟล์ในรูปแบบที่สะดวกกว่า

เคล็ดลับสำคัญ หากล็อกมีรายการว่าไฟล์ถูกลบโดยผู้ใช้ อย่ารีบตีความว่าเป็นการกระทำعمدةใจหรือร้ายแรง โปรแกรมหลายตัว (โดยเฉพาะแอป MS Office) สร้างไฟล์ชั่วคราวเมื่อบันทึกการเปลี่ยนแปลงแล้วลบเวอร์ชันเก่าของไฟล์ ในกรณีนี้ ให้เปิดใช้งานการบันทึกชื่อกระบวนการ (ProcessName field) ที่ลบไฟล์ และคุณสามารถแยกวิเคราะห์เหตุการณ์การลบไฟล์จากมันได้ หรือคุณสามารถกรองเหตุการณ์จากกระบวนการดังกล่าว เช่น winword.exe, excel.exe ฯลฯ

การบันทึกเหตุการณ์การตรวจสอบการลบไฟล์ลงในไฟล์ข้อความ

หากคุณไม่ต้องการใช้เซิร์ฟเวอร์ฐานข้อมูลแยก คุณสามารถบันทึกเหตุการณ์การตรวจสอบการลบไฟล์ลงในไฟล์ล็อกข้อความธรรมดาได้ ใช้สคริปต์ PowerShell นี้เพื่อบันทึกผลลัพธ์ของคุณลงในไฟล์ข้อความ:

$Outfile = "C:\Logs\Deleted-file-history-log.txt"
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | Foreach {
$event = [xml]$_.ToXml()
if($event)
{
$Time = Get-Date $_.TimeCreated -UFormat "%Y-%m-%d %H:%M:%S"
$File = $event.Event.EventData.Data[6]."#text"
$User = $event.Event.EventData.Data[1]."#text"
$strLog = $Computer + " " + $File + " " + $Time + " " + $User
$strLog | out-file $Outfile –append
}
}

วิธีตรวจสอบว่าใครลบไฟล์บน Windows Server ด้วย Audit Policy

ดังนั้น เราได้เสนอไอเดียและโมเดลทั่วไปของระบบเพื่อตรวจสอบและจัดเก็บข้อมูลเกี่ยวกับไฟล์ที่ถูกลบในโฟลเดอร์เครือข่ายแชร์ หากจำเป็น สามารถปรับเปลี่ยนได้ง่ายเพื่อตอบสนองความต้องการของคุณ