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

- บันทึกการเปลี่ยนแปลงและอัปเดตการตั้งค่า 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

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

เคล็ดลับ จำไว้ว่านโยบายการตรวจสอบสำหรับวัตถุ 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

เปิดเหตุการณ์ที่เหลือใน 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

หลังจากเปิดใช้งานนโยบายการตรวจสอบการเข้าถึงไฟล์ คุณสามารถค้นหาใน 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
}
}

สคริปต์ 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 ได้

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

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