ফাইল সিস্টেম অবজেক্ট অ্যাক্সেস ইভেন্ট অডিটিং ব্যবহার করে নির্দিষ্ট ইউজার কে একটি নির্দিষ্ট ফাইল তৈরি, ডিলিট বা মডিফাই করেছে সেটা চিহ্নিত করা যায়। এই আর্টিকেলে আমরা দেখাব কীভাবে Windows Server 2016-এ শেয়ার্ড নেটওয়ার্ক ফোল্ডারে ফাইলের জন্য ইভেন্ট অডিটিং কনফিগার করতে হয়। অডিটিং কনফিগার করার পর Event Viewer-এর তথ্য ব্যবহার করে ফাইল সার্ভারে কে নির্দিষ্ট ফাইল ডিলিট করেছে সেটা খুঁজে বের করা যায়।
শেয়ার্ড নেটওয়ার্ক ফোল্ডার থেকে ফাইল ডিলিট করলে সেটি ইউজারের রিসাইকেল বিনে যাওয়ার বদলে সাথে সাথে ডিলিট হয়ে যায়। শেয়ার ফোল্ডারে খোলা ফাইলগুলোর তালিকা নিচের şekilde পাওয়া যায়।
Windows-এ ফাইল ও ফোল্ডার অ্যাক্সেস অডিটিং পলিসি কীভাবে সক্ষম করবেন?
ডিফল্টভাবে Windows Server-এ File System Object Access অডিট সক্ষম থাকে না। গ্রুপ পলিসি ব্যবহার করে অডিট সেটিংস সক্ষম ও কনফিগার করা যায়। একাধিক সার্ভার বা কম্পিউটারে অডিট পলিসি সক্ষম করতে হলে ডোমেন GPO ব্যবহার করুন (যা gpmc.msc MMC কনসোল দিয়ে কনফিগার করা হয়)। শুধু একটি সার্ভারে অডিট কনফিগার করতে চাইলে Local Group Policy Editor ব্যবহার করুন।
- Local Group Policy Editor কনসোল খুলুন –
gpedit.msc; - Advanced audit policies সেকশনে যান: 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 অ্যাক্সেস ইভেন্ট ট্র্যাক করে।

- পরিবর্তনগুলো সংরক্ষণ করুন এবং লোকাল গ্রুপ পলিসি আপডেট করুন:
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 অবজেক্টের জন্য অডিটিং পলিসি অতিরিক্ত কম্পিউটিং রিসোর্স নেয়। সেটি সতর্কতার সাথে ব্যবহার করুন, সবসময় অডিট অবজেক্ট এবং ইভেন্টের সংখ্যা কমাতে চেষ্টা করুন।
PowerShell দিয়ে অডিট রুল সেট করার উদাহরণ:
$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 ফাইল ডিলিট ইভেন্ট Security লগে Event ID 4663 দিয়ে Microsoft Windows security auditing সোর্স থেকে আসবে।
Event Viewer MMC কনসোল (eventvwr.msc) খুলুন, Windows Logs → Security সেকশন এক্সপ্যান্ড করুন। 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 লগে আপনি পাবেন:
- শেয়ার্ড নেটওয়ার্ক ফোল্ডার থেকে কে ফাইল ডিলিট করেছে এবং কখন;
- কোন অ্যাপ্লিকেশন (প্রসেস) ব্যবহার করে ফাইল ডিলিট করা হয়েছে;
- ব্যাকআপ রিস্টোর করার জন্য কোন তারিখের ব্যাকআপ লাগবে।
ফাইল ডিলিশন ইভেন্ট SQL ডেটাবেসে (MySQL/MSSQL) কীভাবে লিখবেন?
তবে, ডিলিট হওয়া ফাইলগুলোর অডিট সক্ষম থাকলেও লগ থেকে কিছু খুঁজে বের করা কষ্টকর। প্রথমত, হাজার হাজার ইভেন্টের মাঝ থেকে একটি নির্দিষ্ট এন্ট্রি খুঁজে বের করা কঠিন (Windows-এ ফ্লেক্সিবল ফিল্টারের সাথে ইভেন্ট সার্চ করার সুবিধাজনক টুল নেই)। দ্বিতীয়ত, যদি ফাইল অনেক আগে ডিলিট হয়ে থাকে, তবে সেই ইভেন্ট লগে নাও থাকতে পারে, কারণ নতুন ইভেন্টগুলোর দ্বারা ওভাররাইট হয়ে গেছে।
সব ফাইল ডিলিট ইভেন্ট SQL ডেটাবেসে সংরক্ষণ করা যায়। Microsoft SQL Server, Elasticsearch, বা MySQL/MariaDB ডেটাবেস ব্যবহার করা যায় ইভেন্ট সংরক্ষণের জন্য।
এই উদাহরণে আমরা দেখাব কীভাবে অডিট ইভেন্টগুলো একটি আলাদা ডেটাবেস টেবিলে MySQL-এ লগ করা যায়। আমি নিচের টেবিল ফরম্যাট ব্যবহার করব:
- সার্ভার নাম;
- ডিলিট হওয়া ফাইলের নাম;
- তারিখ এবং সময়;
- ফাইল ডিলিট করা ইউজারের নাম।
এই টেবিল তৈরির MySQL কুয়েরি:
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));
নোট: PowerShell থেকে MySQL ডেটাবেস এক্সেস করার উদাহরণ আগে "Querying MySQL Database with PowerShell" আর্টিকেলে আলোচনা করা হয়েছিল।
Microsoft SQL Server ডেটাবেস ব্যবহার করতে চাইলে "How to run a MSSQL Server Query from PowerShell?" আর্টিকেলটি দেখুন।
Security লগ থেকে বর্তমান দিনের EventID 4663 ইভেন্টগুলো পেতে নিচের PowerShell স্ক্রিপ্ট ব্যবহার করুন:
$today = get-date -DisplayHint date -UFormat %Y-%m-%d
Get-WinEvent -FilterHashTable @{LogName="Security";starttime="$today";id=4663} | ForEach-Object {
$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 স্ক্রিপ্টটি রিমোট সার্ভারে (IP 10.1.1.13) MySQL ডেটাবেসে ডেটা লিখবে:
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-Object {
$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()
ইভেন্ট লগ ডেটাবেসে সংরক্ষণ হলে এই ইভেন্ট লগ ক্লিয়ার করা যায়।
এখন "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 ইভেন্ট লগ ফাইলের ম্যাক্সিমাম সাইজ যথেষ্ট বড় রাখুন যাতে পুরো দিনের ইভেন্ট লগ হয়। অন্যথায় ডেটাবেসে এক্সপোর্ট করার টাস্ক দিনে একবার চেলেও হবে না, আরও ঘন ঘন বা ট্রিগার বেসড চালাতে হতে পারে। সাধারণত ওয়ার্কস্টেশনে Maximum Log Size কমপক্ষে 64 MB, এবং Windows File সার্ভারে 262 MB রাখা উচিত। পুরানো ইভেন্ট ওভাররাইট করার অপশন সক্রিয় রাখুন (Overwrite events as needed)।
প্রয়োজনে একটি সিম্পল PHP ওয়েব পেজ তৈরি করা যায় যেটি ডিলিট করা ফাইলগুলোর ইউজার ইনফরমেশন আরও সুবিধাজনক ফরম্যাটে দেখাবে।
গুরুত্বপূর্ণ টিপ: যদি লগে এন্ট্রি থাকে যে ইউজার ফাইলটি ডিলিট করেছে, তবে তা যেন যেন ইচ্ছাকৃত বা ম্যালিশিয়াস অ্যাকশন হিসেবে ইন্টারপ্রেট করবেন না। অনেক প্রোগ্রাম (বিশেষ করে MS Office অ্যাপস) পরিবর্তন সেভ করার সময় টেম্পোরারি ফাইল তৈরি করে এবং পরে ফাইলের পুরানো ভার্সন ডিলিট করে। এই কেসে প্রসেস নাম (ProcessName ফিল্ড) লগিং সক্রিয় করুন যেটি থেকে ফাইল ডিলিট হয়েছে, এবং সেটি বেসড করে ফাইল ডিলিশন ইভেন্ট পার্স করুন। বা 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-Object {
$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
}
}

এভাবে আমরা শেয়ার্ড নেটওয়ার্ক ফোল্ডারে ডিলিট হওয়া ফাইলগুলোর অডিট এবং ইনফরমেশন সংরক্ষণ করার সিস্টেমের আইডিয়া এবং জেনারেল মডেল দিয়েছি। প্রয়োজনে আপনার রিকোয়ারমেন্ট অনুযায়ী এটা সহজে মডিফাই করা যায়।